#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'