我正在玩Netcat,我已经成功制作了这样的回音服务器:
mkfifo fifo
cat fifo | nc -l 3000 > fifo
接下来,我想在数据回应之前应用一些转换:
cat fifo | nc -l 3000 | rev > fifo
# Or:
cat fifo | rev | nc -l 3000 > fifo
但以上都没有。当我使用任何文本转换程序时,情况也是如此,而不仅仅是rev
。但是,如果我将rev
替换为cat
,则会再次有效:
cat fifo | nc -l 3000 | cat > fifo
这让我相信cat
如何使用标准和标准输出有一些特别之处。 (与rev
,tr
和其他类似的文本转换程序相比。)
这里发生了什么?为什么在管道中插入rev
会破坏echo服务器? cat
确实特别,如果是,那该怎么办?
答案 0 :(得分:2)
这是由于缓冲。当stdout不是终端时,glibc
会自动缓冲输出。
效率。
您可以在终端中看到相同的效果,其中rev
会在您输入时反转每一行,而rev | cat
则不会。
要修复它,你必须让你的命令不缓冲。 GNU有一个stdbuf
工具,用于执行任意命令:
cat fifo | nc -l 3000 | stdbuf -o 0 rev > fifo
交互式命令脚本工具expect
还附带unbuffer
命令来执行相同操作。
缓冲仅在将多个小写入组合成大写时才有效。只是从一个地方复制到另一个地方的程序(如cat
和dd
)不会从缓冲中受益,因此不会这样做。