Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 22, 2014 11:11:57

bs0d
Зарегистрирован: 2014-02-01
Сообщения: 76
Репутация: +  2  -
Профиль   Отправить e-mail  

Генератор списка IP-адресов из диапазона

Приветствую!

Ломаю голову, никак не могу подобрать подходящее решение
Есть диапазон IP-адресов в таком формате: 77.79.155.0-77.81.155.255 (str)

Необходимо сгенерировать список вида:

77.79.155.0
77.79.155.1
….
77.81.155.254
77.81.155.255

Как это можно реализовать стандартными средствами python2.7, неужели split('.'), и в цикле проходиться по каждой подсети?

Офлайн

#2 Дек. 22, 2014 11:22:34

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Генератор списка IP-адресов из диапазона

ipaddress появился только в третьей реинкарнации, так что придётся мудрить, и не только со split.

Офлайн

#3 Дек. 22, 2014 11:49:23

bs0d
Зарегистрирован: 2014-02-01
Сообщения: 76
Репутация: +  2  -
Профиль   Отправить e-mail  

Генератор списка IP-адресов из диапазона

Shaman, а в случае использования python3.4 ipaddress подойдет под мои нужды? что-то я в доках не увидел, как сгенерить лист из диапазона такого формата

Офлайн

#4 Дек. 22, 2014 12:03:24

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Генератор списка IP-адресов из диапазона

Офлайн

#5 Дек. 22, 2014 12:13:00

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Генератор списка IP-адресов из диапазона

И да, для второго питона есть бэкпорты этой библиотеки (хотя, если мне не изменяет память, ipaddress - сторонняя библиотека, вошедшая в состав стандартной).

Офлайн

#6 Дек. 22, 2014 12:31:07

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Генератор списка IP-адресов из диапазона

Не забываем, что ip-адрес, это просто int32

def ip2bin(s):
    b = 0
    for x in s.split('.'):
        b |= int(x)
        b <<= 8
    return b >> 8 
    
def bin2ip(b):
    ls = []
    for _ in range(4):        
        ls.append(str(int(b & 0b11111111)))
        b >>= 8        
    return '.'.join(reversed(ls))
    
def iter_net(ip1, ip2):
    x = ip2bin(ip1)
    b2 = ip2bin(ip2)
    while x <= b2:
        yield bin2ip(x)
        x += 1
for x in iter_net('192.168.0.1', '192.168.0.127'):
    print x



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Дек. 22, 2014 12:34:00

bs0d
Зарегистрирован: 2014-02-01
Сообщения: 76
Репутация: +  2  -
Профиль   Отправить e-mail  

Генератор списка IP-адресов из диапазона

def ip_networks():
    ip_netw = open('ip.txt').read().splitlines()
    all_list = []
    for x in ip_netw:
        start, end = x.split('-')
        networks = [ipaddr for ipaddr in ipaddress.summarize_address_range(
            ipaddress.IPv4Address(start), ipaddress.IPv4Address(end)
        )]
        for net in networks:
            for ip in net:
                all_list.append(str(ip))
    return all_list
Ну вот как-то так получилось. Загрузил диапазоны из файла, сплитнул по разделителю, получил подсети (согласно моего диапазона) и проитерировался по списку подсетей.
Костыль, но сойдет

Офлайн

#8 Дек. 22, 2014 12:45:02

bs0d
Зарегистрирован: 2014-02-01
Сообщения: 76
Репутация: +  2  -
Профиль   Отправить e-mail  

Генератор списка IP-адресов из диапазона

PooH, отличное решение! сам до такого врядли бы додумался

Офлайн

#9 Дек. 22, 2014 15:54:50

vonujesih
Зарегистрирован: 2014-12-21
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Генератор списка IP-адресов из диапазона

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version