はい、できます。必要なのは systemtap だけです。
指定された inode を読み書きするプログラムの PID とプロセス名を表示する systemtap スクリプトの例の 1 つを考えてみましょう (Unix ドメイン ソケットはまさにそのようなものです)。
このスクリプトを簡単に変更して、読み取り/書き込み中の実際のデータを出力できます。これは、読者の演習として残しておきます。
短い答えはノーであり、簡単ではありません。
Linux では lsof は /proc/net/unix
に依存しています UNIX ドメイン ソケットに関する情報を取得します。このインターフェースはバインドされたソケットをすべてリストしますが、しない エンドポイントを追跡します。 できます どのソケットが存在するかはわかりますが、それらに接続されているものはわかりません。この情報はどこかにある そうしないと、ソケット接続が機能しません。接続情報を取得するメカニズムをまだ見つけていません。
スニッフィングの質問はもう少し興味深いものですが、残念なことでもあります。 「簡単ではない」というのは、そのデータに忍び込んで把握するためのフックが存在しないということです。最も近いアナログは tcpdump または Wireshark を使用しており、どちらも実際に重い作業を行うために libpcap を使用しています。ネットワーク (AF_INET) と UNIX ドメイン (AF_UNIX) はどちらも socket()
を使用して作成されますが、 関数呼び出し、両方とも connect()
を使用 接続するには、両方とも read()
を使用します と write()
データを処理するために、それらは異なるカーネル サブシステムによって処理されます。これには、libpcap が UNIX ドメイン ソケットで動作するように設計されていないという不幸な副作用があります。
この問題には、わずかに薄暗い側面があります。 recv(2)
の man ページを見てください。 .これは read()
という下位レベルのシステム コールです。 を利用します。 recv()
のフラグが存在します MSG_PEEK
と呼ばれる .これにより、UNIX ドメイン ソケットを通過するトラフィックを傍受できます。それが明るい面であり、暗い面は、私の知る限り、これを行うように設計された現在のアプリケーションが存在しないことです.つまり、開発作業を検討しているのです。
あったらいいのに あなたの質問の両方の部分に対する F'YEAH の素敵でシンプルな答え.
これが主要な質問への回答ではないことはわかっていますが、ソケットでの通信の盗聴を探してここにたどり着きました.私のような他の人のために投稿することにしました.これが私がそれをした方法です:
<ブロック引用>$> sudo socat -t100 -x -v UNIX-LISTEN:/var/run/php5-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT:/var/run/php5-fpm.sock
-x を削除して、ASCII 通信用に -v をそのままにしておくことができます。誰かの役に立てば幸いです。