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

时间:2010-09-13 08:45:24

标签: python linux networking

我需要在Linux环境中使用Python列出可用的网络接口及其IP地址和相应的网络掩码。我可以使用ioctlSIOCGIFCONF按照here概述获取每个接口的接口和IP地址,但是在有多个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的输出?

1 个答案:

答案 0 :(得分:2)

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

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

这是因为

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