Python:检查网络接口是不是启动

Posted

技术标签:

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

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

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

我在 Linux 上,我是 root

【问题讨论】:

什么操作系统?这个脚本是否需要在不同的操作系统上运行,或者它只是一个特定的? 操作。 Linux。 ;) 将来我会将其扩展到 OS X 和 Windows,但现在 Linux 就足够了 不用担心 :)。 ***.com/questions/11735821/python-get-localhost-ip/… 哇,那个图书馆太棒了!它解决了我所有的问题。谢谢!! 我在 LINUX 上,我是 ROOT 听起来这是我的房子,如果我也有,我会烧掉它!!! 【参考方案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 中的等价物。

以上是关于Python:检查网络接口是不是启动的主要内容,如果未能解决你的问题,请参考以下文章

接口测试-接口调不通

启动具有多个网络接口的容器

Android wpa_supplcant 启动之--网络接口初始化

将 selenium_webdriver(chrome) 的流量绑定到特定的网络接口/隧道

linux系统使用python监测网络接口获取网络的输入输出

markdown 启动工作正在运行Raise网络接口(5分13秒)问题解决方法