我如何通过管道将命令传递到将继续存在的netcat?


32
echo command | netcat host port

这导致命令被发送到远程主机,并且一些数据被读回。但是几秒钟后,连接关闭。-w参数没有任何改变。我正在SuSE 10.1上使用netcat v1.10。


您确定不是远程主机关闭了连接吗?
grawity 2011年

是。进行netcat然后手动键入命令将导致netcat无限期地保持活动状态。
克里斯,

为什么它还活着?它只是打印回声参数然后死掉?
M'vy 2011年

1
我希望它保持活动状态,以便它继续接收来自远程服务器的数据。
克里斯(Chris

2
这不是真的。“ netcat <主机> <端口>”打开双向TCP套接字。
克里斯(Chris

Answers:


33

这适用nc于OS X上的命令(假设要发送的命令在文件中):

cat file - | nc host port

(本质上,cat将文件的内容转储到stdout上,然后在stdin上等待您)。

通过扩展,如果您想从外壳本身发送命令,则可以执行以下操作:

cat <(echo command) - | nc host port

很好,因为它可以在非常裸露的嵌入式系统上工作,而netcat缺少所有不错的选择。
SF。

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

1
如我所见,该netcat命令将使套接字保持打开状态,直到看到输入结束为止。所有这些例子都说明了这一点,但并没有真正说明原因。我与交互服务器使用的只是使用长时间:。 SocketTest 是一种方便的工具,可以侦听或在任何TCP或UDP端口上使用。SocketTest netcatcat - | nc localhost 8063

14

随着ncUbuntu上:

nc -q -1 host port

Ubuntu nc手册页中

 -q seconds
         after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.

请注意,各个发行版nc之间的可用选项差异很大,因此这可能不适用于您的(OpenSUSE)。


12

我找到了:

echo command | netcat host port -

我的同事知道这一点。我根本没有在文档中看到。


2

我认为您不会用netcat或socat来管理它。我刚刚对两者进行了广泛的修改,而socat看起来最有前途。

我设法将socat设置为连接到远程TCP端口并在本地unix域套接字上侦听(从理论上讲,这样链接可以一直保持下去),但是只要本地进程从unix套接字中分离出来(另一个socat)将unix套接字链接到stdin / out),它关闭了TCP socat会话。

这里的问题是,通过netcat / socat进行的每个连接都与服务器建立了一个新的TCP流连接,并且在本端断开连接时会关闭该TCP流会话。

我认为您可能需要为此编写一些自定义代理软件,该软件将打开与远程端的TCP连接,然后在套接字/管道/ fifo或其他任何内容上本地侦听,然后仅将数据发送到现有的TCP管道下并返回结果。


听全能的Matt Jenkins:D
M'vy

2

可能是插座另一端的连接关闭了吗?

默认情况下,nc如果您没有明确告诉他保持收听(使用-k选项),则在完成后关闭连接:

 -k    Forces nc to stay listening for another connection after its current
       connection is completed.  It is an error to use this option without the
       -l option.

请参阅man nc.1


我成功地在两台机器之间流传输数据,如下所示:

  • 发件人:

    while (true); do 
      echo -n "$RANDOM " | nc <host> <port>
    done
    
  • 接收者:

    nc -kl <port> 
    

1

Georges的方法可以从交互式外壳程序中很好地工作,但是当您将脚本调用为时,将无法帮助编写脚本nohup ./script &

我发现用虚拟fifo替代stdin会有所帮助。

 mkfifo dummy
 cat command.txt dummy | nc host port

由于输出文件后,没有任何内容可写入fifo,cat因此会无限期地挂在文件上。


0

socatshut-none选项在这里应该有所帮助:

Changes the (address dependent) method of shutting down the write part of a connection to not do anything.

您可能还需要使用来覆盖默认的超时期限-t <timeout>,否则套接字将在0.5s后关闭。此选项将覆盖默认行为,即:

When one of the streams effectively reaches EOF, the closing phase begins. Socat transfers the EOF condition to the other stream, i.e. tries to shutdown only its write stream, giving it a chance to terminate gracefully. For a defined time socat continues to transfer data in the other direction, but then closes all remaining channels and terminates.

因此,命令如下:

echo 'blah' | socat -t 10 stdio tcp:<addr>:<port>,shut-none

发送“ blah”后,将保持套接字打开10秒钟。


0

如果远程主机关闭了连接(或无法访问)或管道终止之前的命令(而netcat仍发送其其余输入队列),则命令终止。

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.