python #sql #ip #subnet
#python #sql #ip #подсеть
Вопрос:
Я как бы застрял в конкретной проблеме. Мне нужно вычислить подсети, к которым принадлежит IP-адрес. Это может быть сделано в SQL или Python или аналогично.
Итак, если у меня есть, например, 100.100.100.105, мне нужно получить все подсети:
100.100.100.105/32
100.100.100.104/31
100.100.100.104/30
100.100.100.104/29
100.100.100.96/28
100.100.100.96/27
100.100.100.64/26
...
100.64.0.0/10
100.0.0.0/9
...
64.0.0.0/2
0.0.0.0/1
Но на самом деле не знаю, как подойти к проблеме.
Комментарии:
1. Не очень понятно, чего вы хотите достичь. если ваш ввод представляет собой строку (?)
"100.100.100.105"
, вы хотите вернуть все строки, которые выглядят как["100.100.100.105/32", "100.100.100.105/21", etc...]
?2. Также укажите ожидаемый результат.
3. Извините, длинные списки подсетей, перечисленных в вопросе, — это результат, который я хочу. Таким образом, список всех подсетей, в которых находится один IP-адрес, начиная с
/32
/31
и далее.4. github.com/SinaKzlca/IPRangeAnalyzer проверьте это, может быть, вы нашли какие-то полезные вещи
Ответ №1:
вы можете достичь этого с помощью встроенного ipaddress
модуля python3
import ipaddress
addresses = []
# get the int representation of your ip
ip = int(ipaddress.IPv4Address('100.100.100.105'))
for mask in range(32):
addresses.append(f'{ipaddress.IPv4Address(ip amp; ((2**32-1)-(2**mask -1)))}/{32-mask }')
На каждой итерации мы применяем маску к нашему IP, выполняя логику И операции между целочисленными представлениями IP и маски. Затем мы преобразуем результат в октеты ip и добавляем обозначение подсети ‘/ 24’. Вы можете заменить 2**32-1
на 4294967295
, я оставил его там, чтобы было понятнее, что происходит.