Um Sockets zu ermitteln, die einem Prozess gehören, können Sie einfach netstat
verwenden . Hier ist ein Beispiel mit Ausgabe (gekürzt) von netstat
mit Optionen, die tun, was Sie wollen.
$ sudo netstat -apeen
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 127.0.0.1:8118 0.0.0.0:* LISTEN 138 744850 13248/privoxy
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 117 9612 2019/postgres
udp 0 0 127.0.0.1:51960 127.0.0.1:51960 ESTABLISHED 117 7957 2019/postgres
udp 0 0 0.0.0.0:68 0.0.0.0:* 0 7740 1989/dhclient
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 7937 2019/postgres /var/run/postgresql/.s.PGSQL.5432
unix 2 [ ACC ] STREAM LISTENING 958058 8080/emacs /tmp/emacs1000/server
unix 2 [ ACC ] STREAM LISTENING 6969 1625/Xorg /tmp/.X11-unix/X0
unix 2 [ ] DGRAM 9325 1989/dhclient
unix 3 [ ] STREAM CONNECTED 7720 1625/Xorg @/tmp/.X11-unix/X0
Stellen Sie sicher, dass Sie netstat als root ausführen, sonst erhalten Sie diese Meldung:
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Eine Erklärung zu -apeen
Optionen von der Netstat-Manpage:
-a, --all
Show both listening and non-listening sockets. With the
--interfaces option, show interfaces that are not up
-p, --program
Show the PID and name of the program to which each socket
belongs.
-e, --extend
Display additional information. Use this option twice for
maximum detail.
--numeric , -n
Show numerical addresses instead of trying to determine symbolic host, port or user names.
--numeric-hosts
shows numerical host addresses but does not affect the resolution of port or user names.
--numeric-ports
shows numerical port numbers but does not affect the resolution of host or user names.
--numeric-users
shows numerical user IDs but does not affect the resolution of host or port names.
Ich denke, Sie müssen zuerst die offenen fds in /proc/*/fd durchsuchen, z. B.
4 -> socket:[11147]
und suchen Sie dann nach den referenzierten Sockets (durch den Inode) in /proc/net/tcp (oder /proc/net/udp), z. B.
12: B382595D:8B40 D5C43B45:0050 01 00000000:00000000 00:00000000 00000000 1000 0 11065 1 ffff88008bd35480 69 4 12 4 -1
Die /proc
filesystem bietet Details zu jedem Prozess, einschließlich Netzwerkinformationen. Open-Socket-Informationen sind in /proc/net/tcp
aufgeführt . Die IPv6-Sockets sind separat im tcp6
aufgeführt Datei. Die Socket-Informationen umfassen Informationen wie die lokalen und entfernten Ports und die Socket-Inode-Nummer, die dem Prozess durch Analysieren von /proc/{pid}/fd/*
zugeordnet werden kann Informationen.
Wenn Sie mit /proc
nicht vertraut sind Dateisystem handelt es sich im Grunde um ein virtuelles Dateisystem, das es dem Kernel ermöglicht, alle möglichen nützlichen Informationen im Userspace zu veröffentlichen. Die Dateien sind normalerweise einfach strukturierte Textdateien, die einfach zu analysieren sind.
Auf meinem Ubuntu-System habe ich beispielsweise netcat
verwendet zum Testen und führte nc -l -p 8321
aus um auf Port 8321 zu lauschen. Betrachten Sie die tcp
Socket-Informationen:
$ cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:2081 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1000 0 26442 1 de0c8e40 300 0 0 2 -1
1: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 7019 1 de0c84c0 300 0 0 2 -1
Die erste Zeile zeigt, dass alle Adressen bis Punkt 8321 (0x2081) abgehört werden. Die Inode-Nummer ist 26442, die wir verwenden können, um die passende PID in /proc/{pid}/fd/*
nachzuschlagen , die aus einer Reihe symbolischer Links von der Dateihandlenummer zum Gerät besteht. Wenn wir also die PID für netcat
nachschlagen , und prüfen Sie dessen fd
Zuordnung:
$ ls -l /proc/7266/fd
total 0
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 0 -> /dev/pts/1
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 1 -> /dev/pts/1
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 2 -> /dev/pts/1
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 3 -> socket:[26442]
Und da sehen wir, dass Dateideskriptor 3 in diesem Prozess wie erwartet auf den Socket mit Inode 26442 abgebildet wird.
Um also eine vollständige Socket-Karte zu erstellen, müssen Sie zunächst alle /proc/**/fd/*
aufzählen Dateien, sehen Sie sich die Socket-Symlinks an und gleichen Sie dann den Socket-Inode mit den Tabellen aus /proc/net/tcp
ab die die Endpunktinformationen enthält.
So funktioniert der lsof
Werkzeug funktioniert (siehe lsof/dialects/linux/dsocket.c
für die Umsetzung).
- Wikipedia auf procfs
- Das /proc-Dateisystem von Linux als Programmierwerkzeug