Список IP-адресов в Python для списка CIDR - PullRequest
4 голосов
/ 15 июля 2011

Как мне преобразовать список IP-адресов в список CIDR? В библиотеке Google ipaddr-py есть метод sumrize_address_range (первый, последний), который преобразует два IP-адреса (начало и конец) в список CIDR. Однако он не может обработать список IP-адресов.

Example:
>>> list_of_ips = ['10.0.0.0', '10.0.0.1', '10.0.0.2', '10.0.0.3', '10.0.0.5']
>>> convert_to_cidr(list_of_ips)
['10.0.0.0/30','10.0.0.5/32']

Ответы [ 6 ]

6 голосов
/ 17 июля 2011

Установить netaddr.

pip install netaddr

Используйте функции netaddr:

# Generate lists of IP addresses in range.
ip_range = netaddr.iter_iprange(ip_start, ip_end)
# Convert start & finish range to CIDR.
ip_range = netaddr.cidr_merge(ip_range)
3 голосов
/ 10 апреля 2013

Вы можете сделать это в одну строку, используя netaddr:

cidrs = netaddr.iprange_to_cidrs(ip_start, ip_end)
2 голосов
/ 04 августа 2017

в python3 у нас есть встроенный модуль для этого: ipaddress.

list_of_ips = ['10.0.0.0', '10.0.0.1', '10.0.0.2', '10.0.0.3', '10.0.0.5']
import ipaddress
nets = [ipaddress.ip_network(_ip) for _ip in list_of_ips]
cidrs = ipaddress.collapse_addresses(nets)
list(cidrs)
Out[6]: [IPv4Network('10.0.0.0/30'), IPv4Network('10.0.0.5/32')]
2 голосов
/ 15 июля 2011

Ну, summarize_address_range сводит вашу проблему к разделению вашего списка на последовательные диапазоны. Учитывая, что вы можете конвертировать IP-адреса в целые числа, используя

def to_int(str): struct.unpack("!i",socket.inet_aton(str))[0]

это не должно быть слишком сложно.

1 голос
/ 16 июня 2016

Для комментария, сделанного CaTalyst.X, обратите внимание, что вам нужно изменить код, чтобы он работал.

This:

cidrs = netaddr.ip_range_to_cidrs('54.64.0.0', '54.71.255.255')

Необходимо стать таким:

cidrs = netaddr.iprange_to_cidrs('54.64.0.0', '54.71.255.255')

Если вы используете первый экземпляр кода, вы получите исключение, поскольку ip_range_to_cidrs isnне является допустимым атрибутом метода netaddr.

1 голос
/ 26 ноября 2014

Разверните диапазоны CIDR в полные списки IP, взяв входной файл диапазонов и используя netaddr https://github.com/JeremyNGalloway/cidrExpand/blob/master/cidrExpand.py

from netaddr import IPNetwork
import sys

if len(sys.argv) < 2:
    print 'example usage: python cidrExpand.py cidrRanges.txt >> output.txt'

with open(sys.argv[1], 'r') as cidrRanges:
    for line in cidrRanges:
        ip = IPNetwork(line)
        for ip in ip:
            print ip

cidrRanges.close()
exit()
...