我有两个(UNIX)程序A和B,它们从stdin/stdout读写。
我的第一个问题是如何将A的stdout连接到B的stdin,并将B的stdout连接到A的stdin。也就是说,像A | B这样的双向管道。我怀疑可以通过使用exec重定向来解决,但我无法使它工作。这些程序是交互式的,因此临时文件不起作用。
第二个问题是,我想复制每个方向并通过日志记录程序将副本传输到stdout,以便我可以看到程序之间传递的(基于文本行的)流量。如果我能解决第一个问题,我可能会用tee >(...)来解决这个问题。
这两个问题似乎应该有众所周知的解决方案,但我还没有找到任何信息。
我更喜欢POSIX shell解决方案,或者至少在cygwin的bash中有效的解决方案。
感谢您的答案,我想出了以下解决方案。A/B命令使用nc监听两个端口。日志记录程序使用sed(带有-u选项进行非缓冲处理)。
bash-3.2$ fifodir=$(mktemp -d)
bash-3.2$ mkfifo "$fifodir/echoAtoB"
bash-3.2$ mkfifo "$fifodir/echoBtoA"
bash-3.2$ sed -u 's/^/A->B: /' "$fifodir/echoAtoB" &
bash-3.2$ sed -u 's/^/B->A: /' "$fifodir/echoBtoA" &
bash-3.2$ mkfifo "$fifodir/loopback"
bash-3.2$ nc -l -p 47002 < "$fifodir/loopback" \
| tee "$fifodir/echoAtoB" \
| nc -l -p 47001 \
| tee "$fifodir/echoBtoA" > "$fifodir/loopback"
这个程序监听端口47001和47002的连接,并将所有数据包通过标准输出进行回显。
在shell 2中执行以下命令:
bash-3.2$ nc localhost 47001
在 shell 3 中执行:bash-3.2$ nc localhost 47002
现在在 shell 2 中输入的命令将被写入到 shell 3 中,反之亦然,并且流量将被记录到 shell 1 中,类似于:
B->A: input to port 47001
A->B: input to port 47002
以上内容已在Cygwin上进行测试。
更新:上述脚本在几天后停止工作了(!)。显然会出现死锁现象。一些答案中的建议可能更可靠。