Мне нужно перечислить доступные сетевые интерфейсы и их IP-адреса и соответствующие маски сети, используя Python в среде Linux.Я могу получить интерфейсы и IP-адреса каждого интерфейса, используя ioctl
и SIOCGIFCONF
, как указано здесь , но я в растерянности, когда дело доходит до определения маски сети при наличии нескольких IP-адресовинтерфейс.
Я могу получить маску сети первичного IP-адреса интерфейса, как это предлагается в Получение маски сети в Python :
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
?