我有两个(UNIX)程序 A 和 B,它们从 stdin/stdout 读取和写入。
我的第一个问题是如何将 A 的 stdout 连接到 B 的 stdinandB 的标准输出到 A 的标准输入。即,类似 A | B而是双向管道。我怀疑我可以通过以下方式解决这个问题使用 exec 重定向 http://tldp.org/LDP/abs/html/x16834.html但我无法让它发挥作用。这些程序是交互式的,因此临时文件不起作用。
第二个问题是我想复制每个方向并通过日志程序将副本传输到标准输出,以便我可以看到在程序之间传递的(基于文本行的)流量。如果我能解决第一个问题,我可能会逃脱 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上测试过
更新:上面的脚本在几天后停止工作(!)。显然它可能会陷入僵局。答案中的一些建议可能更可靠。