web-dev-qa-db-ja.com

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

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

13
jackhab

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

ただし、目的の操作を多かれ少なかれ実行するための無原則な方法があります。 ptrace システムコールを使用します。パイプ自体ではなく、プロセスの1つにタックします。観察には、 strace を使用します。例:.

strace -p1234 -s99999 -e write

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

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

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

パイプビューア
tee

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

または、 strace :を使用できます。

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

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

2
harrymc