Lisez «/ proc» pour savoir si un processus a ouvert un port

13

J'ai besoin de savoir si un processus avec un PID donné a ouvert un port sans utiliser de commandes externes. Je dois alors utiliser le /procsystème de fichiers. Je peux lire le /proc/$PID/net/tcpfichier par exemple et obtenir des informations sur les ports TCP ouverts par le processus. Cependant, sur un processus multithread, le /proc/$PID/task/$TIDrépertoire contient également un net/tcpfichier. Ma question est :

dois-je parcourir tous les net/tcpfichiers de threads , ou le port ouvert par les threads sera-t-il écrit dans le net/tcpfichier de processus .

rmonjo
la source

Réponses:

23

Je peux lire le fichier / proc / $ PID / net / tcp par exemple et obtenir des informations sur les ports TCP ouverts par le processus.

Ce fichier n'est pas une liste de ports TCP ouverts par le processus . Il s'agit d'une liste de tous les ports TCP ouverts dans l'espace de noms réseau actuel, et pour les processus s'exécutant dans le même espace de noms réseau est identique au contenu de /proc/net/tcp.

Pour trouver les ports ouverts par votre processus, vous devez obtenir une liste de descripteurs de socket /proc/<pid>/fd, puis faire correspondre ces descripteurs au inodechamp de /proc/net/tcp.

larsks
la source
Merci pour votre réponse. Et si le processus est multithread, dois-je parcourir tout le fdrépertoire de chaque thread? Ou le /proc/pid/fdrépertoire "hérite-t-il" des /proc/pid/task/tid/fdrépertoires?
rmonjo
Je ne suis pas sûr, mais cela semble être une chose facile à tester.
larsks
8
@rmonjo Threads ne peut pas ouvrir de fichiers, seuls les processus le peuvent. Le fdrépertoire d'un thread ne fait que répéter le fdrépertoire du processus.
Gilles 'SO- arrête d'être méchant'
0

S'il vous plaît

cat /proc/$PID/net/tcp

et vous obtiendrez une sortie comme celle-ci

  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
  0: 00000000:01BB 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 2891985097 1 0000000000000000 100 0 0 10 0

La deuxième colonne (adresse_locale) de la sortie affiche le port en hexadécimal. Utilisez votre calculatrice de programmation pour convertir le code hexadécimal en décimal.

Par exemple ici, le port: 01BB (en hexadécimal) est égal à 433 (en décimal) qui est le port HTTPS par défaut.

PHZ.fi-Pharazon
la source