如何使用 ipaddr 模块获取 CIDR 的 first/last IP 地址

How to get first/last IP address of CIDR using ipaddr module

蛮力方法:

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))))

也许可以试试 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]

从 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

python 3 ipaddress 模块是更优雅的解决方案,恕我直言。顺便说一句,它工作正常,但是 ipaddress 模块并没有 return 索引 [0,-1] 处的第一个和最后一个空闲 ip 地址,而是分别是网络地址和广播地址。

第一个和最后一个空闲和可分配地址相当

import ipaddress

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

这将 return 10.10.128.1 作为第一个和 10.10.255.254 而不是 10.10.128.0 和 10.10.255.255