unix - 在 shell/bash 中的两个命令之间连接输入 _and_output

标签 unix shell pipe

我有两个(UNIX)程序 A 和 B 从 stdin/stdout 读取和写入。

我的第一个问题是如何将 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 上测试过

更新:上面的脚本在几天后停止工作(!)。显然它可能会死锁。答案中的一些建议可能更可靠。

最佳答案

命名管道怎么样?

# mkfifo foo
# A < foo | B > foo
# rm foo

对于你的第二部分,我相信 tee 是正确的答案。所以就变成了:
# A < foo | tee logfile | B > foo

关于unix - 在 shell/bash 中的两个命令之间连接输入 _and_output,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/139484/

相关文章:

bash - 如何在 bash shell 中监控每秒添加到文件的平均行数?

linux - 如何在 shell 脚本中的每个字符后插入一个新行?

filter - 如何获得angular2中过滤(管道)集的大小

java - 如果使用InputStream从PIPE输入结束,如何使(Java)程序自动结束

linux - Bash,使用导出并在单个脚本中运行导出

c++ - 创建双向本地/Unix 套接字

linux - Haskell可以用来写shell脚本吗?

linux - 使用正则表达式提取多个值并将它们重新格式化为 shell oneliner 中的新字符串?

Linux shell,从文件中获取所有匹配项

linux - POSIX 将用户输入可接受的字符数限制为 4096,如何增加?