UNIXソケット接続のもう一方の端を見つける方法は?


44

UNIXソケットを介した多くのオープン接続を持つプロセス(dbus-daemon)があります。これらの接続の1つはfd#36です。

=$ ps uw -p 23284
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
depesz   23284  0.0  0.0  24680  1772 ?        Ss   15:25   0:00 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session

=$ ls -l /proc/23284/fd/36 
lrwx------ 1 depesz depesz 64 2011-03-28 15:32 /proc/23284/fd/36 -> socket:[1013410]

=$ netstat -nxp | grep 1013410
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
unix  3      [ ]         STREAM     CONNECTED     1013410  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD

=$ netstat -nxp | grep dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013953  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013825  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013726  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013471  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013410  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1012325  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1012302  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1012289  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1012151  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011957  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011937  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011900  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011775  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011771  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011769  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011766  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011663  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011635  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011627  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011540  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011480  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011349  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011312  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011284  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011250  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011231  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011155  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011061  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011049  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011035  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011013  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1010961  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1010945  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD

接続数に基づいて、dbus-daemonは実際にはサーバーであると想定しています。大丈夫です。しかし、どのプロセスがそれに接続されているかを見つけるにはどうすればよいですか-dbus-launcherの36番目のファイルハンドルである接続を使用して?/ proc / net / unixでlsofを試してみましたが、クライアントプロセスを見つける方法がわかりません。


それはU&Lで回答されています:このUNIXソケットペアのもう一方の端は誰ですか?
-sch

回答:


25

つい最近、私は同様の問題に出くわしました。これが不可能な場合があることを知り、私はショックを受けました。私はlsof(Vic Abell)の作成者からコメントを掘り下げましたが、彼はこれがUNIXソケットの実装に大きく依存していると指摘しました。ソケットのいわゆる「エンドポイント」情報が利用できる場合と利用できない場合があります。残念ながら、彼が指摘するようにLinuxでは不可能です。

たとえば、lsofで/ proc / net / unixを使用する必要があるLinuxでは、すべてのUNIXドメインソケットにパスがバインドされていますが、エンドポイント情報はありません。多くの場合、バインドされたパスはありません。多くの場合、他のエンドポイントを特定することは不可能になりますが、これはLinuxの/ procファイルシステムの実装の結果です。

/ proc / net / unixを見ると、それが(少なくとも私のシステム上では)絶対に正しいことを自分で確認できます。サーバーの問題を追跡するときにこのような機能が不可欠だと思うので、私はまだショックを受けています。



/proc/net/unixは、あなたが掘り出したランダムドメインソケットリファレンスのターゲットファイルを教えてくれることに注意してください/proc/.../fd/
i336_

27

この回答はLinux専用です。Unix&Linux Stack Exchangeからの回答に基づいて and を使用してアクセスするカーネル内データ構造を使用して、unixドメインソケットのもう一方の端を正常に識別しました。カーネルオプションとカーネルオプションを有効にする必要があります。gdb/proc/kcoreCONFIG_DEBUG_INFOCONFIG_PROC_KCORE

を使用lsofして、ソケットのカーネルアドレスを取得できます。これは、たとえばの形式をとります0xffff8803e256d9c0。その数は、実際には関連するカーネル内メモリ構造またはタイプのアドレスですstruct unix_sock。その構造にはpeer、ソケットのもう一方の端を指すというフィールドがあります。だからコマンド

# gdb /usr/src/linux/vmlinux /proc/kcore
(gdb) p ((struct unix_sock*)0xffff8803e256d9c0)->peer

接続のもう一方の端のアドレスを出力します。lsof -Uその番号の出力をgrepして、もう一方の端のプロセスとファイル記述子番号を特定できます。

一部のディストリビューションは、カーネルデバッグシンボルを別のパッケージとして提供しているようです。これはvmlinux、上記のコマンドでファイルの代わりに使用されます。


これはおもしろそうに見えますが、カーネルを再コンパイルするための要件はやり過ぎのようです。手作りのカーネルやgdbを使用せずに、kcoreの値を覗き、値の「手動」デコードを行うだけで、おそらくそれが可能になると考えています。

3
@depesz、知る必要があるのはpeerunix_sock構造体のメンバーのオフセットだけです。私のx86_64システムでは、そのオフセットは656バイトなので、を使用してもう一方の端を取得できp ((void**)0xffff8803e256d9c0)[0x52]ます。もちろん、まだ必要CONFIG_PROC_KCOREです。
MvG

12

実際、ssfrom iproute2(netstat、ifconfigなどの置換)はこの情報を表示できます。

以下は、sshプロセスが接続したssh-agent UNIXドメインソケットを示す例です。

$ sudo ss -a --unix -p
Netid  State      Recv-Q Send-Q Local                             Address:Port          Peer    Address:Port
u_str  ESTAB      0      0      /tmp/ssh-XxnMh2MdLBxo/agent.27402 651026                *       651642                users:(("ssh-agent",pid=27403,fd=4)
u_str  ESTAB      0      0       *                                651642                *       651026                users:(("ssh",pid=2019,fd=4))

うーん。興味深い...「ピア:」列はUNIXドメインソケットにはまったく役に立たなくても、「アドレス:ポート」列を一致させることができなかった。
SamB

9

Unixソケットには通常、ペアで番号が割り当てられ、通常は連続しています。したがって、あなたのペアはおそらく1013410 +/- 1です。これら2つのどちらが存在するかを確認し、犯人を推測します。


8

MvGのgdbメソッドを使用してソケットピア情報を確実に取得するツールを作成しました。カーネルデバッグシンボルは不要です。

特定のソケットに接続されたプロセスを取得するには、それにiノード番号を渡します。

# socket_peer 1013410
3703 thunderbird 

すべてのプロセスを一度に調べるnetstat_unixには、netstatの出力に列を追加します。

# netstat_unix
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Peer PID/Program name  Path
unix  3      [ ]         STREAM     CONNECTED     6825     982/Xorg             1497/compiz            /tmp/.X11-unix/X0
unix  3      [ ]         STREAM     CONNECTED     6824     1497/compiz          982/Xorg                 
unix  3      [ ]         SEQPACKET  CONNECTED     207142   3770/chromium-brows  17783/UMA-Session-R       
unix  3      [ ]         STREAM     CONNECTED     204903   1523/pulseaudio      3703/thunderbird       
unix  3      [ ]         STREAM     CONNECTED     204902   3703/thunderbird     1523/pulseaudio           
unix  3      [ ]         STREAM     CONNECTED     204666   1523/pulseaudio      3703/thunderbird       
...

netstat_unix --dump解析しやすい出力が必要な場合は試してください。
詳細については、https://github.com/lemonsqueeze/unix_sockets_peersを参照してください。

詳細については、iノードの+ 1 / -1ハックは信頼できません。ほとんどの場合は機能しますが、運が悪ければ失敗するか、(悪い)間違ったソケットを返します。


1

system.confを編集します

このファイルには、デバッグ用にさらに多くのものを追加できます。

ファイルの場所: /etc/dbus-1/system.conf

デバッグの目的で、盗聴を許可するようにsystem.confを編集できます。

  1. ポリシーセクションを次のように置き換えます。

    <policy context="default">

    <!-- Allow everything to be sent -->

    <allow send_destination="*" eavesdrop="true"/>

    <!-- Allow everything to be received -->

    <allow eavesdrop="true"/>

    <!-- Allow anyone to own anything -->

    <allow own="*"/>

    <!-- XXX: Allow all users to connect -->

    <allow user="*"/> </policy>

  2. 同梱の行を削除します:system.d

    <includedir>system.d</includedir>

ソース:http : //old.nabble.com/dbus-send-error-td29893862.html


UNIXソケットに関するその他の便利な機能

バスで何が起こっているかを把握する最も簡単な方法はdbus-monitor、D-Busパッケージに付属のプログラムを実行することです

また、dbus-cleanup-sockets残ったソケットのクリーンアップに使用することもできます。

次のコマンドは、netstat出力に基づいて、どのプロセスが何回dbusソケットに接続されているかを示します。

sudo netstat -nap | grep dbus | grep CONNECTED | awk '{print $8}' | sort | uniq -c

(Ubuntuでテスト済み)

ハードコアな方法:このコマンドは、/ procからプロセスを手動で検索し、最も多くの接続(すべてのタイプのソケット)を使用しているプロセスを表示します。

ls -lR */fd/* | grep socket | sed -r "s@([0-9{1}]+)/fd/@_\1_@g" | awk -F_ '{print $2}' | uniq -c | sort -n | awk '{print $1" "$2; print system("ps "$2"|tail -n1")}'

出力例:

(カウント、PID、および次の行にはプロセスに関する詳細が含まれます)

25 3732
 3732 ?        Ss     0:38 /usr/bin/wineserver
89 1970
 1970 ?        Ss     0:02 //bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session

(Ubuntuでテスト済み)

楽しんで。


参照用の関連記事も参照してください。

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