CentOS 5 或 6(nc-1.84-10.fc6 或 nc-1.84-22.el6.x86_64)中的 Netcat(nc)有一个有趣的问题。我该如何解决这个问题?我找不到有关此问题的错误,但是
它模拟了文件传输到远程主机的过程,在远程主机上对文件进行转换,然后返回结果。在这个例子中,转换是“cat”。
服务器(本地主机):
$ mkfifo nctest.fifo
$ while :; do
nc -l 5000 <nctest.fifo | cat >nctest.fifo
echo -n .
sleep 1
done
客户端(本地主机):
$ cat testfile | nc 127.0.0.1 5000 > outfile
$ ls -l
total 9724
prw-r--r-- 1 root root 0 Nov 4 14:17 nctest.fifo
-rw-r--r-- 1 root root 4930560 Nov 4 14:17 outfile
-rw-r--r-- 1 root root 5000000 Nov 4 14:09 testfile
Outfile 的大小从零到 5000000 不等。我可以向客户端添加“-w2”,但这没用。
答案1
嗯...好的,我思考我知道这是怎么回事。由于您使用管道命令(使用“|”符号)启动服务器,因此进程nc
与cat
进程之间存在关系。当nc
处理在 TCP 连接上看到 EOF 时,它会退出……这会导致进程cat
也退出(即使它尚未从管道读取所有内容)。
您可以通过将管道更改为如下方式来解决此问题:
nc -l 5000 <nctest.fifo | cat >nctest.fifo &
wait
echo -n .
...注意,'&' 和wait
调用。当然,这可能会让后台作业继续运行,因此您需要在 shell 脚本中添加 SIGCHLD 处理程序,以确保在完成后将其射入头部(我将把这部分留作练习)。