如何获取一个进程正在侦听的端口?

Dom*_*que 19 python sockets linux port

如何使用python获取进程正在侦听的端口?该过程的pid是已知的.

Gia*_*olà 24

你可以使用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')]
Run Code Online (Sandbox Code Playgroud)

...要过滤侦听套接字:

>>> [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')]
>>>
Run Code Online (Sandbox Code Playgroud)


Bil*_*one 23

我的回答分为两部分:

1.获取shell中的信息

对于第一部分,netstat可以工作,但我更喜欢使用lsof,因为它可以用于提取更丰富和简洁的列表.使用的确切选项可能因操作系统,内核和编译选项而异,但我相信你想要这样的东西:

lsof -a -p23819 -i4
Run Code Online (Sandbox Code Playgroud)

23819您选择的PID 在哪里,并i4表示所有IPv4套接字(尽管您可能需要i6IPv6,视情况而定).从那里,你可以管道通过grep只选择监听套接字.

lsof -a -p23819 -i4 | grep LISTEN
Run Code Online (Sandbox Code Playgroud)

(在lsof版本4.82中,您可以另外使用-sTCP:LISTEN标志而不是grep选择侦听套接字,但在4.78版中似乎没有此选项可用)

2. lsof从Python 调用

您应该能够lsof使用subprocess模块从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]
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


Mic*_*las 1

您可以使用netstat -lnp,最后一列将包含 pid 和进程名称。在 Python 中,您可以解析此命令的输出。