1

在 Ubuntu 下在 bash 中运行:

我有一个可以为我生成一些输出的源,但不是马上。让我们假设它是第一个在套接字上侦听的 netcat: netcat -l 12345

我想将它通过管道传输到传出的 netcat(通过 TCP 连接),例如netcat -l 12345 | netcat localhost 54321. 但棘手的一点是,当我运行命令时,我知道在 localhost 54321 上没有监听该传入连接,但我知道当第一个实际字符通过管道到达时会有一个。

所以我的问题是:有没有办法:

  • 延迟传出 netcat 的执行,直到第一个字符到达管道,或者
  • 延迟传出的 netcat 尝试建立 TCP 连接,直到它收到标准输入上的第一个字符?(在 man 中没有直接的选择,切换到 UDP 是不可接受的)

提前致谢!

编辑:实际上,源比 netcat 更复杂,即它是一个通过各种流修改管道传输的监听 netcat。

4

3 回答 3

5

使用您已经做过的研究以及我评论过的研究(不知道这是对您自己问题的回答),以下是完整的delayed_netcat.sh

#!/bin/bash
read line
netcat "${@}" < <(echo $line ; cat)

这首先等待一行输入,然后使用简单echo的“新生成”输入将该行添加到实际的netcat. stdin 的其余部分只是使用catwhich 将其从 slurps重定向stdin并将其添加到netcat. 它还支持将命令行选项和参数传递给 "real" netcat

用法如下:

netcat -l 12345 | cmd1 | cmd2 | ... | ./delayed_netcat.sh localhost 54321

netcat延迟到第一行被读取。如果您真的想在第一个字符被读取后启动它read并且echo需要一些重写。

于 2013-04-04T17:15:15.523 回答
1

使用 netcat 进行端口转发或端口映射:

ncat -l -p 12345 -c 'ncat localhost 54321'

使用socat

socat TCP4-LISTEN:12345 TCP4:localhost:54321

此命令在第一次连接完成后退出。

于 2013-04-04T12:16:15.173 回答
0

我找到了我的问题的答案,但它很糟糕......所以仍在寻找更好的东西。

netcat -l 12345 | gawk '(NR==1){print""}{print;fflush()}' | ./delayed_netcat.sh

其中./delayed_netcat.sh

#!/bin/sh
read line
netcat localhost 12345

因此,通过等待和消耗第一条输入行来read line延迟,我曾经在第一条记录之前插入一个空行……我相信这方面还有很大的改进空间!netcat localhost 12345gawk '(NR==1){print""}{print;fflush()}'

于 2013-04-04T12:34:45.337 回答