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) 的流量绑定到特定的网络接口/隧道