【问题标题】:Retrieving netmask for interfaces with multiple IP addresses using Python?使用 Python 检索具有多个 IP 地址的接口的网络掩码?
【发布时间】:2010-09-13 08:45:23
【问题描述】:

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

我可以按照Retrieving network mask in Python 中的建议获取接口的主 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'

但是,如果我在同一个接口上有多个具有不同网络掩码的 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 的输出之外,有没有办法检索所有地址的网络掩码?

【问题讨论】:

    标签: python linux networking


    【解决方案1】:

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

    你也许可以在 python 中做到这一点,但我强烈建议解析“/sbin/ip addr sh”的输出

    这是因为

    • 使用 rtnetlink 库很复杂
    • 您不关心性能 - 网络接口的变化频率并没有您关心的那么频繁(无论如何您都可以使用“ip monitor”对其进行监控)

    【讨论】:

    • 谢谢。我快速浏览了 rtnetlink,您说得对,因为它似乎对这项任务过于复杂。解析ip addr show 仍然感觉有点hackish,但我想在这种情况下这是最好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多