我尝试使用netcat
管道响应将命令发送到 tcp 端口,
当我运行netcat
并输入命令时,它会正确打印响应,但是当我从管道传递命令时,它会正确发送命令但不打印响应
所以,这可以正确工作:
netcat localhost 9009
虽然这只是发送命令但不打印响应:
echo 'my_command' | netcat localhost 9009
为什么?
我怎样才能netcat
打印响应文本?
答案1
用这个:
cat <(echo command) - | nc host port
问题是,nc
将在 stdin 关闭后立即关闭连接,这对于简单的my_command
字符串来说非常快,因此永远没有机会收到响应。 (如果您通过管道传输一个非常大的文件,您会发现它可能会在发送完文件之前收到响应)。
输入第二个cat
参数-
:它cat
在发送第一个参数的内容后监听标准输入以获取更多内容。第一个参数只是让echo
命令通过cat
——它也可以是一个包含命令 la 的文件cat < file - | ...
。
或者这样做:
(echo command; while true; do sleep 0.01; echo -n "#"; done) | nc host port
这会#
在输入的第二行发送无限的字符。使用#
适用于类似 bash 的远程设备会忽略此注释。我在这里选择了 10 毫秒的较小等待时间,因此它在连接端的反应更快。 YMMV。
这样做的缺点可能是cat
循环while
并nc
继续运行,直到您击中^C
或^D
击中外壳。这实际上取决于远程端。
-w 1
使用(OSX netcat)或(nmap 的 ncat)添加超时会使其在 1 秒后-i 1
关闭连接,但会继续运行,直到您输入一些字符并且管道中断(我认为)。nc
cat
然而,如果远程端在接收和处理命令后自动关闭连接,它就会起作用——这也将结束nc
客户端和进入其中的进程管道。
这个答案是基于这个这是对相同超级用户问题的回答。
答案2
正如@Patrick所说,这个问题通常是由于netcat
在给出响应之前退出造成的。您可以通过添加-q 2
到命令行来解决这个问题,即告诉netcat
在检测到标准输入上的 EOF 后挂起大约 2 秒。显然,您也可以让它等待其他秒数。
答案3
不同的 openbsd-netcat 版本很奇怪,需要不同的-w <seconds>
、 、组合-q <seconds>
,-N
甚至需要不同的参数,具体取决于连接另一端运行的内容。对某些版本或服务器使用超时选项会导致延迟,而不使用它们可能会导致极长(无限?)的延迟。我预计 gnu netcat 会有不同的怪癖,但不知道它们在不同版本之间是否有所不同。
例如,当我这样做时,archlinux 的 1.130_3 版本需要非常长的时间(永远?):
$ echo response | nc -l 9999 &
[1] 15190
$ time echo request | nc localhost 9999
request
response
(wait forever possibly)
但它可以与添加到服务器或客户端的 -N 一起使用。
答案4
我正在使用 nmap 中的 ncat。
Ncat: Version 7.80 ( https://nmap.org/ncat )
--no-shutdown 选项解决了这个问题:
echo 'test' | netcat --no-shutdown $server $port