我正在尝试使用netcat
管道响应将命令发送到 tcp 端口,
当我运行netcat
并键入我的命令时,它会正确打印响应,但是当我从管道传递命令时,它会正确发送命令但不打印响应
所以,这可以正常工作:
netcat localhost 9009
Run Code Online (Sandbox Code Playgroud)
虽然这只是发送命令但不打印响应:
echo 'my_command' | netcat localhost 9009
Run Code Online (Sandbox Code Playgroud)
为什么?
如何netcat
打印响应文本?
小智 9
正如@Patrick 所说,这个问题通常是由于netcat
在给出响应之前退出。您可以通过添加-q 2
到命令行来解决这个问题,即netcat
在标准输入上检测到 EOF 后告诉挂起大约 2 秒。显然,您也可以让它等待其他几秒钟。
用这个:
cat <(echo command) - | nc host port
Run Code Online (Sandbox Code Playgroud)
问题是它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
Run Code Online (Sandbox Code Playgroud)
这会#
在输入的第二行发送无限个字符。#
对像 remote 这样的 bash使用作品会忽略它作为注释。我在这里选择了 10 毫秒的小等待时间,因此它在连接端反应更快。天啊。
那缺点可以是cat
或while
循环并nc
继续运行,直到你打^C
或^D
在外壳上。这真的取决于远程端。
使用-w 1
(OSX netcat) 或-i 1
(nmap's ncat)添加超时使其关闭连接并nc
在 1 秒后关闭,但cat
会继续运行,直到您输入某个字符并且管道中断(我认为)。
但是,如果远程端在接收和处理命令后自动关闭连接,它就会起作用——这也将结束nc
客户端和进程管道进入它。
此答案基于对相同超级用户问题的此答案。