netcat不打印响应


12

我试图 在运行并键入命令时使用netcatand管道响应将命令发送到tcp端口,但它会正确打印响应,但是当我从管道传递命令时,它会正确发送命令但不显示响应
netcat

因此,这可以正常工作:

netcat  localhost 9009

虽然这只是发送命令,但不显示响应:

echo 'my_command' | netcat  localhost 9009

为什么?
如何netcat打印响应文本?


可能正在您身上
杰夫·谢勒

@JeffSchaller:不!不幸的是,使用这些命令没有帮助!这次它永远地阻塞了!
RYN

您正在使用哪个网猫?不幸的是,netcat工具有十几种不同的变体,而且它们的行为也不尽相同。另外,远端是什么?
帕特里克(Patrick)

@Patrick:我的netcat是OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)版本;并且在远端是telegram-cli在同一台机器上。
RYN

我想我找到了该netcat的手册页,但是我看不到任何可以控制我怀疑正在发生的事情的标志。我怀疑一旦netcat在STDIN上收到EOF,它会立即关闭套接字的两侧,而不是半关闭并等待远程端将其端部关闭。如果socat可以的话,我强烈建议您选择。只有一个socat,因此不会有十几种不同的样式带来可移植性问题,它的行为更加理智,并且可高度配置。
帕特里克

Answers:


8

正如@Patrick所说,此问题通常是由于netcat在给出响应之前退出。您可以通过添加-q 2到命令行来进行补救,即netcat在检测到标准输入上的EOF后告诉挂起大约2秒钟。显然,您也可以使其等待其他秒数。


谢谢; -q 2有用,但是值得信赖吗?它正在发出网络请求,我不确定2s总是足够的!我可以吗 ?
RYN

1
使用较大的数字可使其等待更长的时间,或使用一些负数可使其无限期等待。还有-w选择玩。这是全部在man nc页面中。
拉尔夫·隆奎斯特(RalphRönnquist),

5
它说invalid option -- 'q'
phil294

我认为一个很好的后续问题是:为什么要nc立即退出而不是等待响应?如果连接仍处于打开状态,则应该有一个选项使它nc等待关闭,而不仅仅是让stdin结束
theferrit32 '19

6

用这个:

cat <(echo command) - | nc host port

问题是nc将在关闭stdin后立即关闭连接,这对于简单的my_command字符串来说非常快,因此永远不会有机会接收响应。(如果您通过管道传输了很大的文件,您将看到它在完成发送文件之前可能会收到响应)。

输入catwith -作为第二个参数:cat发送第一个参数的内容后,它可以侦听stdin上的更多内容。第一个参数只是使echo命令通过cat-它也可以是包含命令la的文件cat < file - | ...

或者执行以下操作:

(echo command; while true; do sleep 0.01; echo -n "#"; done) | nc host port

这将#在输入的第二行上发送无限字符。#对像遥控器这样的bash 使用using 会忽略此评论。我在这里选择了10毫秒的较小等待时间,因此它在连接端的反应速度更快。YMMV。

那缺点可以是catwhile循环并nc继续运行,直到你打^C^D在外壳上。这实际上取决于远端。

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

但是,如果远程端在接收和处理命令后自动关闭连接,则可以正常工作-这也将结束nc客户端和连接到客户端的进程。

该答案基于对相同超级用户问题的此答案


{ echo my_command; cat;}会做同样的事情,可能被认为更容易理解。
G-Man说'Resstate Monica''De​​c

1

不同的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一起使用。


1

我知道这有点老,但是没有其他答案对我有用,但确实做到了:

echo 'test' | netcat -N $server $port

注意-N

对输入进行EOF后,关闭网络套接字。一些服务器需要这样做才能完成工作。

在Windows和Linux上都为我工作。

注意:这是我针对重复问题发布的答案的副本粘贴。

我认为这可能有用。如果违反政策或其他规定,Mod可以随意编辑/删除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.