我正在尝试使用Python脚本访问/解析Linux机器上特定端口号上的所有传出连接。最简单的实现似乎是为netstat打开一个子进程并解析它的stdout。
我想某个地方之前有人遇到过这个问题,并且很惊讶没有在网上找到任何netstat解析器。对于人们感觉需要分享这是不是一个大问题?
答案 0 :(得分:24)
如果您想控制某个流程打开的连接,您可以使用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)
...]
答案 1 :(得分:5)
您可以在/proc documentation找到您可能需要的基本信息 如果您想查看示例,请查看:A python netstat in less than 100 lines of code
答案 2 :(得分:1)
您可以查看每个进程的/ proc条目,以查看打开的套接字,而不是解析netstat的输出。有一个相当简单的perl script that does this可以转换为python。