如何在第一次输入时延迟管网netcat连接

时间:2013-04-04 10:50:55

标签: linux pipe netcat

在Ubuntu下以bash运行:

我有一个源代码可以产生一些输出,但不是直接产生的。我们假设它是第一个监听套接字的netcat:netcat -l 12345

我想把它传递给一个传出的netcat(通过TCP连接),例如netcat -l 12345 | netcat localhost 54321。但是棘手的一点是,我知道当我运行命令时,没有什么东西可以监听localhost 54321上的传入连接,但我知道当第一个实际角色通过管道到达时会有一个。

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

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

提前致谢!

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

3 个答案:

答案 0 :(得分:4)

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

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

这首先等待一行输入,然后使用简单的echo将该行添加到实际netcat的“新生成”输入中。 stdin的其余部分仅使用cat进行重定向,从stdin中剔除它并将其添加到netcat的输入中。它还支持将命令行选项和参数传递给“真实”netcat

用法如下:

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

netcat被延迟,直到读取第一行。如果你真的想在阅读第一个字符后启动它,readecho的部分需要重写。

答案 1 :(得分:1)

Port Forwarding or Port Mapping使用netcat:

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

使用socat

socat TCP4-LISTEN:12345 TCP4:localhost:54321

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

答案 2 :(得分: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 12345,我使用gawk '(NR==1){print""}{print;fflush()}'在第一个记录之前插入一个空行...我'我确定有很大的改进空间!