Ich habe zwei Linux-Prozesse, die über eine namenlose Pipe kommunizieren. Wie kann der Verkehr in der Leitung überwacht werden? Wie kann ich Daten in die Pipe einspeisen? Ich habe Root-Zugriff und kenne die Pipe-Inode.
Eine namenlose Pipe ist von Natur aus privat für die Anwendungen, die den Dateideskriptor haben. Es gibt keine prinzipielle Möglichkeit, den Verkehr auf der Pipe zu beobachten oder zu ändern. Ich glaube auch nicht, dass es eine Möglichkeit gibt, die Pipe direkt unter Linux zu betrachten.
Es gibt jedoch eine prinzipienlose Möglichkeit, mehr oder weniger das zu tun, wonach Sie suchen : über den Aufruf des ptrace- Systems. Sie würden nicht an sich auf das Rohr heften, sondern auf einen der Prozesse. Verwenden Sie zur Beobachtung Strace , z
strace -p1234 -s99999 -e write
Wo 1234
ist die Prozess-ID eines Prozesses, der in die Pipe schreibt? Das Ändern der Daten ist schwieriger, kann jedoch durchgeführt werden. Ich denke, der einfachste Weg wäre, zuerst einen Zwischenprozess einzurichten, der seine Standardeingabe in seine Standardausgabe kopiert, plus die Daten, die Sie einfügen möchten (und abzüglich aller Daten, die Sie unterdrücken möchten). Erstellen Sie zwei Named Pipes und starten Sie diesen Zwischenprozess mit stdin auf einem Pipe und stdout auf dem anderen. Verwenden Sie dann einen Debugger (z. B. GDB ), um beide Zielprozesse open
auf der entsprechenden Named Pipe auszuführen , und dup
platzieren Sie die Pipe dann auf dem entsprechenden Dateideskriptor. Beachten Sie, dass möglicherweise einer der Prozesse in diesem Prozess abstürzt.
(Wenn Sie den letzten Absatz nicht verstehen, tut es mir leid, aber es erfordert ein gewisses Maß an Technik. Ich glaube nicht, dass es einen einfacheren Weg gibt.)
Einige nützliche Tools zur Überwachung eines Rohrs:
Pipe Viewer
Tee
Informationen zu einem bereits laufenden Programm, bei dem die Rohrleitungen nicht gesteuert werden, finden Sie in der gdb-Methode:
Umleiten der Ausgabe eines laufenden Prozesses .
Oder man kann strace verwenden :
zeigt nur Deskriptor 1-Aufrufe an. "2> & 1" leitet stderr nach stdout um, da strace standardmäßig nach stderr schreibt.
quelle