2010-10-22 13 views
7

Sto cercando di accedere/analizzare tutte le connessioni in uscita su un particolare numero di porta su una macchina Linux utilizzando uno script Python. L'implementazione più semplice sembra essere quella di aprire un sottoprocesso per netstat e analizzare il suo stdout.Come accedere ai dati netstat in Python?

Immagino che qualcuno da qualche parte abbia avuto questo problema prima e sono sorpreso di non trovare alcun parser netstat online. Non è un problema abbastanza grande per le persone che sentono il bisogno di condividere?

risposta

1

Invece di analizzare l'output da netstat, è possibile esaminare la voce/proc per ogni processo per visualizzare i socket aperti. C'è un semplice perl script that does this che potresti tradurre in python.

17

Se si desidera controllare la connessione aperta da un certo processo è possibile utilizzare psutil:

>>> p = psutil.Process(1694) 
>>> p.name() 
'firefox' 
>>> p.connections() 
[connection(fd=115, family=2, type=1, local_address=('10.0.0.1', 48776), remote_address=('93.186.135.91', 80), status='ESTABLISHED'), 
connection(fd=117, family=2, type=1, local_address=('10.0.0.1', 43761), remote_address=('72.14.234.100', 80), status='CLOSING'), 
connection(fd=119, family=2, type=1, local_address=('10.0.0.1', 60759), remote_address=('72.14.234.104', 80), status='ESTABLISHED'), 
connection(fd=123, family=2, type=1, local_address=('10.0.0.1', 51314), remote_address=('72.14.234.83', 443), status='SYN_SENT')] 

Internamente psutil usa/proc. Se sei interessato alle connessioni da/verso un particolare numero di porta a livello di sistema, potresti dare un'occhiata a come lo implementa psutil.

Edit: a partire da psutil 2.1.0 si può anche raccogliere connessioni a livello di sistema utilizzandonet_connections():

>>> import psutil 
>>> psutil.net_connections() 
[pconn(fd=115, family=2, type=1, laddr=('10.0.0.1', 48776), raddr=('93.186.135.91', 80), status='ESTABLISHED', pid=1254), 
pconn(fd=117, family=2, type=1, laddr=('10.0.0.1', 43761), raddr=('72.14.234.100', 80), status='CLOSING', pid=2987), 
pconn(fd=-1, family=2, type=1, laddr=('10.0.0.1', 60759), raddr=('72.14.234.104', 80), status='ESTABLISHED', pid=None), 
pconn(fd=-1, family=2, type=1, laddr=('10.0.0.1', 51314), raddr=('72.14.234.83', 443), status='SYN_SENT', pid=None) 
...] 
+0

psutil è davvero bello! Ho iniziato a usarlo di recente ed è un risparmiatore di vita! Complimenti agli autori! – fccoelho

+0

felice che ti sia piaciuto –

+1

Aggiornamento: la nuova versione 2.1.0 è in grado di elencare le connessioni socket a livello di sistema: http://grodola.blogspot.com/2014/04/reimplementing-netstat-in-cpython.html –

Problemi correlati