我正在尝试编写一个脚本,它将比/ 24更大(不大于/ 16)的子网分解为/ 24子网。 例如:10.10.10.0/23应该给我10.10.10.0/24和10.10.11.0/24
我的逻辑是首先扫描CIDR掩码。如果小于24,则从24减去该数字(假设x)给出/ 24s的总数,然后是IP x次和/ 24的1到3个八位字节。
例如:10.10.8.0/22
if 22 < 24
x = 24-22 = 2
total # of /24s = 2^x = 4
So output :
10.10.8.0/24
10.10.9.0/24
10.10.10.0/24
10.10.11.0/24
我不确定如何仅为第三个八位字节编码/修改字符串,仅将第三个八位字节添加1。
我正在考虑创建所有第三个八位字节值的列表并重新构建IP。但是,如果有一个更简单的方法,这将帮助我很多!
谢谢!
答案 0 :(得分:4)
查看netaddr包。它已经内置了对理解网络掩码的支持,并且能够生成任何所需长度的子网列表:
>>> n = netaddr.IPNetwork('10.10.8.0/22')
>>> list(n.subnet(24))
[IPNetwork('10.10.8.0/24'), IPNetwork('10.10.9.0/24'), IPNetwork('10.10.10.0/24'), IPNetwork('10.10.11.0/24')]
>>> [str(sn) for sn in n.subnet(24)]
['10.10.8.0/24', '10.10.9.0/24', '10.10.10.0/24', '10.10.11.0/24']
自Python 3.3起,此功能也可在新的内置ipaddress
模块中使用。
答案 1 :(得分:4)
如果您使用的是Python 3.3或更高版本,则可以使用the ipaddress
module。使用subnets
method,您可以在一行中执行此操作:
>>> list(ipaddress.ip_network('10.10.8.0/22').subnets(new_prefix=24))
[IPv4Network('10.10.8.0/24'), IPv4Network('10.10.9.0/24'), IPv4Network('10.10.10.0/24'), IPv4Network('10.10.11.0/24')]
转换为字符串是微不足道的。只需转换为str
。