2010-10-22 2 views
7

Я пытаюсь получить/разобрать все исходящие соединения на конкретном номере порта на машине Linux, используя скрипт Python. Простейшая реализация, похоже, заключается в том, чтобы открыть подпроцесс netstat и проанализировать его stdout.Как получить доступ к данным netstat в Python?

Я предполагаю, что кто-то где-то раньше сталкивался с этой проблемой, и я удивлен, не найдя в сети нетрадиционных парней. Разве это не слишком большая проблема для людей, чтобы почувствовать необходимость делиться?

ответ

1

Вместо анализа данных из netstat вы можете просмотреть запись/proc для каждого процесса, чтобы увидеть открытые сокеты. Есть довольно простой perl script that does this, который вы можете перевести на python.

17

Если вы хотите, чтобы контролировать соединение открыто с помощью определенного процесса вы можете использовать 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')] 

Внутренне psutil использует/Proc. Если вас интересуют соединения с определенным номером порта на системном уровне, вы можете взглянуть на то, как psutil его реализует.

Edit: начиная с psutil 2.1.0 вы также можете собрать общесистемного соединение с помощью 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 действительно приятно! Я начал использовать его в последнее время и его жизнь спасателя! Престижность авторам! – fccoelho

+0

рад, что вам понравилось –

+1

Обновление: новая версия 2.1.0 может отображать системные соединения сокета: http://grodola.blogspot.com/2014/04/reimplementing-netstat-in-cpython.html –

Смежные вопросы