Как мне получить доступ к данным netstat в Python? - PullRequest
12 голосов
/ 22 октября 2010

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

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

Ответы [ 3 ]

25 голосов
/ 05 июня 2011

Если вы хотите контролировать соединение, открытое определенным процессом , вы можете использовать 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.

Редактировать: начиная с psutil 2.1.0 вы также можете собрать systemдля всех подключений с использованием 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)
 ...]
5 голосов
/ 28 июня 2011

Базовая информация, которая может вам понадобиться, может быть найдена в / proc документация . Если вы хотите посмотреть пример, взгляните на: Netstat Python, содержащий менее 100 строк кода

1 голос
/ 22 октября 2010

Вместо анализа вывода из netstat вы можете просмотреть запись / proc для каждого процесса, чтобы увидеть открытые сокеты.Существует довольно простой скрипт perl, который делает это , который вы можете перевести на python.

...