GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux-API zum Ermitteln von Sockets, die einem Prozess gehören

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

Linux
  1. So installieren Sie vtop unter Linux

  2. Linux – Netzwerkzugriff eines Prozesses blockieren?

  3. Einführung in Linux-Threads – Teil I

  4. Linux-Startvorgang

  5. So bestimmen Sie, welcher Prozess in Linux auf die Festplatte schreibt

So beenden Sie einen Prozess in Linux

Ps-Befehl in Linux (Prozesse auflisten)

Pstree-Befehl unter Linux

Kill-Befehl unter Linux

Prozessüberwachung unter Linux

Wie man einen Prozess unter Linux beendet