回答:
短い答えはノーであり、簡単ではありません。
Linuxでは、lsofは/proc/net/unix
UNIXドメインソケットに関する情報の取得に依存しています。このインターフェースは、バインドされたすべてのソケットをリストしますが、エンドポイントを追跡しません。そのため、存在するソケットは確認できますが、それらに接続されているソケットは確認できません。この情報が追跡されている場所では、追跡する必要があります。そうしないと、ソケット接続が機能しません。接続情報を取得するメカニズムはまだ見つかっていません。
スニッフィングの質問はもう少し興味深いですが、それよりも残念なことです。「簡単ではない」とは、データをこっそりつかみ取るためのフックが存在しないことを意味します。最も近いアナログは、tcpdumpまたはWiresharkを使用しています。どちらもlibpcapを使用して、実際に重い作業を行います。ネットワーク(AF_INET)とUNIXドメイン(AF_UNIX)はどちらもsocket()
関数呼び出しを使用して作成されますが、どちらもデータconnect()
への接続、使用read()
、およびwrite()
処理に使用されますが、これらは異なるカーネルサブシステムによって処理されます。これには、libpcapがUNIXドメインソケットで動作するように設計されていないという残念な副作用があります。
この問題には、少し薄暗い部分があります。のマニュアルページをご覧くださいrecv(2)
。これは、read()
使用する低レベルのシステムコールです。recv()
と呼ばれるためのフラグが存在しMSG_PEEK
ます。これにより、UNIXドメインソケットを通過するトラフィックを傍受できます。つまり、これは明るい面であり、暗い面は、私の知る限り、これを行うように設計された現在のアプリケーションは存在しないということです。だからあなたはいくつかの開発努力を見ています。
私はあなたの質問の両方の部分にF'YEAHの素晴らしく単純な答えがあったことを本当に望みます。
はい、できます。必要なのはsystemtapだけです。
指定されたiノードを読み書きするプログラムのPIDとプロセス名を出力するsystemtapスクリプトの例の 1つを検討してください(Unixドメインソケットはまさにそのようなものです)。
このスクリプトを簡単に変更して、読み書きされる実際のデータを出力できます。読者への演習としてそうします。
これは主要な質問への回答ではないことはわかっていますが、ここではソケットの通信を傍受するだけで検索を終了しました。私のような人のために投稿することにしました。ここに私がそれをした方法があります:
$> 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をそのままにしておくことができます。それが誰かを助けることを願っています。