监视进程间管道流量


13

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

Answers:


7

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

但是,有一种无原则的方式可以或多或少地执行您要执行的操作:通过ptrace系统调用。您本身并不需要添加到管道上,而是添加到其中一个过程中。为了进行观察,请使用strace,例如

strace -p1234 -s99999 -e write

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

(很抱歉,如果您不理解最后一段,那么它确实需要一定的技术水平。我认为没有更简单的方法。)


谢谢,我了解。我实际尝试的是转到/ proc / $ PID / fd,在其中找到了其中一个进程的未命名管道的文件条目,并设法在外壳程序中使用简单的cat和echo读取和数据,但是这种行为有点不一致。我需要进一步调查。
jackhab 2010年

1
@jackhab:哦,我认为它不适用于管道。但是,正如您发现的那样,它对于监视流量没有太大帮助,因为来自生产者的每个字节都将恰好到达一个使用者,并且您无法控制监视器还是实际的使用者会得到它。然后,您应该能够以这种方式注入数据。
吉尔(Gilles)“所以,别再邪恶了”

2

一些对监视管道有用的工具:

管道查看器
三通

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

或者可以使用strace

strace -ewrite -p $PID 2>&1 | grep "write(1"

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


1
我的意思是窃听已经运行的进程的管道。进程A启动进程B并通过管道与之对话,因此我无法使用tee或pv之类的代理实用程序。
jackhab 2010年

添加了更多方法。
harrymc

而不是用grep,您可以指定“-e写= 1”的输出限制为写入的fd 1数据
威廉Pursell
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.