2010-06-07 122 views

回答

1

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

4

如果您不想分析像netstat或lsof这样的程序的输出,可以通过/ proc文件系统进行拼凑,并尝试查找其中的文件的相关文档。 /proc/<pid>/net/tcp可能对你特别有意思。当然,这些文件的格式可能会在内核版本之间改变,所以解析命令输出通常被认为更可靠。

21

有两个部分,以我的回答:

1.获取在外壳

在第一部分,netstat会工作的信息,但我更喜欢使用lsof,因为它可以用于提取更丰富和简洁的清单。确切的选项使用基于您的操作系统,内核和编译选项可能会有所不同,但我相信你想是这样的:

lsof -a -p23819 -i4 

哪里23819是你所选择的PID,以及i4表示所有的IPv4套接字(尽管您可能想要IPv6的i6,视情况而定)。从那里,你可以通过grep管道来选择只有监听套接字。

lsof -a -p23819 -i4 | grep LISTEN 

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

2。

:从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] 

希望这有助于!

15

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

谢谢。 psutil是一个很好的模块。但唯一的问题是使用模块需要先安装它。安装psutil需要安装gcc和python头文件。所以使用psutil的项目很难安装。 – mtoloo 2011-12-22 06:25:00

+0

psutil需要gcc,因为它包含需要编译的C代码。我不会说它很难安装,特别是在Linux上。例如,在Ubuntu上,您只需“apt-get install python-dev”和“pip install psutil”即可完成。 – 2014-10-22 12:59:17

0

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