监控进程间管道流量

jac*_*hab 13 linux process pipe

我有两个 Linux 进程通过无名管道进行通信。如何监控管道中的流量?如何将数据注入管道?我有 root 访问权限并且知道管道 inode。

Gil*_*il' 8

无名管道本质上是具有文件描述符的应用程序私有的。没有原则性的方法来观察或修改管道上的流量。我也不认为有一种方法可以直接在 Linux 上查看管道。

不过,有一种或多或少的无原则方式可以做您想做的事情:通过ptrace系统调用。您不会使用管道本身,而是使用其中一个流程。对于观察,使用strace,例如

strace -p1234 -s99999 -e write
Run Code Online (Sandbox Code Playgroud)

其中1234是在管道上写入的进程的进程 ID。修改数据比较困难,但可以做到。我认为最简单的方法是首先设置一个中间过程,将其标准输入复制到其标准输出,加上您想要注入的数据(减去您想要抑制的任何数据)。创建两个命名管道并使用一个管道上的 stdin 和另一个管道上的 stdout 启动该中间过程。然后使用调试器(例如GDB)使两个目标进程open在适当的命名管道上执行,然后dup将管道放置在适当的文件描述符上。请注意,您可能会在此过程中使其中一个进程崩溃。

(如果你不明白最后一段,对不起,但它确实需要一定的技术水平。我认为没有更简单的方法。)


har*_*ymc 2

一些可用于监控管道的工具:

管道观察器
三通

对于无法控制管道的已运行程序,请参阅 gdb 方法:
从正在运行的进程重定向输出

或者可以使用strace

strace -ewrite -p $PID 2>&1 | grep "write(1"
Run Code Online (Sandbox Code Playgroud)

仅显示描述符 1 调用。“2>&1”是将stderr重定向到stdout,因为strace默认写入stderr。