当标准输入关闭时,netcat 不会终止

Fra*_*ers 15 netcat

我正在尝试通过 发送消息netcat。发送消息后,netcat必须终止。

我尝试了以下方法:

cat tsmmessage.bin | nc -u localhost 4300
nc -u localhost 4300 < message.bin
Run Code Online (Sandbox Code Playgroud)

-q选项指出:

-q 秒

在 stdin 上的 EOF 之后,等待指定的秒数,然后退出。如果秒为负,则永远等待。

nc -q0 -u localhost 4300 < message.bin
Run Code Online (Sandbox Code Playgroud)

也不起作用。

我错过了什么?

Bor*_*per 14

假设发送EOF连接后将保持空闲,您可以使用-w timeout选项,该选项timeout为零(与愚蠢的-q选项不同......)

cat tsmmessage.bin | nc -u localhost 4300 -w0
Run Code Online (Sandbox Code Playgroud)

  • 零超时在我的机器上不起作用(debian 拉伸)。它说“无效的等待时间 0” (3认同)

roa*_*ima 6

如果没有该-q标志,您的实例netcat将永远等待。UDP 没有“流结束”消息,因此无法知道netcat标准输入和网络连接是否完成。

例如,使用 TCP/IP 可以按预期工作:

nc -l localhost 4300                     # Window 1
nc localhost 4300 </etc/group            # Window 2
Run Code Online (Sandbox Code Playgroud)

但正如您所确定的,使用 UDP/IP 这永远不会结束:

nc -u -l localhost 4300                  # Window 1
nc -u localhost 4300 </etc/group         # Window 2
Run Code Online (Sandbox Code Playgroud)

这就是-q标志发挥作用的地方。但不幸的是它不接受 值0。它也不接受非整数值。这是我可以提供的最佳替代方案,无需求助于timeout其他外部实用程序:

nc -u -l localhost 4300                  # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2
Run Code Online (Sandbox Code Playgroud)

即使在这里,也不可能netcat优雅地结束监听时间。(-w超时选项被忽略,并且-q是无关紧要的。)类似这样的东西可能在实际情况中有用,因此netcat在 90 秒后被杀死:

timeout 90 nc -u -l localhost 4300       # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2
Run Code Online (Sandbox Code Playgroud)


小智 -1

当谷歌搜索几乎相同的问题时偶然发现了这一点。原来问题是netcat在所有数据被吸进去后就被bash杀死了,没有任何机会收到响应。

我的解决方案是在传输数据后添加一些延迟,如下所示:

(echo INFO; sleep 1) | nc redis.service.consul 6379
Run Code Online (Sandbox Code Playgroud)

对于文件,这可能看起来像:

(cat tsmmessage.bin; sleep 5) | nc -u localhost 4300
Run Code Online (Sandbox Code Playgroud)