Как мне получить доступ к данным netstat в Python?
Я пытаюсь получить доступ / анализировать все исходящие соединения на конкретном номере порта на машине Linux с помощью скрипта Python. Кажется, простейшая реализация состоит в том, чтобы открыть подпроцесс для netstat и проанализировать его стандартный вывод.
Я предполагаю, что кто-то где-то уже сталкивался с этой проблемой, и я удивлен, что не нашел в сети парсеров netstat. Разве это не достаточно большая проблема, чтобы люди чувствовали необходимость поделиться?
3 ответа
Базовую информацию, которая может вам понадобиться, можно найти в документации / proc. Если вы хотите посмотреть пример, взгляните на: netstat python, содержащий менее 100 строк кода.
Если вы хотите контролировать соединение, открытое определенным процессом, вы можете использовать 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 вы также можете собирать общесистемные соединения с помощью 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)
...]
Вместо того, чтобы анализировать вывод netstat, вы можете просмотреть запись /proc для каждого процесса, чтобы увидеть открытые сокеты. Есть довольно простой Perl-скрипт, который делает это, и который вы можете перевести на python.