プロセス間パイプトラフィックを監視する


13

名前のないパイプを介して通信する2つのLinuxプロセスがあります。パイプ内のトラフィックを監視するにはどうすればよいですか?パイプにデータを注入するにはどうすればよいですか?rootアクセス権があり、パイプのiノードを知っています。

回答:


7

名前のないパイプは、本来、ファイル記述子を持つアプリケーション専用です。パイプ上のトラフィックを観察または変更する原則的な方法はありません。Linuxでパイプを直接見る方法もないと思います。

ただし、ptraceシステムコールを介して、多かれ少なかれあなたが行っていることを行う、簡単な方法があります。パイプ自体にタックするのではなく、プロセスの1つにタックします。観察するには、たとえばstraceを使用します。

strace -p1234 -s99999 -e write

どこ1234パイプに書き込みプロセスのプロセスIDです。データの変更は困難ですが、実行できます。最も簡単な方法は、最初に、標準入力を標準出力にコピーする中間プロセスをセットアップし、さらに、注入するデータ(および抑制したいデータを差し引く)を設定することだと思います。2つの名前付きパイプを作成し、一方のパイプでstdinを使用し、もう一方のパイプでstdoutを使用して、中間プロセスを開始します。次に、デバッガー(GDBなど)を使用して、両方のターゲットプロセスをopen適切な名前付きパイプで実行しdup、パイプを適切なファイル記述子に配置します。プロセス内のプロセスの1つがクラッシュする可能性があることに注意してください。

(最後の段落がわからなければ申し訳ありませんが、ある程度の技術が必要です。もっと簡単な方法はないと思います。)


ありがとう、わかりました。私が実際に試したことは/ proc / $ PID / fdに行き、そこでプロセスの1つの名前のないパイプのファイルエントリを見つけ、シェルで単純な猫とエコーを使用してデータを読み取ることができましたが、動作は多少矛盾。さらに調査する必要があります。
jackhab 2010

1
@jackhab:ああ、パイプには使えないと思った。しかし、ご存じのように、プロデューサーからの各バイトは1つのコンシューマーに送信され、モニターまたは実際のコンシューマーがそれを取得するかどうかを制御できないため、トラフィックの監視にはそれほど役立ちません。その方法でデータを注入できるはずです。
Gilles「SO-邪悪なことをやめ

2

パイプの監視に役立ついくつかのツール:

パイプビューア
ティー

パイプを制御しない、既に実行中のプログラムについては、gdbメソッド:
実行中のプロセスからの出力のリダイレクトを参照してください。

または、straceを使用することもできます。

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

は、記述子1の呼び出しのみを示しています。「2>&1」は、straceがデフォルトでstderrに書き込むため、stderrをstdoutにリダイレクトします。


1
私が意味したのは、すでに実行中のプロセスのパイプへの盗聴です。プロセスAがプロセスBを起動し、パイプを介してプロセスBと通信するため、teeやpvなどのプロキシユーティリティを使用する方法がありません。
jackhab 2010

いくつかのメソッドを追加しました。
harrymc

grepを使用する代わりに、「
e
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.