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

时间:2010-06-07 05:04:02

标签: python linux sockets port

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

5 个答案:

答案 0 :(得分:21)

我的答案分为两部分:

<强> 1。获取shell中的信息

对于第一部分,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。从Python调用lsof

您应该能够使用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]

希望这有帮助!

答案 1 :(得分:18)

您可以使用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')]
>>>

答案 2 :(得分:4)

如果您不想解析netstat或lsof等程序的输出,可以浏览/ proc文件系统并尝试查找其中文件的文档。 /proc/<pid>/net/tcp对你来说可能特别有趣。当然,这些文件的格式可能会在内核版本之间发生变化,因此通常认为解析命令输出更可靠。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

有一件事没有提到。 python中的大多数端口应用程序都使用命令行参数。您可以解析/ proc / pid / cmdline并解析端口号。这避免了在具有大量连接的服务器上使用ss或netstat的大量开销。