【问题标题】:Python: check whether a network interface is upPython:检查网络接口是否启动
【发布时间】:2013-07-14 19:57:12
【问题描述】:

在 Python 中,有没有办法检测给定的网络接口是否启动

在我的脚本中,用户指定了一个网络接口,但我想确保该接口已启动并已分配 IP 地址,然后再执行其他操作。

我在 Linux 上,我是 root

【问题讨论】:

  • 什么操作系统?这个脚本是否需要在不同的操作系统上运行,或者它只是一个特定的?
  • 操作。 Linux。 ;) 将来我会将其扩展到 OS X 和 Windows,但现在 Linux 就足够了
  • 哇,那个图书馆太棒了!它解决了我所有的问题。谢谢!!
  • 我在 LINUX 上,我是 ROOT 听起来这是我的房子,如果我也有,我会烧掉它!!!

标签: python networking ip dhcp network-interface


【解决方案1】:

接口可以配置一个 IP 地址并且不启动,因此接受的答案是错误的。您实际上需要检查/sys/class/net/<interface>/flags。如果内容在变量 flags 中,flags & 0x1 是接口是否启动。

根据应用程序,/sys/class/net/<interface>/operstate 可能是您真正想要的,但从技术上讲,接口可能会打开,operstate 会关闭,例如未连接电缆时。

当然,所有这些都是特定于 Linux 的。

【讨论】:

  • 警告:在 Linux Mint 18.2 中,用于关闭网络适配器的 Cinnamon 网络管理器小程序控件使其保持正常运行和运行状态。不过,它会删除 IP 地址。
【解决方案2】:

按照@Gabriel Samfira 的建议,我使用了netifaces。当 IP 地址与给定接口关联时,以下函数返回 True。

def is_interface_up(interface):
    addr = netifaces.ifaddresses(interface)
    return netifaces.AF_INET in addr

文档是here

【讨论】:

  • 在调用上述函数之前有用的检查是:if anInterface in netifaces.interfaces() #...
  • 不幸的是,这对 IPv6/AF_INET6 只起作用了一半:当一个变为 RUNNING 的接口得到它的 LLA 时,当同一个接口脱机时,LLA 仍然存在。
【解决方案3】:

使用psutil回答:

import psutil
import socket

def check_interface(interface):
    interface_addrs = psutil.net_if_addrs().get(interface) or []
    return socket.AF_INET in [snicaddr.family for snicaddr in interface_addrs]

【讨论】:

    【解决方案4】:

    使用pyroute2.IPRoute:

    from pyroute2 import IPRoute
    ip = IPRoute()
    state = ip.get_links(ip.link_lookup(ifname='em1'))[0].get_attr('IFLA_OPERSTATE')
    ip.close()
    

    pyroute2.IPDB:

    from pyroute2 import IPDB
    ip = IPDB()
    state = ip.interfaces.em1.operstate
    ip.release()
    

    【讨论】:

      【解决方案5】:

      您可以在/sys/class/net/<interface>/operstate 中看到文件的内容。如果内容不是down,则接口已启动。

      【讨论】:

        【解决方案6】:

        如果问题是关于检查电缆是否已连接 (FreeBSD);

        [status for status in run.cmd(' /usr/local/bin/sudo ifconfig %s ' % interface).split("\t") if status.strip().startswith("status")][0].strip().endswith("active")
        

        为此,目前还没有 api 支持 :( ...

        【讨论】:

        • 如果我们可以简单地阅读/sys/class/net/<interface>/operstate...
        • 在 FreeBSD 11 cat: /sys/class/net/em0/operstate: No such file or directory
        • 我明白了。是否有与/sys/class/net 等效的版本?
        • 我看不到。我很想知道 FreeBSD 中的等价物。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-29
        • 1970-01-01
        • 1970-01-01
        • 2013-10-12
        相关资源
        最近更新 更多