Получить сетевой адрес подключенного интерфейса с помощью Python

#python #python-3.x #networking #scapy

#python #python-3.x #сеть #scapy

Вопрос:

Как я могу получить текущий сетевой адрес определенного интерфейса (не IP-адрес, а сетевой адрес)?

Например, если я выполню следующую команду на терминале ip a show <interace> | grep inet , я получу результат, аналогичный этому.n n

     inet 192.168.43.157/24 brd 192.168.43.255 scope global dynamic noprefixroute wlo1
    inet6 fe80::6877:db06:4b23:7a7c/64 scope link noprefixroute 
 

В этом примере мой текущий IP-адрес — 192.168.45.157 / 24, но сетевой адрес (который я ищу) — 192.168.43.0 / 24.

Как бы я получил сетевой адрес?

Комментарии:

1. Я полагаю, что OP ищет эту информацию в Python, что делает вопрос более связанным с программированием.

Ответ №1:

Самым простым решением, вероятно, является использование netaddr модуля:

 >>> x = netaddr.IPNetwork('192.168.45.157/24')
>>> x.cidr
IPNetwork('192.168.45.0/24')
 

Или вы можете просто преобразовать адрес в 32-битное число, преобразовать префикс в битовую маску, а затем применить к маске:

 >>> import socket
>>> addr = '192.168.45.157/24'
>>> ip, prefix = addr.split('/')
>>> mask = 0xFFFFFFFF << (32-int(prefix))
>>> bin(mask)
'0b1111111111111111111111111111111100000000'
>>> ip_bytes = socket.inet_aton(ip)
>>> '.'.join(str(int(x)) for x in struct.pack('>I', struct.unpack('>I', ip_bytes)[0] amp; mask))
'192.168.45.0'