如何在Python中访问netstat数据?

21 投票
1 回答
34758 浏览
提问于 2025-04-16 05:53

我想用一个Python脚本来访问和解析Linux机器上某个特定端口的所有出站连接。最简单的方法似乎是打开一个子进程来运行netstat,然后解析它的输出。

我觉得应该有人遇到过这个问题,但我很惊讶网上找不到任何netstat解析器。难道这个问题不够大,大家就不觉得有必要分享吗?

1 个回答

39

如果你想控制由某个进程打开的连接,可以使用psutil这个库:

>>> p = psutil.Process(1694)
>>> p.name()
'firefox'
>>> p.connections()
[connection(fd=115, family=2, type=1, local_address=('10.0.0.1', 48776), remote_address=('93.186.135.91', 80), status='ESTABLISHED'),
 connection(fd=117, family=2, type=1, local_address=('10.0.0.1', 43761), remote_address=('72.14.234.100', 80), status='CLOSING'),
 connection(fd=119, family=2, type=1, local_address=('10.0.0.1', 60759), remote_address=('72.14.234.104', 80), status='ESTABLISHED'),
 connection(fd=123, family=2, type=1, local_address=('10.0.0.1', 51314), remote_address=('72.14.234.83', 443), status='SYN_SENT')]

psutil内部使用的是/proc这个文件系统。如果你对系统层面上某个特定端口的连接感兴趣,可以看看psutil是怎么实现这个功能的。

补充一下:从psutil 2.1.0版本开始,你还可以通过net_connections()来获取全系统的连接

>>> import psutil
>>> psutil.net_connections()
[pconn(fd=115, family=2, type=1, laddr=('10.0.0.1', 48776), raddr=('93.186.135.91', 80), status='ESTABLISHED', pid=1254),
 pconn(fd=117, family=2, type=1, laddr=('10.0.0.1', 43761), raddr=('72.14.234.100', 80), status='CLOSING', pid=2987),
 pconn(fd=-1, family=2, type=1, laddr=('10.0.0.1', 60759), raddr=('72.14.234.104', 80), status='ESTABLISHED', pid=None),
 pconn(fd=-1, family=2, type=1, laddr=('10.0.0.1', 51314), raddr=('72.14.234.83', 443), status='SYN_SENT', pid=None)
 ...]

撰写回答