2014-10-11 68 views
2

我试图采取一个已知子网ID和CIDR掩码,例如10.0.0.0/22子网列表,并得到像这样的列表:获取匹配特定CIDR

[('10.0.0.0', '10.0.3.255'), 
('10.0.4.0', '10.0.7.255'), 
... 
('10.255.252.0', '10.255.255.255')] 

我我尝试了一些现有的模块,如ipcalc,但它似乎没有这样的功能。我不确定什么样的数学对我来说是必要的,我也可以自己编写模块。

+1

'10.0.0.0/22''s网络地址是'10.0.0.0',广播地址是'10.0.3.255'。其他地址在网络之外。 – falsetru 2014-10-11 14:10:26

+0

@falsetru我知道,我想要做的是获得第一个八位组下的所有子网列表并匹配/ 22掩码。 – Soviero 2014-10-11 14:11:39

+0

@Soviero实际上你错了,因为第一个八位字节已经没有意义了(这不是特别的)。 – 2014-10-11 14:15:28

回答

5

您可以使用ipaddress模块如果您使用Python 3.3+:

>>> import ipaddress 
>>> it = ipaddress.ip_network('10.0.0.0/8').subnets(new_prefix=22) 
>>> networks = [(str(n.network_address), str(n.broadcast_address)) for n in it] 
>>> len(networks) 
16384 
>>> networks[0] 
('10.0.0.0', '10.0.3.255') 
>>> networks[-1] 
('10.255.252.0', '10.255.255.255') 

在Python 2.x中,用ipaddr

>>> import ipaddr 
>>> it = ipaddr.IPNetwork('10.0.0.0/8').subnet(new_prefix=22) 
>>> networks = [(str(n.network), str(n.broadcast)) for n in it] 
>>> len(networks) 
16384 
>>> networks[0] 
('10.0.0.0', '10.0.3.255') 
>>> networks[-1] 
('10.255.252.0', '10.255.255.255') 

UPDATE

有Python的2.7反向移植的Python 3.3 ipaddress:py2-ipaddress

+0

这正是我一直在寻找的!谢谢。 – Soviero 2014-10-11 14:19:00

+0

@Soviero,我添加了另一个可以在Python 2.x中使用的版本。 – falsetru 2014-10-11 14:28:27

4

使用新ipaddress模块在Python 3.3:

import ipaddress 

for i in ipaddress.ip_network('10.0.0.0/8').subnets(new_prefix=22): 
    print(i)