Überwachung des Interprocess-Pipe-Verkehrs

13

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.

Jackhab
quelle

Antworten:

7

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 1234ist 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 openauf der entsprechenden Named Pipe auszuführen , und dupplatzieren 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.)

Gilles 'SO - hör auf böse zu sein'
quelle
Danke, ich verstehe. Was ich tatsächlich versucht habe, ist nach / proc / $ PID / fd zu gehen, wo ich die Dateieinträge für die unbenannten Pipes eines der Prozesse gefunden habe und es geschafft habe, mit einfacher Katze und Echo in der Shell zu lesen und Daten zu erstellen, aber das Verhalten etwas inkonsistent. Ich muss weiter nachforschen.
Jackhab
1
@ Jackhab: Oh, ich dachte, es funktioniert nicht für Rohre. Aber wie Sie herausgefunden haben, hilft es Ihnen nicht so viel bei der Überwachung des Datenverkehrs, da jedes Byte des Herstellers an genau einen Verbraucher geht und Sie nicht steuern können, ob Ihr Monitor oder der tatsächliche Verbraucher es erhält. Sie sollten dann in der Lage sein, Daten auf diese Weise zu injizieren.
Gilles 'SO - hör auf böse zu sein'
2

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 :

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

zeigt nur Deskriptor 1-Aufrufe an. "2> & 1" leitet stderr nach stdout um, da strace standardmäßig nach stderr schreibt.

harrymc
quelle
1
Was ich damit gemeint habe, ist das Abhören der Leitung eines bereits laufenden Prozesses. Prozess A startet Prozess B und kommuniziert mit ihm über eine Pipe, sodass ich keine Möglichkeit habe, Proxy-Dienstprogramme wie Tee oder PV zu verwenden.
Jackhab
Weitere Methoden hinzugefügt.
Harrymc
Anstatt grep zu verwenden, können Sie "-e write = 1" angeben, um die Ausgabe auf Daten zu beschränken, die in fd 1 geschrieben wurden.
William Pursell