Подтвердить что ты не робот

Как получить порты, которые прослушивает процесс?

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

4b9b3361

Ответ 1

На мой ответ две части:

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]

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

Ответ 2

Вы можете использовать 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')]
>>>

Ответ 3

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

Ответ 4

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

Ответ 5

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