繁体   English   中英

Python:检查网络接口是否已启动

[英]Python: check whether a network interface is up

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

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

我在Linux上 ,我是

正如@Gabriel Samfira所说,我使用了netifaces 当IP地址与给定接口关联时,以下函数返回True。

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

文档在这里

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

根据应用程序的不同, /sys/class/net/<interface>/operstate可能是您真正想要的,但从技术上讲,接口可能会启动并且operstate关闭,例如,当没有连接电缆时。

所有这些当然都是针对Linux的。

使用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()

使用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]

您可以在/sys/class/net/<interface>/operstate查看该文件的内容。 如果内容未down则界面已启动。

如果问题是关于检查电缆是否被连接(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支持:( ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM