Уведомления

Группа в Telegram: @pythonsu

#1 Июль 29, 2012 14:26:11

slash
Зарегистрирован: 2012-05-23
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Генератор диапазона ip адресов

Нужно сгенерить список Ip адресов. Например, имеется диапазон 192.168.0.0-192.168.1.255
Написал такой цикл:

l=[]
i=0
s=['192.168.1.', '192.168.0.']
while i!=255:
    i+=1
    for x in s:
        l.append(x+str(i))
На деле диапазонов несколько и список будет много больше. Только начал изучать питон, поэтому пока ничего лучше не придумал. Возможно, есть более правильный способ или модуль, который работает с такими типами данных как ip-адреса. Чтобы можно было указать просто 192.168.1.0/20, например, и получить список.

Отредактировано slash (Июль 29, 2012 14:27:35)

Офлайн

#2 Июль 29, 2012 15:03:46

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Генератор диапазона ip адресов

А диапазон должен быть целое количество битов в маске подсети?

Если нет - смотри в сторону конвертации ip <-> число.

И ip, оканчивающийся на 255, вполне может быть валидным.

Отредактировано odnochlen (Июль 29, 2012 15:04:38)

Офлайн

#3 Июль 29, 2012 15:55:29

slash
Зарегистрирован: 2012-05-23
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Генератор диапазона ip адресов

odnochlen
А диапазон должен быть целое количество битов в маске подсети?

Если нет - смотри в сторону конвертации ip <-> число.

И ip, оканчивающийся на 255, вполне может быть валидным.

Мне нужно проверить вхождение ip в диапазон, что-то вроде:
print ‘ok’ if 200 in range(300) else ‘not in list’
Только range это диапазон ip адресов.
Было бы здорово сделать так print ‘ok’ if 192.168.1.15 in range(192.168.1.0-192.168.1.255) else ‘not in list’, но так не получится конечно
Вот и думаю как бы это сделать, ip это и не int() и не float().. вот

Офлайн

#4 Июль 29, 2012 16:33:06

EBFE
Зарегистрирован: 2012-07-03
Сообщения: 99
Репутация: +  20  -
Профиль   Отправить e-mail  

Генератор диапазона ip адресов


>>> def ip_to_int(ip):
...   r = 0
...   for byte_ in ip.split('.'):
...       r = r * 256 + int(byte_)
...   return r
...
>>> ip_to_int('192.168.1.0') <= ip_to_int('192.168.1.15') <= ip_to_int('192.168.1.255')
True
>>> ip_to_int('192.168.1.0') <= ip_to_int('192.168.1.15') <= ip_to_int('192.168.3.2')
True
>>> ip_to_int('192.168.1.0') <= ip_to_int('192.168.1.15') <= ip_to_int('192.168.1.2')
False
>>>

Отредактировано EBFE (Июль 29, 2012 17:27:07)

Офлайн

#5 Июль 29, 2012 21:22:23

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Генератор диапазона ip адресов

У меня была та же идея, что у EBFE.

Вариантов тут стопицот

struct.unpack("!L", socket.inet_aton('1.2.3.4'))[0]

Офлайн

#6 Июль 30, 2012 15:18:03

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Генератор диапазона ip адресов

Офлайн

#7 Июль 30, 2012 15:39:29

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Генератор диапазона ip адресов

Офлайн

#8 Июль 30, 2012 16:48:57

slash
Зарегистрирован: 2012-05-23
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Генератор диапазона ip адресов

Спасибо большое .) Модуль IPy как раз то, что нужно в моем случае. Благодаря вашим ссылкам наткнулся на него.
Все получается очень просто:

from IPy import IP
ip=IP('192.168.0.0/20')
l=[str(x) for x in ip]
'192.168.5.56' in l  #проверка вхождения в диапазон
Еще раз спасибо всем за помощь

Офлайн

#9 Июль 30, 2012 21:38:50

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Генератор диапазона ip адресов

ipaddr кошерней — он вошел в python 3.3 под именем ipaddress



Офлайн

#10 Июль 31, 2012 00:39:56

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Генератор диапазона ip адресов

slash
Спасибо большое .) Модуль IPy как раз то, что нужно в моем случае. Благодаря вашим ссылкам наткнулся на него.
Все получается очень просто:
Ну это некошерно, как оно там с /8 работать будет?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version