2010-10-22 10 views
7

Estoy tratando de tener que acceder/analizar todas las conexiones salientes en un número de puerto particular en una máquina Linux usando una secuencia de comandos de Python. La implementación más simple parece ser abrir un subproceso para netstat y analizar su stdout.¿Cómo accedo a los datos de netstat en Python?

Imagino que alguien en alguna parte ha tenido este problema antes, y estoy sorprendido de no encontrar ningún analizador de netstat en línea. ¿Esto no es lo suficientemente importante como para que la gente sienta la necesidad de compartir?

Respuesta

1

En lugar de analizar la salida de netstat, puede mirar a través de la entrada/proc para cada proceso para ver los sockets abiertos. Hay un perl script that does this bastante simple que puedes traducir a python.

17

Si desea controlar la conexión abierta por un cierto proceso puede utilizar 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 utiliza psutil/proc. Si le interesan las conexiones a/desde un número de puerto particular a nivel del sistema, puede echar un vistazo a cómo lo implementa psutil.

Editar: a partir de psutil 2.1.0 también se puede recoger conexiones de todo el sistema usando net_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 es realmente bueno! ¡Empecé a usarlo recientemente y es un salvavidas! Felicitaciones a los autores! – fccoelho

+0

contento de que lo haya disfrutado –

+1

Actualización: la nueva versión 2.1.0 puede mostrar las conexiones de socket de todo el sistema: http://grodola.blogspot.com/2014/04/reimplementing-netstat-in-cpython.html –

Cuestiones relacionadas