1. 带外壳 FD 的双 T 座

1. 带外壳 FD 的双 T 座

我有一个命令行程序,它target通过 stdio 实现命令/响应接口(适用于其他程序,不适用于人类)。

具体来说:

  • 该程序的使用者启动它
  • 从其标准输出读取 1 行或多行(其“问候语”)
  • 发送 1 行或多行到其标准输入(“命令”)
  • 从其标准输出读取 1 行或多行(“响应”)
  • ...

这会循环发生,直到target终止,这可能是在收到某种“退出”命令时发生的。

命令和响应之间的延迟可以是任意的。我相信它target也可能会启动一些自己的命令(消费者必须响应),但我不确定。


如何以某种方式包装该程序以便能够记录(或者更好的是,记录并可能修改)所有命令和响应?

答案1

你必须从一些假设开始。特别是,在目标程序完成发送对前一命令的回复之前,您的一个程序不会发送命令。否则,同时记录的东西看起来会很乱。为了使这个假设成立,您需要确保在接收器和源之间插入的程序不使用缓冲。

两种解决方案:

1. 带外壳 FD 的双 T 座

在 shell 脚本中,您可以禁用缓冲(这在本用例中非常重要),然后将客户端程序的 stdout 重定向到tee -a logfile,然后同时登录到文件中;您将tee的 stdout 连接到临时 FD。

就像这样,您可以使用 shell 的构造来创建一个文件描述符,用作客户端程序的标准输入,以及另一个文件描述符作为程序的标准输出target。然后,您最终通过另一个管道将由这两个描述符形成的“回复”方向通过管道传输tee -a logfile

最后,您使用第一个teestdout 流作为 的输入target,并使用第二个teestdin 流作为输出。

2. 调试您的流程

使用各种方法,您可以挂钩目标或客户端进程读取和写入的内容并记录下来。

通过适当的 LD_PRELOAD,您可以拦截与程序的 stdin 和 stdout 交互的libcread和调用,并记录它们。write问题:并非所有东西都使用 libc。

或者,这就是推荐的:bpftools 附带了捕获底层系统调用的监听示例 - 没有办法解决这个问题。记录您的过滤程序显示的内容!

相关内容