Frage Wie finde ich das andere Ende der Unix Socket Verbindung?


Ich habe einen Prozess (dbus-Daemon), der viele offene Verbindungen über UNIX-Sockets hat. Eine dieser Verbindungen ist 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

Basierend auf Nummernverbindungen nehme ich an, dass dbus-daemon tatsächlich Server ist. Was ist in Ordnung. Aber wie kann ich herausfinden, welcher Prozess damit verbunden ist - unter Verwendung der Verbindung, die das 36. Datei-Handle in dbus-Launcher ist? Versuchte lsof und sogar greps auf / proc / net / unix, aber ich finde keine Möglichkeit, den Client-Prozess zu finden.


38
2018-03-28 13:35


Ursprung


Das wird auf U & L beantwortet: Wer hat das andere Ende dieses Unix-Sockelpaars? - sch


Antworten:


Vor kurzem bin ich auf ein ähnliches Problem gestoßen. Ich war schockiert, als ich herausfand, dass es Fälle gibt, in denen dies nicht möglich ist. Ich habe einen Kommentar vom Schöpfer von lsof (Vic Abell) ausgegraben, in dem er darauf hingewiesen hat, dass dies stark von der Unix-Socket-Implementierung abhängt. Manchmal sind so genannte "Endpunkt" -Informationen für den Socket verfügbar und manchmal nicht. Leider ist es in Linux unmöglich, wie er betont.

Unter Linux zum Beispiel, wo lsof muss   Verwenden Sie / proc / net / unix, alle UNIX-Domänen   Sockets haben einen gebundenen Pfad, aber nein   Endpunktinformationen. Oft gibt es   kein gebundener Pfad Das macht es oft   unmöglich, den anderen zu bestimmen   Endpunkt, aber es ist ein Ergebnis der   Linux / proc Dateisystem   Implementierung.

Wenn du dir / proc / net / unix anschaust, kannst du selbst sehen, dass er (zumindest auf meinem System) absolut recht hat. Ich bin immer noch schockiert, weil ich solche Funktionen für die Verfolgung von Serverproblemen unentbehrlich finde.


23
2018-06-03 09:03



Referenz: groups.google.com/forum/#!topic/comp.unix.admin/iZLsq5dHdyI - estani
Beachten Sie, dass /proc/net/unix Wird Ihnen die Zieldatei einer zufälligen Domain-Socket-Referenz mitteilen, aus der Sie gegraben haben /proc/.../fd/. - i336_


Diese Antwort gilt nur für Linux. Beyogen auf eine Antwort aus dem Unix & Linux Stack Exchange, I erfolgreich identifiziert das andere Ende eines Unix-Domain-Sockets mit Kernel-Datenstrukturen, auf die mit zugegriffen wird gdb und /proc/kcore. Sie müssen das aktivieren CONFIG_DEBUG_INFO und CONFIG_PROC_KCORE Kerneloptionen.

Sie können verwenden lsof um die Kernel-Adresse des Sockets zu erhalten, die die Form eines Zeigers, z.B. 0xffff8803e256d9c0. Diese Nummer ist tatsächlich die Adresse der relevanten Kernel-Speicherstruktur oder des -Typs struct unix_sock. Diese Struktur hat ein Feld namens peer welches auf das andere Ende des Sockels zeigt. Also die Befehle

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

Druckt die Adresse des anderen Endes der Verbindung. Sie können die Ausgabe von lsof -U für diese Nummer, um die Prozess- und Dateideskriptornummer dieses anderen Endes zu identifizieren.

Einige Distributionen scheinen Kernel - Debug - Symbole als separates Paket zu bieten, das den Platz des vmlinux Datei im obigen Befehl.


23
2017-08-15 20:31



Das sieht interessant aus, aber die Notwendigkeit, den Kernel neu zu kompilieren, scheint ein Overkill zu sein. Ich denke, dass es möglich wäre, es ohne handgemachten Kernel und ohne gdb zu machen, indem man einfach Werte in kcore ansieht und eine "manuelle" Decodierung der Werte vornimmt.
@depesz, alles, was Sie wissen müssen, ist der Offset der peer Mitglied in der unix_sock Struktur. Auf meinem x86_64-System ist dieser Offset 656 Bytes, also könnte ich das andere Ende mit verwenden p ((void**)0xffff8803e256d9c0)[0x52]. Du brauchst immernoch CONFIG_PROC_KCOREoffensichtlich. - MvG


Unix-Sockets meistens sind Nummern paarweise zugeordnet und sind normalerweise aufeinanderfolgend. Das Paar wäre also wahrscheinlich 1013410 +/- 1. Sehen Sie, welche von diesen beiden existiert und erraten Sie den Schuldigen.


9
2018-01-26 22:13





Tatsächlich, ss von iproute2 (Ersatz für Netstat, ifconfig usw.) kann diese Informationen anzeigen.

Hier ist ein Beispiel, das einen ssh-agent-Unix-Domain-Socket zeigt, dem a ssh Prozess hat verbunden:

$ 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))

8
2018-03-06 13:01



Hmm. Interessant ... Ich hatte übersehen, dass die "Address: Port" -Spalten angepasst werden können, obwohl die "Peer" -Spalte für Unix-Domain-Sockets völlig nutzlos ist. - SamB


Ich schrieb ein Werkzeug welches MvGs benutzt gdb-Methode Um zuverlässig Socket-Peer-Informationen zu erhalten, werden Kernel-Debug-Symbole nicht benötigt.

Um den Prozess mit einem bestimmten Socket zu verbinden, übergeben Sie ihm die Inode-Nummer:

# socket_peer 1013410
3703 thunderbird 

Um herauszufinden, für alle Prozesse auf einmal netstat_unixEs fügt eine Spalte zu Netstats Ausgabe hinzu:

# 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       
...

Versuchen netstat_unix --dump Wenn Sie eine Ausgabe benötigen, die leicht zu analysieren ist.
Sehen https://github.com/lemonsqueeze/unix_sockets_peers für Details.

Für Informationen, die Inode + 1 / -1 Hack ist nicht zuverlässig. Es funktioniert die meiste Zeit, aber wird fehlschlagen oder (schlimmer) den falschen Sockel zurückgeben, wenn Sie Pech haben.


6
2017-11-14 14:44



Sehr nützlich, danke für die Skripte! - Tonin


Bearbeiten Sie Ihre system.conf

In dieser Datei könnten Sie weitere Dinge zum Debuggen hinzufügen.

Speicherort: /etc/dbus-1/system.conf

Zu Debuggingzwecken können Sie Ihre system.conf bearbeiten, um sie zu erlauben   lauschen:

  1. Ersetzen Sie den Richtlinienabschnitt durch:

    <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. Entferne die includedir Zeile: system.d

    <includedir>system.d</includedir> 

Quelle: http://old.nabble.com/dbus-send-error-td29893862.html


Einige andere nützliche Dinge in Bezug auf Unix-Sockets

Der einfachste Weg, um herauszufinden, was im Bus passiert, ist das Ausführen der dbus-monitor Programm, das mit dem D-Bus-Paket geliefert wird

Auch Sie können versuchen zu verwenden dbus-cleanup-sockets um übrig gebliebene Steckdosen zu säubern.

Der folgende Befehl zeigt Ihnen, welcher Prozess wie oft mit dbus Sockets verbunden ist netstat Ausgabe:

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

(getestet auf Ubuntu)

Hardcore-Weg: Dieser Befehl findet manuell die Prozesse von / proc und show, die die meisten Verbindungen (alle Arten von Sockets) verwenden:

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")}'

Beispielausgabe:

(Anzahl, PID und die nächste Zeile enthält Details zum Prozess)

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

(getestet auf Ubuntu)

Habe Spaß.


Siehe auch verwandte Artikel für die Referenz:


1
2017-09-19 16:25