Как я получаю порты, что процесс слушает при использовании Python? Pid процесса известен.
Вы можете использовать netstat -lnp
, последний столбец будет содержать pid и имя процесса. В Python вы можете анализировать вывод этой команды.
Если вы не хотите анализировать вывод такой программы, как netstat или lsof, вы можете ползать по файловой системе / proc и попытаться найти документацию по файлам внутри. / proc /
может быть особенно интересным для вас. Конечно, формат этих файлов может меняться между выпусками ядра, поэтому вывод команды синтаксического анализа обычно считается более надежным.
Мой ответ состоит из двух частей:
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, используя модуль подпроцесса
, например:
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]
Надеюсь это поможет!