今天我在阅读nc
手册页时偶然发现了这个命令。我知道:
mkfifo /tmp/f
正在创建命名管道/tmp/f。cat /tmp/f
正在打印写入该命名管道的任何内容,并且 的输出cat /tmp/f
被通过管道传送到/bin/sh
/bin/sh
正在交互运行,并且 stderr 被重定向到 stdout。- `然后输出通过管道传输到正在侦听端口 1234 的 nc
- 输出最终再次重定向到命名管道。
运行时,连接到该端口(即 1234)上的远程服务器会打开 shell 提示符,客户端可以执行任意命令。但它是如何运作的呢?
答案1
此类命令利用 IO 重定向和 sh 交互模式,该模式在连接到 TTY 时默认处于打开状态。
请注意,cat 在 FIFO 上保持打开状态。这是你的第一个线索。当 sh 运行时,它所做的一切就是将其 stdout 和 strerr 定向到 TTY。相反,sh 不附加到 TTY。通常 sh 在连接到 TTY 时会自动进入交互模式,但因为它没有添加 -i 选项。这意味着它将继续接受新命令的输入。这些命令的输出被定向到 nc 的标准输入,并且 nc 的输出(即通过网络发送的命令)被重定向到 FIFO。
FIFO 本质上被用作命名管道来完成重定向环。
您可以更简单地将其视为 sh 和 nc 在循环中相互重定向。该命令的其余部分只是无用的内容。