2010-06-07 10 views

risposta

1

È possibile utilizzare netstat -lnp, l'ultima colonna conterrà pid e nome processo. In Python puoi analizzare l'output di questo comando.

4

Se non si desidera analizzare l'output di un programma come netstat o lsof, è possibile eseguire l'analisi tramite il file system/proc e cercare di trovare la documentazione sui file all'interno. /proc/<pid>/net/tcp potrebbe essere particolarmente interessante per te. Naturalmente, il formato di questi file potrebbe cambiare tra versioni del kernel, quindi l'output del comando parsing è generalmente considerato più affidabile.

21

Ci sono due parti per la mia risposta:

1. Ottenere le informazioni nel guscio

Per la prima parte, netstat avrebbe funzionato, ma io preferisco usare lsof, dal momento che può essere utilizzato per estrarre un elenco più informativo e conciso. Le opzioni precise da utilizzare può variare in base alla OS, kernel e compilazione opzioni, ma credo che si desidera qualcosa di simile:

lsof -a -p23819 -i4 

Dove 23819 è il PID si sta selezionando per, e i4 denota tutti i socket IPv4 (sebbene tu possa volere i6 per IPv6, a seconda dei casi). Da lì, puoi passare attraverso grep per selezionare solo i socket di ascolto.

lsof -a -p23819 -i4 | grep LISTEN 

(In lsof versione 4.82, è possibile inoltre utilizzare il flag -sTCP:LISTEN invece di grep per selezionare i socket di ascolto, anche se questa opzione non sembra essere disponibile di nuovo nella versione 4,78)

2. chiamata lsof da Python

Si dovrebbe essere in grado di chiamare lsof e leggere l'output, da Python, utilizzando il modulo subprocess, in questo modo:

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

Spero che questo aiuti!

15

È possibile utilizzare 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')] 

... Per filtrare per prese di ascolto:

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

Grazie. psutil è un buon modulo. Ma l'unico problema è che l'utilizzo del modulo richiede che sia installato prima. E l'installazione di psutil richiede l'installazione di header gcc e python. Quindi il progetto che usa psutil sarebbe difficile da installare. – mtoloo

+0

psutil ha bisogno di gcc perché contiene codice C che deve essere compilato. Non direi che sia così difficile da installare, specialmente su Linux. Su Ubuntu, ad esempio, devi semplicemente "apt-get install python-dev" e "pip install psutil" e il gioco è fatto. –

0

Una cosa che non è stata menzionata. La maggior parte delle applicazioni port in python utilizza un argomento della riga di comando. È possibile analizzare/proc/pid/cmdline e analizzare il numero di porta. Questo evita il sovraccarico dell'utilizzo di ss o netstat sui server con un sacco di connessioni.

Problemi correlati