GNU/Linux >> Tutoriels Linux >  >> Linux

API Linux pour déterminer les sockets appartenant à un processus

Pour déterminer les sockets appartenant à un processus, vous pouvez simplement utiliser netstat . Voici un exemple avec sortie (raccourci) de netstat avec des options qui feront ce que vous voulez.

$ 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

Assurez-vous d'exécuter netstat en tant que root, sinon vous obtiendrez ce message :

(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)

Une explication du -apeen options de la page de manuel netstat :

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

Je pense que vous devez d'abord parcourir les fds ouverts dans /proc/*/fd, par exemple

4 -> socket:[11147]

puis recherchez les sockets référencés (par l'inode) dans /proc/net/tcp (ou /proc/net/udp), par exemple

12: B382595D:8B40 D5C43B45:0050 01 00000000:00000000 00:00000000 00000000  1000        0 11065 1 ffff88008bd35480 69 4 12 4 -1

Le /proc filesystem fournit des détails sur chaque processus, y compris des informations sur le réseau. Les informations sur les sockets ouverts sont répertoriées dans /proc/net/tcp . Les sockets IPv6 sont répertoriés séparément dans le tcp6 dossier. Les informations de socket incluent des informations telles que les ports locaux et distants, et le numéro d'inode de socket, qui peuvent être mappés au processus en analysant le /proc/{pid}/fd/* informations.

Si vous n'êtes pas familier avec le /proc système de fichiers, il s'agit essentiellement d'un système de fichiers virtuel qui permet au noyau de publier toutes sortes d'informations utiles dans l'espace utilisateur. Les fichiers sont normalement de simples fichiers texte structurés faciles à analyser.

Par exemple, sur mon système Ubuntu, j'ai utilisé netcat pour les tests, et a exécuté nc -l -p 8321 pour écouter sur le port 8321. En regardant le tcp informations sur la prise :

$ 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                              

La première ligne montre qu'il écoute sur toutes les adresses jusqu'au point 8321 (0x2081). Le numéro d'inode est 26442, que nous pouvons utiliser pour rechercher le pid correspondant dans /proc/{pid}/fd/* , qui consiste en un ensemble de liens symboliques entre le numéro de descripteur de fichier et le périphérique. Donc, si nous recherchons le pid pour netcat , et vérifiez son fd mappage :

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

Et là, nous voyons que le descripteur de fichier 3 dans ce processus est mappé sur le socket avec l'inode 26442, comme prévu.

Alors évidemment pour construire une carte complète des sockets, il faudra d'abord énumérer tous les /proc/**/fd/* fichiers, recherchez les liens symboliques du socket, puis faites correspondre l'inode du socket avec les tables de /proc/net/tcp qui contient les informations sur le point de terminaison.

C'est ainsi que le lsof l'outil fonctionne (voir lsof/dialects/linux/dsocket.c pour la mise en œuvre).

  • Wikipédia sur procfs
  • Le système de fichiers Linux /proc en tant qu'outil de programmation

Linux
  1. Comment installer vtop sur Linux

  2. Processus de démarrage Linux

  3. Comment déterminer quel processus écrit sur le disque sous Linux

  4. Créer un processus Linux ?

  5. Créer un démon sous Linux

Comment tuer un processus sous Linux

Commande Ps sous Linux (liste des processus)

Commande Pstree sous Linux

Commande Kill sous Linux

Surveillance des processus sous Linux

Comment tuer un processus sous Linux