如何使用ipaddr模块获取CIDR的第一个/最后一个IP地址

时间:2016-11-01 21:19:30

标签: python ip-address cidr

蛮力方法:

from ipaddr import IPv4Network
n = IPv4Network('10.10.128.0/17')
all = list(n.iterhosts()) # will give me all hosts in network
first,last = all[0],all[-1] # first and last IP

我想知道如何从CIDR获取第一个和最后一个IP地址,而不必遍历可能非常大的列表来获取第一个和最后一个元素?

我想要这样我就可以使用以下内容生成此范围内的随机IP地址:

socket.inet_ntoa(struct.pack('>I', random.randint(int(first),int(last))))

3 个答案:

答案 0 :(得分:3)

也许尝试netaddr,特别是索引部分。

https://pythonhosted.org/netaddr/tutorial_01.html#indexing

from netaddr import *
import pprint

ip = IPNetwork('10.10.128.0/17')

print "ip.cidr = %s" % ip.cidr
print "ip.first.ip = %s" % ip[0]
print "ip.last.ip = %s" % ip[-1]

答案 1 :(得分:2)

从Python 3.3开始,您可以使用ipaddress module

您可以像这样使用它:

import ipaddress

n = ipaddress.IPv4Network('10.10.128.0/17')
first, last = n[0], n[-1]

__getitem__已实施,因此不会生成任何大型列表。

https://github.com/python/cpython/blob/3.6/Lib/ipaddress.py#L634

答案 2 :(得分:0)

python 3 ipaddress模块​​是更优雅的解决方案,恕我直言。而且,顺便说一句,它可以正常工作,但是ipaddress模块​​不能准确返回索引[0,-1]的第一个和最后一个空闲ip地址,但是分别返回网络地址和广播地址。

第一个和最后一个免费和可分配地址是

import ipaddress

n = ipaddress.IPv4Network('10.10.128.0/17')
first, last = n[1], n[-2]

,它将首先返回 10.10.128.1 10.10.255.254 ,而不是10.10.128.0和10.10.255.255