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