与rev一起使用时,使用Netcat和FIFO构建的Echo服务器会失败

时间:2014-05-16 22:51:15

标签: bash shell unix netcat

我正在玩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如何使用标准和标准输出有一些特别之处。 (与revtr和其他类似的文本转换程序相比。)

这里发生了什么?为什么在管道中插入rev会破坏echo服务器? cat确实特别,如果是,那该怎么办?

1 个答案:

答案 0 :(得分:2)

这是由于缓冲。当stdout不是终端时,glibc会自动缓冲输出。 效率。

您可以在终端中看到相同的效果,其中rev会在您输入时反转每一行,而rev | cat则不会。

要修复它,你必须让你的命令不缓冲。 GNU有一个stdbuf工具,用于执行任意命令:

cat fifo | nc -l 3000 | stdbuf -o 0 rev > fifo

交互式命令脚本工具expect还附带unbuffer命令来执行相同操作。

缓冲仅在将多个小写入组合成大写时才有效。只是从一个地方复制到另一个地方的程序(如catdd)不会从缓冲中受益,因此不会这样做。