[toc]
反弹shell
1.文件描述符
linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作。
三个默认的文件描述符
- 标准输入:standard input 0 (默认设备键盘)
- 标准输出:standard output 1(默认设备显示器)
- 错误输出:error output 2 (默认设备显示器)
- 注意:
(1)以后再打开文件,描述符可以依次增加
(2)一条shell命令,都会继承其父进程的文件描述符,因此所有的shell命令,都会默认有三个文件描述符。
(3) 文件所有输入输出都是由该进程所有打开的文件描述符控制的。(Linux一切皆文件,就连键盘显示器设备都是文件,因此他们的输入输出也是由文件描述符控制)
(4) 一条命令执行以前先会按照默认的情况进行绑定(也就是上面所说的 0,1,2),如果我们有时候需要让输出不显示在显示器上,而是输出到文件或者其他设备,那我们就需要重定向。
(5)下面的学习注意理解重定向的含义。将标准的重定向到自定义的。
2.重定向
输入重定向 :
<
、<<
输出重定向 :
>
、>>
注意:此处涉及到shell的解析原理,仅做简单介绍
- bash 在执行一条指令的时候,首先会检查命令中存不存在重定向的符号,如果存在那么首先将文件描述符重定向(之前说过了,输入输出操作都是依赖文件描述符实现的,重定向输入输出本质上就是重定向文件描述符),然后再把重定向去掉,执行指令
- 如果指令中存在多个重定向,那么不要随便改变顺序,因为重定向是从左向右解析的,改变顺序可能会带来完全不同的结果
<
是对标准输入 0 重定向 ,>
是对标准输出 1 重定向- 再强调一下, 重定向就是针对文件描述符的操作
3.输入重定向
格式:
[n]< file
:n是文件描述符。[]与<之间没有空格说明:将文件描述符 n 重定向到 word 指代的文件(以只读方式打开),如果n省略就是0(标准输入、键盘)
- 解释:解析器解析到 “<” 以后会先处理重定向,将标准输入重定向到file,之后cat再从标准输入读取指令的时候,由于标准输入已经重定向到了file ,于是cat就从file中读取指令了。第二张图片,先定义了重定向,然后读cat文件
4.输出重定向
- 格式:
[n]> file
- 说明: 将文件描述符 n 重定向到word 指代的文件(以写的方式打开),如果n 省略则默认就是 1(标准输出)
- 第二张图同样是 先进行重定向,然后使用echo命令
5.标准输出与标准错误输出重定向
- 格式:
&> word
、>& word
- 说明:将标准输出与标准错误输出都定向到word代表的文件(以写的方式打开),两种格式意义完全相同,这种格式完全等价于
> word 2>&1
(2>&1 是将标准错误输出复制到标准输出,&是为了区分文件1和文件描述符1的)
- 解释:我们首先执行了一个错误的命令,可以看到错误提示被写入文件(正常情况下是会直接输出的),我们又执行了一条正确的指令,发现结果也输入到了文件,说明正确错误消息都能输出到文件。(
&>
是混合错误输出重定向)
6.文件描述符的复制
格式:
[n]<&[m]
、[n]>&[m]
(这里的所有字符之间不能有空格)说明:
- 这里两个都是将文件描述符 n 复制到 m ,两者的区别是,前者是以只读的形式打开,后者是以写的形式打开
- 这里的& 目的是为了区分数字名字的文件和文件描述符,如果没有& 系统会认为是将文件描述符重定向到了一个数字作为文件名的文件,而不是一个文件描述符
一定要注意:重定向符号不能随意换位置
- cmd > file 2>&1
- cmd 2>&1 >file
- 第二句的意思是,先将标准错误输出重定向到1(显示器),然后将标准输出重定向到file,与第一句不同
7. exec 绑定重定向
格式:
exec [n]< file/[n]
、exec > file/[n]
注意:
- 格式:
exec [n]<>file
- 说明:以读写方式打开file指代的文件,并将n重定向到该文件。如果n不指定的话,默认为标准输入。
- exec仅仅对随后的一条重定向指令有效,第二条向后就失效了
- 格式:
8.HERE文件
格式:
<<[-]EOF
,说明:指定shell从当前输入源中读入行直至遇到仅包含EOF的一行(EOF后面也不能有空白符),然后所有读入的内容(不包括最后一行)作为标准输入传递给指令。‘-‘的作用是将每一行前面的tab去除后再读入。需要注意的是这个EOF不会进行任何扩展,但是如果EOF中没有字符没引号扩起来,那么here-document中的内容可以进行参数扩展、指令替换以及算术扩展(parameterexpansion, command substitution, and arithmeticexpansion);只要有任一字符被引号扩起来,delimiter仍是将去除引号的EOF,但是输入行不会进行任何扩展。
示例:
$ cat <<EOF
> $(pwd) # 指令替换
> `pwd` # 指令替换的第2种形式
> $HOME # 参数扩展
> $((4+5)) # 算数扩展
> EOF
/home/leo //此处开始扩展
/home/leo
/home/leo
9
$ cat <<"EOF"
> $(ls)
> `pwd`
> $HOME
> $((4+5))
> EOF
$(ls) //因为EOF有双引号,所以不会被扩展
`pwd`
$HOME
$((4+5))
9.HERE字符串
格式:
<<<word
说明:将扩展后的word作为标准输入传递给指令。
- 举例:使用这个功能可以将指令
echo ‘something’ |command
通过下面这种方式来实现
command <<<’something’
- 举例:使用这个功能可以将指令