我有一个命令行程序,它target
通过 stdio 实现命令/响应接口(适用于其他程序,不适用于人类)。
具体来说:
- 该程序的使用者启动它
- 从其标准输出读取 1 行或多行(其“问候语”)
- 发送 1 行或多行到其标准输入(“命令”)
- 从其标准输出读取 1 行或多行(“响应”)
- ...
这会循环发生,直到target
终止,这可能是在收到某种“退出”命令时发生的。
命令和响应之间的延迟可以是任意的。我相信它target
也可能会启动一些自己的命令(消费者必须响应),但我不确定。
如何以某种方式包装该程序以便能够记录(或者更好的是,记录并可能修改)所有命令和响应?
答案1
你必须从一些假设开始。特别是,在目标程序完成发送对前一命令的回复之前,您的一个程序不会发送命令。否则,同时记录的东西看起来会很乱。为了使这个假设成立,您需要确保在接收器和源之间插入的程序不使用缓冲。
两种解决方案:
1. 带外壳 FD 的双 T 座
在 shell 脚本中,您可以禁用缓冲(这在本用例中非常重要),然后将客户端程序的 stdout 重定向到tee -a logfile
,然后同时登录到文件中;您将tee
的 stdout 连接到临时 FD。
就像这样,您可以使用 shell 的构造来创建一个文件描述符,用作客户端程序的标准输入,以及另一个文件描述符作为程序的标准输出target
。然后,您最终通过另一个管道将由这两个描述符形成的“回复”方向通过管道传输tee -a logfile
。
最后,您使用第一个tee
stdout 流作为 的输入target
,并使用第二个tee
stdin 流作为输出。
2. 调试您的流程
使用各种方法,您可以挂钩目标或客户端进程读取和写入的内容并记录下来。
通过适当的 LD_PRELOAD,您可以拦截与程序的 stdin 和 stdout 交互的libcread
和调用,并记录它们。write
问题:并非所有东西都使用 libc。
或者,这就是推荐的:bpftools 附带了捕获底层系统调用的监听示例 - 没有办法解决这个问题。记录您的过滤程序显示的内容!