使用Python获取具有多个IP地址的接口的子网掩码?
我需要在Linux环境下用Python列出可用的网络接口及其IP地址和对应的子网掩码。我可以通过使用ioctl
和SIOCGIFCONF
来获取接口和每个接口的IP地址,具体方法可以参考这里,但是当一个接口有多个IP地址时,我就不知道怎么确定子网掩码了。
我可以按照在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 show
或ifconfig
的输出呢?
1 个回答
2
从技术上讲,"ip addr sh" 这个命令的作用是通过 netlink 库来查询(并可以选择监控)内核的网络接口和路由表。
你可以用 Python 来实现这个功能,但我强烈建议你直接解析 "/sbin/ip addr sh" 的输出结果。
原因有以下几点:
- 使用 rtnetlink 库比较复杂
- 你不需要太在意性能——网络接口的变化并不频繁,所以你不需要担心(而且你可以用 "ip monitor" 来监控它们)