Найти - Пользователи
Полная версия: Генератор списка IP-адресов из диапазона
Начало » Python для новичков » Генератор списка IP-адресов из диапазона
1
bs0d
Приветствую!

Ломаю голову, никак не могу подобрать подходящее решение
Есть диапазон 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('.'), и в цикле проходиться по каждой подсети?
Shaman
ipaddress появился только в третьей реинкарнации, так что придётся мудрить, и не только со split.
bs0d
Shaman, а в случае использования python3.4 ipaddress подойдет под мои нужды? что-то я в доках не увидел, как сгенерить лист из диапазона такого формата
Shaman
Тут: https://docs.python.org/3.3/library/ipaddress.html#iteration
Shaman
И да, для второго питона есть бэкпорты этой библиотеки (хотя, если мне не изменяет память, ipaddress - сторонняя библиотека, вошедшая в состав стандартной).
PooH
Не забываем, что 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
bs0d
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
Ну вот как-то так получилось. Загрузил диапазоны из файла, сплитнул по разделителю, получил подсети (согласно моего диапазона) и проитерировался по списку подсетей.
Костыль, но сойдет
bs0d
PooH, отличное решение! сам до такого врядли бы додумался
vonujesih
https://pypi.python.org/pypi/py2-ipaddress/
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB