Получение маски сети для интерфейсов с несколькими IP-адресами с использованием Python? - PullRequest
0 голосов
/ 13 сентября 2010

Мне нужно перечислить доступные сетевые интерфейсы и их 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?

1 Ответ

2 голосов
/ 13 сентября 2010

Технически, что делает «ip addr sh», это использовать библиотеку netlink для опроса (и при необходимости мониторинга) сетевых интерфейсов ядра / таблиц маршрутизации.

Возможно, вы сможете сделать это в python, но я настоятельно рекомендую разобрать вывод "/ sbin / ip addr sh"

Это потому что

  • Использование библиотеки rtnetlink сложно
  • Вы не заботитесь о производительности - сетевые интерфейсы меняются не так часто, чтобы заботиться о вас (и в любом случае вы можете контролировать их с помощью «ip monitor»)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...