代码之家  ›  专栏  ›  技术社区  ›  Andrey Fedorov

如何在Python中访问netstat数据?

  •  12
  • Andrey Fedorov  · 技术社区  · 14 年前

    我试图使用Python脚本访问/解析Linux机器上特定端口号上的所有传出连接。最简单的实现似乎是为netstat打开一个子进程并解析它的stdout。

    我想某个地方曾经有人遇到过这个问题,并且很惊讶没有在网上找到任何netstat解析器。难道这还不足以让人们感到需要分享吗?

    3 回复  |  直到 14 年前
        1
  •  30
  •   guettli    8 年前

    如果要控制打开的连接 通过一定的过程 您可以使用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如何实现它。

    编辑:从PSUtil2.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)
     ...]