python - 使用 Python 检索具有多个 IP 地址的接口(interface)的网络掩码?

标签 python linux networking

我需要在 Linux 环境中使用 Python 列出可用的网络接口(interface)及其 IP 地址和相应的网络掩码。我可以使用 ioctlSIOCGIFCONF 获取接口(interface)和每个接口(interface)的 IP 地址,如概述 here , 但是当一个接口(interface)上有多个 IP 地址时,我在确定网络掩码时不知所措。

我可以按照 Retrieving network mask in Python 中的建议获取接口(interface)主 IP 地址的网络掩码:

import socket
import fcntl
import struct

SIOCGIFNETMASK = 0x891b

def get_network_mask(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    netmask = fcntl.ioctl(s, SIOCGIFNETMASK, struct.pack('256s', ifname))[20:24]
    return socket.inet_ntoa(netmask)

>>> get_network_mask('eth0')
'255.255.255.0'

但是,如果我在同一接口(interface)上有多个具有不同网络掩码的 IP 地址,这将不起作用,如下所示:

$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    inet 192.168.1.1/16 brd 192.168.255.255 scope global eth0
    inet 172.16.0.123/24 scope global eth0

在这种情况下,我将只能使用上述函数检索其中一个网络掩码。除了解析 ip addr showifconfig 的输出外,有没有办法检索所有地址的网络掩码?

最佳答案

从技术上讲,“ip addr sh”所做的是使用 netlink 库来询问(并可选择监视)内核网络接口(interface)/路由表。

您也许可以在 python 中执行此操作,但我强烈建议解析“/sbin/ip addr sh”的输出

这是因为

  • 使用 rtnetlink 库很复杂
  • 您不关心性能 - 网络接口(interface)变化的频率不足以让您关心(并且在任何情况下您都可以使用“ip monitor”监控它们)

关于python - 使用 Python 检索具有多个 IP 地址的接口(interface)的网络掩码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3698901/

相关文章:

将转储从 Linux 导入 Windows 机器本地主机时出现 MySql 错误

linux - ext4 为目录条目启用哈希

docker - jenkins中的另一个云插件未使用ec2实例连接到tcp://docker:2376

python - 如何在 Tensorflow 中用掩码减去两个张量?

Python - 在不消耗的情况下计算迭代器中的元素

python - OSError : The filename, 目录名或卷标语法不正确

ios - 通过网络将 iOS 应用程序安装到多个设备

Python正则表达式匹配任意数量的不紧随句点的数字

linux - 在 Unix/macOS 系统事件上触发脚本

网络上的 C# 应用程序