Bash管道执行

Bash管道执行,bash,Bash,netcat手册页指出,在没有-c和-e选项的情况下,可以使用以下命令通过nc为shell提供服务 $ rm -f /tmp/f; mkfifo /tmp/f $ cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f 据我所知,FIFO的读写都是阻塞操作。例如,如果我跑步 $ mkfifo foo $ cat foo bash将被阻止,因为没有向foo写入任何内容。nc手册页示例中的管道如何不阻塞?我想我

netcat手册页指出,在没有-c和-e选项的情况下,可以使用以下命令通过nc为shell提供服务

$ rm -f /tmp/f; mkfifo /tmp/f
$ cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f
据我所知,FIFO的读写都是阻塞操作。例如,如果我跑步

$ mkfifo foo
$ cat foo

bash将被阻止,因为没有向foo写入任何内容。nc手册页示例中的管道如何不阻塞?我想我误解了管道是如何执行的。

管道中的所有命令都是并发运行的,而不是顺序运行的。因此,
cat/tmp/f
确实会被阻塞,但
/bin/sh
nc
仍会在阻塞期间启动<当客户端连接到端口并发送命令时,code>nc将写入FIFO,这将允许
cat
解除阻塞。

bash中的管道字符不允许将第一个命令的输出流连接到第二个命令的输入流
echo“123”| cat
基本上与
cat相同<
$ mkfifo foo
$ cat foo