在Ubuntu下以bash运行:
我有一个源代码可以产生一些输出,但不是直接产生的。我们假设它是第一个监听套接字的netcat:netcat -l 12345
。
我想把它传递给一个传出的netcat(通过TCP连接),例如netcat -l 12345 | netcat localhost 54321
。但是棘手的一点是,我知道当我运行命令时,没有什么东西可以监听localhost 54321上的传入连接,但我知道当第一个实际角色通过管道到达时会有一个。
所以我的问题是:有没有办法:
提前致谢!
编辑:实际上,源代码比netcat更复杂,即它是通过各种流修改传输的监听netcat。
答案 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
被延迟,直到读取第一行。如果你真的想在阅读第一个字符后启动它,read
和echo
的部分需要重写。
答案 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()}'
在第一个记录之前插入一个空行...我'我确定有很大的改进空间!