【发布时间】:2008-09-26 13:24:07
【问题描述】:
我有两个 (UNIX) 程序 A 和 B,它们从标准输入/标准输出读取和写入。
我的第一个问题是如何将 A 的标准输出连接到 B 的标准输入和将 B 的标准输出连接到 A 的标准输入。即,类似于 A | B 而是双向管道。我怀疑我可以通过using exec to redirect 解决这个问题,但我无法让它工作。这些程序是交互式的,因此临时文件不起作用。
第二个问题是我想复制每个方向并通过日志程序将副本传输到标准输出,以便我可以看到程序之间传递的(基于文本行的)流量。在这里,如果我能解决第一个问题,我可能会逃脱 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 上测试过
更新:上面的脚本在几天后停止工作(!)。显然它可以死锁。答案中的一些建议可能更可靠。
【问题讨论】: