netcat 不打印响应

netcat 不打印响应

我尝试使用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循环whilenc继续运行,直到您击中^C^D击中外壳。这实际上取决于远程端。

-w 1使用(OSX netcat)或(nmap 的 ncat)添加超时会使其在 1 秒后-i 1关闭连接,但会继续运行,直到您输入一些字符并且管道中断(我认为)。nccat

然而,如果远程端在接收和处理命令后自动关闭连接,它就会起作用——这也将结束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

相关内容