我正在从脚本执行以下命令:
echo '{"hostUp": true}' | sudo /usr/local/bin/netcat localhost 8001
但是,netcat 客户端会一直保持打开状态。发送完这些数据后,我该如何关闭连接?
答案1
在正确的上下文中,其他答案-c
和-q
给出的答案都是正确的,但它可能有助于总结为什么有多个答案并给出更通用的解决方案。
这些不同的选项执行相同的操作,但是是 netcat 的不同实现:
-c
Netcat 的 GNU 实现-q
OpenBSD 的 netcat 实现。-w
(其他?)netcat 的 OpenBSD 实现。
-q
某些版本要求使用 int 来指定退出和选项前要等待的秒数-w
。此 int 必须是> 0
或>= 0
,具体取决于版本。
如果您在多台机器上实现某些功能,但不确定它们是否使用相同的 netcat 实现,那么您可以考虑将 netcat 调用与程序包装在一起,timeout
以便在几秒钟后杀死 netcat。
timeout 5 echo '{"hostUp": true}' | netcat localhost 8001
这种方法有点笨拙,因为无论是否成功发送数据,它都会对 netcat 的执行设置上限,但如果您发送少量数据并且有几秒钟的空闲时间,那么这应该适用于任何 netcat 实现。
答案2
您可以使用-q
参数,但这也会导致netcat
服务器关闭。
$ echo '{"hostUp": true}' | sudo /usr/local/bin/netcat -q 5 localhost 8001
答案3
就我而言,我在 Mac 上通过 Homebrew(v 0.7.1)安装的 netcat 副本没有 -q 选项,但我能够使用 -c 选项在 STDIN EOF 上关闭并将整个命令置于循环中:
while true ; do printf 'HTTP/1.1 200 OK\r\n\r\ncool, thanks' | netcat -l -c -p 8888 ; done
答案4
我正-N
为了这个目的在 ubuntu 20.04 上工作。