读写同一个netcat tcp连接

4

假设我向一个Netcat连接发送信息:

tail -f ${file} | nc localhost 7050 | do_whatever | nc localhost 7050

这里发生的情况是我们有两个socket连接,用于进行一些请求和响应。但这并不是理想的做法,原因有几个。
我想要做的是重用同一个连接,以进行读取和写入操作。
有人知道如何只重用一个netcat连接吗?

如果do_whatever收到某个消息,它将使用第二个连接向TCP服务器回写。主要问题是当其他进程想要与此进程通信时,他们可能会看到两个连接而不是一个来进行通信。 - Alexander Mills
我所知道的唯一技巧是这个:http://xmodulo.com/tcp-udp-socket-bash-shell.html - Alexander Mills
你可能可以使用协处理器来完成它。但这不是shell脚本擅长的事情。为什么不使用带有套接字API的编程语言呢? - Barmar
我得谷歌一下什么是协同处理器...我添加了一个答案,我认为应该可以很好地解决问题,不知道为什么我之前没想到。 - Alexander Mills
https://www.gnu.org/software/bash/manual/html_node/Coprocesses.html - Alexander Mills
还不确定我是否已经理解了协处理器。 - Alexander Mills
3个回答

6
在UNIX中正确的做法是利用后置管道。您可以按照以下步骤进行操作:
首先,创建一个管道:mknod bkpipe p 这将创建一个名为bkpipe的文件,类型为管道。
接下来,确定您需要做的事情。以下是两个有用的场景。在这些场景中,将主机/地址和端口号替换为中继所需的适当端口。
将发送到本地端口的数据转发到另一台机器上的远程端口:
 nc -l -p 9999 0<bkpipe | nc remotehost 7000 | tee bkpipe

连接到另一台计算机,然后将该连接中的数据中继到另一台计算机:

 nc leftHost 6000 0<bkpipe | nc rightHost 6000 | tee bkpipe

如果你只需要在单个主机内处理基本的IPC,那么你完全可以不使用netcat,而是使用mknod创建的FIFO管道。如果你用一个进程将东西塞到FIFO中,它们会一直等待,直到有其他进程读取它们出来。

不确定是否有影响,但在我的情况下,只使用一台机器,即本地主机。我在这里使用TCP进行进程间通信。 - Alexander Mills
好的,你可以这样做...或者你可以直接使用一个FIFO管道来完成整个过程。我原本以为你在主机之间使用nectay中继器。 - David Hoelzer
我已经添加了一个修订来实现这个效果。 - David Hoelzer

1

是的,我认为最简单的方法是使用这种方式:

tail -f ${file} | nc localhost 7050 | do_whatever > ${file}

请将内容写回到同一文件中(它是一个“命名管道”)。

只要您的消息小于约500字节,它们就不会交错。


那跟问题有什么关系呢?我以为这是关于写入网络连接,而不是文件的。 - Barmar
本帖讨论的是在同一个TCP连接中进行读写操作。 - Alexander Mills
我知道你在做什么。由于无法从网络中读取回来,所以你正在写入tail -f正在读取的文件。 - Barmar
那个问题使用了命名管道,而不是文件。 - Barmar
我认为使用 > 就可以了,不需要使用 >>。 - Alexander Mills
显示剩余6条评论

1
使用ncat作为一行命令对于初学者来说更加容易理解和使用 ;)
使用telnet(或nc)连接到本地主机的5087端口,您输入的所有内容都将回显给您 ;) 使用-lk选项进行侦听和保持/维护(多个)连接。
您可以像这样将其制作成一个bash脚本,使用反斜杠但它会调用多个bash,资源使用不便宜:
#!/bin/bash
# title          : ncat-listener-bidirectional.sh
# description    : This script will listen for text entered by a client 
#                  like for instance telnet
#                  and echo back the key strokes
#
ncat -lk 5087 -c ' \
#!/bin/bash \
while true; do  \
  read i && echo [You entered:] $i; \
done'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接