[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(标准输入、键盘)

1.反弹shell--文件描述符 - 图1

1.反弹shell--文件描述符 - 图2

  • 解释:解析器解析到 “<” 以后会先处理重定向,将标准输入重定向到file,之后cat再从标准输入读取指令的时候,由于标准输入已经重定向到了file ,于是cat就从file中读取指令了。第二张图片,先定义了重定向,然后读cat文件

1.反弹shell--文件描述符 - 图3

4.输出重定向

  • 格式: [n]> file
  • 说明: 将文件描述符 n 重定向到word 指代的文件(以写的方式打开),如果n 省略则默认就是 1(标准输出)

1.反弹shell--文件描述符 - 图4

1.反弹shell--文件描述符 - 图5

  • 第二张图同样是 先进行重定向,然后使用echo命令

1.反弹shell--文件描述符 - 图6

5.标准输出与标准错误输出重定向

  • 格式: &> word>& word
  • 说明:将标准输出标准错误输出都定向到word代表的文件(以写的方式打开),两种格式意义完全相同,这种格式完全等价于 > word 2>&1 (2>&1 是将标准错误输出复制到标准输出,&是为了区分文件1和文件描述符1的)

1.反弹shell--文件描述符 - 图7

  • 解释:我们首先执行了一个错误的命令,可以看到错误提示被写入文件(正常情况下是会直接输出的),我们又执行了一条正确的指令,发现结果也输入到了文件,说明正确错误消息都能输出到文件。(&>是混合错误输出重定向

1.反弹shell--文件描述符 - 图8

6.文件描述符的复制

  • 格式: [n]<&[m][n]>&[m] (这里的所有字符之间不能有空格)

  • 说明:

    • 这里两个都是将文件描述符 n 复制到 m ,两者的区别是,前者是以只读的形式打开,后者是以写的形式打开
    • 这里的& 目的是为了区分数字名字的文件和文件描述符,如果没有& 系统会认为是将文件描述符重定向到了一个数字作为文件名的文件,而不是一个文件描述符
  • 一定要注意:重定向符号不能随意换位置

    • cmd > file 2>&1
    • cmd 2>&1 >file
    • 第二句的意思是,先将标准错误输出重定向到1(显示器),然后将标准输出重定向到file,与第一句不同
    • 1.反弹shell--文件描述符 - 图9

7. exec 绑定重定向

  • 格式:exec [n]< file/[n]exec > file/[n]

  • 注意:

    • 格式: exec [n]<>file
    • 说明:以读写方式打开file指代的文件,并将n重定向到该文件。如果n不指定的话,默认为标准输入。
    • exec仅仅对随后的一条重定向指令有效,第二条向后就失效了

1.反弹shell--文件描述符 - 图10

1.反弹shell--文件描述符 - 图11

8.HERE文件

  • 格式:<<[-]EOF

  • 说明:指定shell从当前输入源中读入行直至遇到仅包含EOF的一行(EOF后面也不能有空白符),然后所有读入的内容(不包括最后一行)作为标准输入传递给指令。‘-‘的作用是将每一行前面的tab去除后再读入。需要注意的是这个EOF不会进行任何扩展,但是如果EOF中没有字符没引号扩起来,那么here-document中的内容可以进行参数扩展、指令替换以及算术扩展(parameterexpansion, command substitution, and arithmeticexpansion);只要有任一字符被引号扩起来,delimiter仍是将去除引号的EOF,但是输入行不会进行任何扩展。

  • 示例:

    1. $ cat <<EOF
    2. > $(pwd) # 指令替换
    3. > `pwd` # 指令替换的第2种形式
    4. > $HOME # 参数扩展
    5. > $((4+5)) # 算数扩展
    6. > EOF
    7. /home/leo //此处开始扩展
    8. /home/leo
    9. /home/leo
    10. 9
    11. $ cat <<"EOF"
    12. > $(ls)
    13. > `pwd`
    14. > $HOME
    15. > $((4+5))
    16. > EOF
    17. $(ls) //因为EOF有双引号,所以不会被扩展
    18. `pwd`
    19. $HOME
    20. $((4+5))

9.HERE字符串

  • 格式:<<<word

  • 说明:将扩展后的word作为标准输入传递给指令。

    • 举例:使用这个功能可以将指令
      echo ‘something’ |command
      通过下面这种方式来实现
      command <<<’something’

参考文档