![壳管 - 事物的顺序](https://linux22.com/image/1564736/%E5%A3%B3%E7%AE%A1%20-%20%E4%BA%8B%E7%89%A9%E7%9A%84%E9%A1%BA%E5%BA%8F.png)
因为netcat
我的盒子不支持-e
,所以netcat
手册页给了我这个解决方法:
$ rm -f /tmp/f; mkfifo /tmp/f
$ cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f
我不明白这是如何工作的。我认为当您尝试cat /tmp/f
这样做时,它会被阻止,直到写入某些内容/tmp/f
,如果被阻止,命令的其余部分将如何运行?
答案1
管道中的所有命令都是同时开始并同时运行 – 命令 2 不会等待命令 1 退出。相反,管道依赖于读取操作阻塞,直到前一个命令产生一些输出。
例如,的输出 (stdout)cat /tmp/f
直接连接到的输入/bin/sh -i
;无论何时什尝试从其标准输入读取,它将阻塞,直到猫已经产生了一些输出。
1(几乎直接;cat 的标准输出和 sh 的标准输入与“管道”对象的两端绑定。)