2010-06-07 4 views

Répondre

1

Vous pouvez utiliser netstat -lnp, la dernière colonne contiendra le nom du processus et du pid. En Python, vous pouvez analyser la sortie de cette commande.

4

Si vous ne voulez pas analyser la sortie d'un programme comme netstat ou lsof, vous pouvez parcourir le système de fichiers/proc et essayer de trouver la documentation sur les fichiers qu'il contient. /proc/<pid>/net/tcp pourrait être particulièrement intéressant pour vous. Bien sûr, le format de ces fichiers peut changer entre les versions du noyau, donc la sortie de la commande d'analyse est généralement considérée comme plus fiable.

21

Il y a deux parties à ma réponse:

1. Obtenir les informations contenues dans la coquille

Pour la première partie, netstat fonctionnerait, mais je préfère utiliser lsof, car il peut être utilisé extraire une liste plus informative et concise. Les options exactes à utiliser peut varier en fonction de votre système d'exploitation, les options du noyau et de compilation, mais je crois que vous voulez quelque chose comme ceci:

lsof -a -p23819 -i4 

23819 est le PID que vous sélectionnez pour, et i4 désigne tous les sockets IPv4 (mais vous pouvez vouloir i6 pour IPv6, selon le cas). De là, vous pouvez passer par grep pour sélectionner uniquement les sockets d'écoute.

lsof -a -p23819 -i4 | grep LISTEN 

(Dans lsof la version 4,82, vous pouvez en outre utiliser le drapeau -sTCP:LISTEN au lieu de grep pour sélectionner les prises d'écoute, bien que cette option ne semble pas être disponible retour dans la version 4,78)

2. appel lsof de Python

Vous devriez être en mesure d'appeler lsof et lire la sortie, à partir de Python, en utilisant le module subprocess, comme ceci:

from subprocess import Popen, PIPE 
p1 = Popen(['lsof', '-a', '-p23819', '-i4'], stdout=PIPE) 
p2 = Popen(["grep", "LISTEN"], stdin=p1.stdout, stdout=PIPE) 
output = p2.communicate()[0] 

Espérons que cela aide!

15

Vous pouvez utiliser psutil:

>>> import psutil 
>>> p = psutil.Process(2549) 
>>> p.name() 
'proftpd: (accepting connections)' 
>>> p.connections() 
[connection(fd=1, family=10, type=1, local_address=('::', 21), remote_address=(), status='LISTEN')] 

... Pour filtrer les prises d'écoute:

>>> [x for x in p.get_connections() if x.status == psutil.CONN_LISTEN] 
[connection(fd=1, family=10, type=1, local_address=('::', 21), remote_address=(), status='LISTEN')] 
>>> 
+0

Merci. psutil est un bon module. Mais le seul problème est que l'utilisation du module nécessite d'être installé en premier. Et l'installation de psutil nécessite les en-têtes gcc et python à installer. Donc, le projet utilisant psutil serait difficile à installer. – mtoloo

+0

psutil a besoin de gcc car il contient du code C qui doit être compilé. Je n'irais pas jusqu'à dire que c'est si difficile à installer, surtout sur Linux. Sur Ubuntu, par exemple, vous avez simplement besoin de "apt-get install python-dev" et "pip install psutil" et vous avez terminé. –

0

Une chose qui n'a pas été mentionné. La plupart des applications de port dans python prennent un argument de ligne de commande. Vous pouvez analyser/proc/pid/cmdline et analyser le numéro de port. Cela évite l'utilisation de ss ou netstat sur les serveurs avec une tonne de connexions.

Questions connexes