2015-03-07 2 views
3

Я пытаюсь написать скрипт, который разбивает подсети больше (не больше/16), чем/24 на подсеть. Например: 10.10.10.0/23 должен дать мне 10.10.10.0/24 и 10.10.11.0/24Нужно сломать подсеть IP

Моя логика заключается в первом сканировании маски CIDR. если меньше 24, то вычтите из 24, и это число (скажем, x) дает общее число/24s, а затем от 1 до третьего октета IP x раз и/24.

например: 10.10.8.0/22 ​​

if 22 < 24 
x = 24-22 = 2 
total # of /24s = 2^x = 4 
So output : 
10.10.8.0/24 
10.10.9.0/24 
10.10.10.0/24 
10.10.11.0/24 

Я не уверен, как код/​​изменить строку для только третьего октета и добавить 1 только третий октет.

Я собираюсь создать список всех значений третьего октета и перестроить IP-адреса. Но если есть более простой способ, это мне очень поможет!

Спасибо!

+0

Я не прошу ввести код здесь, только направление/несколько ссылок о том, как подойти, должно быть хорошо. благодаря ! – skd

+0

Возможно, попробуйте не работать с десятичной точкой нотации, но двоичной (или десятичной, если хотите). Если у вас есть подсеть «IP/N», вы хотите сгенерировать все 24-битные числа от 0 до «2^(24 - N) - 1', добавить их на ваш базовый IP-адрес, и у вас есть все префиксы для ваши '/ 24' подсети. Затем вы можете конвертировать их обратно в десятичную точку, если хотите. – Carsten

+0

@Carsten Но у меня все еще есть «точки». Точки не уйдут, если я конвертирую в двоичный код. например: 192.168.1.1 == 11000000.10101000.00000001.00000001 – skd

ответ

3

Посмотрите на пакет netaddr. Он уже поставляется со встроенной поддержкой для понимания чистых масок и способно генерировать список подсетей для любой желаемой длины:

>>> n = netaddr.IPNetwork('10.10.8.0/22') 
>>> list(n.subnet(24)) 
[IPNetwork('10.10.8.0/24'), IPNetwork('10.10.9.0/24'), IPNetwork('10.10.10.0/24'), IPNetwork('10.10.11.0/24')] 
>>> [str(sn) for sn in n.subnet(24)] 
['10.10.8.0/24', '10.10.9.0/24', '10.10.10.0/24', '10.10.11.0/24'] 

Поскольку Python 3.3, эта функция также доступна в новом встроенных ipaddress модуле ,

+0

Thats it !! Большое спасибо @poke! – skd

3

Если вы используете Python 3.3 или новее, вы можете использовать the ipaddress module. Использование в subnets method, вы можете сделать это в одной строке:

>>> list(ipaddress.ip_network('10.10.8.0/22').subnets(new_prefix=24)) 
[IPv4Network('10.10.8.0/24'), IPv4Network('10.10.9.0/24'), IPv4Network('10.10.10.0/24'), IPv4Network('10.10.11.0/24')] 

Преобразование строк тривиально. Просто добавьте к str.

+0

Я все еще использую py 2.7. Но я проголосую за это, так как результат показывает, что мне нужно! благодаря ! – skd

 Смежные вопросы

  • Нет связанных вопросов^_^