添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如何用python获取一个进程所监听的端口?进程的pid是已知的。

python
linux
sockets
port
Dominique
Dominique
发布于 2010-06-07
5 个回答
Giampaolo Rodolà
Giampaolo Rodolà
发布于 2017-02-28
已采纳
0 人赞同

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

...To filter for listening sockets:

>>> [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')]
    
谢谢。psutil是个好模块。但唯一的问题是,使用该模块需要先安装它。而安装psutil需要安装gcc和python头文件。所以使用psutil的项目将很难安装。
psutil需要gcc,因为它包含需要编译的C代码。我不会去说它有多难安装,尤其是在Linux上。例如,在Ubuntu上,你只需要 "apt-get install python-dev "和 "pip install psutil "就可以了。
BillyBBone
BillyBBone
发布于 2017-02-28
0 人赞同

我的答案有两个部分。

1.获取外壳中的信息

对于第一部分, netstat 也可以,但我更喜欢使用 lsof ,因为它可以用来提取一个信息量更大、更简洁的列表。使用的确切选项可能会根据你的操作系统、内核和编译选项而有所不同,但我相信你想要这样的东西。

lsof -a -p23819 -i4

其中23819是你要选择的PID,i4表示所有的IPv4套接字(尽管你可能希望i6用于IPv6,视情况而定)。在这里,你可以通过grep的管道,只选择监听的套接字。

lsof -a -p23819 -i4 | grep LISTEN

(在lsof4.82版本中,你可以额外使用-sTCP:LISTEN标志而不是grep来选择监听套接字,尽管这个选项在4.78版本中似乎并不适用。)

2.从Python中调用lsof

你应该能够从Python中调用lsof并读取输出,使用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]

Hope this helps!

ʇsәɹoɈ
ʇsәɹoɈ
发布于 2017-02-28
0 人赞同