Как получить порты, которые процесс прослушивает? - PullRequest
19 голосов
/ 07 июня 2010

Как мне получить порты, которые процесс прослушивает с помощью python?Пид процесса известен.

Ответы [ 5 ]

21 голосов
/ 10 июня 2010

Мой ответ состоит из двух частей:

1. Получение информации в оболочке

Для первой части будет работать netstat, но я предпочитаю использовать lsof, поскольку его можно использовать для извлечения более информативного и краткого списка. Точные параметры могут различаться в зависимости от вашей ОС, ядра и параметров компиляции, но я думаю, что вы хотите что-то вроде этого:

lsof -a -p23819 -i4

Где 23819 - это PID, для которого вы выбираете, а i4 обозначает все сокеты IPv4 (хотя вы можете указать i6 для IPv6, в зависимости от ситуации). Оттуда вы можете передать через grep, чтобы выбрать только прослушивающие сокеты.

lsof -a -p23819 -i4 | grep LISTEN

lsof версии 4.82 вы можете дополнительно использовать флаг -sTCP:LISTEN вместо grep для выбора прослушивающих сокетов, хотя эта опция недоступна в версии 4.78)

2. Звонок lsof с Python

Вы должны быть в состоянии вызвать lsof и прочитать вывод из Python, используя модуль subprocess, например:

from subprocess import Popen, PIPE
p1 = Popen(['lsof', '-a', '-p23819', '-i4'], stdout=PIPE)
p2 = Popen(["grep", "LISTEN"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

Надеюсь, это поможет!

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

Вы можете использовать psutil :

>>> import psutil
>>> p = psutil.Process(2549)
>>> p.name()
'proftpd: (accepting connections)'
>>> p.connections()
[connection(fd=1, family=10, type=1, local_address=('::', 21), remote_address=(), status='LISTEN')]

... Для фильтрации прослушивающих сокетов:

>>> [x for x in p.get_connections() if x.status == psutil.CONN_LISTEN]
[connection(fd=1, family=10, type=1, local_address=('::', 21), remote_address=(), status='LISTEN')]
>>>
4 голосов
/ 07 июня 2010

Если вы не хотите анализировать вывод программы, такой как netstat или lsof, вы можете просмотреть файловую систему / proc и попытаться найти документацию по файлам внутри. /proc/<pid>/net/tcp может быть особенно интересным для вас. Конечно, формат этих файлов может меняться между выпусками ядра, поэтому вывод команды синтаксического анализа обычно считается более надежным.

1 голос
/ 07 июня 2010

Вы можете использовать netstat -lnp, последний столбец будет содержать pid и имя процесса.В Python вы можете анализировать вывод этой команды.

0 голосов
/ 28 февраля 2017

Одна вещь, которая не была упомянута. Большинство приложений порта в python принимают аргумент командной строки. Вы можете проанализировать / proc / pid / cmdline и разобрать номер порта. Это позволяет избежать больших накладных расходов на использование ss или netstat на серверах с множеством соединений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...