9

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

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

我在Linux上,我是root

4

6 回答 6

13

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

取决于应用程序,这/sys/class/net/<interface>/operstate可能是您真正想要的,但从技术上讲,接口可能是向上和operstate向下的,例如,当没有连接电缆时。

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

于 2017-10-25T12:44:09.760 回答
9

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

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

文档在这里

于 2013-07-16T15:28:28.210 回答
5

使用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]
于 2018-11-04T15:03:08.743 回答
3

使用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()
于 2015-02-17T16:24:16.137 回答
2

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

于 2017-09-21T16:42:44.527 回答
0

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

于 2019-03-13T13:21:03.360 回答