2014-10-11 67 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)