【问题标题】:Read and write to the same netcat tcp connection读写同一个 netcat tcp 连接
【发布时间】:2018-04-21 06:54:10
【问题描述】:

假设我写到一个 netcat 连接:

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

这里发生的情况是我们有两个套接字连接,用于执行一些请求/响应。但这并不理想,原因有几个。

我想要做的是重复使用相同的连接来读取和写入。

有谁知道我怎样才能重复使用一个 netcat 连接?

【问题讨论】:

  • 如果do_whatever 收到某个消息,它将使用第二个连接回写到 tcp 服务器。主要问题是当其他进程想要与这个通信时,他们可能会看到两个连接,而不是一个,来与之通信。
  • 我唯一知道的就是这种技术:xmodulo.com/tcp-udp-socket-bash-shell.html
  • 您也许可以使用协同进程来完成。但这不是 shell 脚本所擅长的。为什么不使用带有套接字 API 的语言?
  • 我必须用谷歌搜索什么是协同处理...我添加了一个我认为应该可以正常工作的答案,不知道为什么我之前没有想到它

标签: bash shell tcp pipe netcat


【解决方案1】:

在 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 进行 IPC。
  • 好吧,你可以这样做......或者你可以只使用一个 FIFO 管道来处理整个事情。我的印象是您在主机之间使用了 nectay 中继。
  • 我已经为此添加了修订版。
【解决方案2】:

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

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

只需写回同一个文件(它是一个“命名管道”)。

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

【讨论】:

  • 这与问题有什么关系?我认为这是关于写入网络连接,而不是文件。
  • OP是关于读写同一个tcp连接
  • 使用这个答案中的方法,已经实现了
  • 我明白你在做什么。由于您无法从网络回读,因此您正在写入tail -f 正在读取文件的文件。
  • 是的,我从这里得到了答案:unix.stackexchange.com/questions/439081/…
【解决方案3】:

对于初学者来说,使用 ncat 更容易理解;)

prompt$&gt; ncat -lk 5087 -c ' while true; do read i &amp;&amp; echo [You entered:] $i; done'

使用 telnet(或 nc)连接到 localhost 端口 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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    相关资源
    最近更新 更多