我有以下内容: -
start_range =" 10.40.0.0/16"
end_range =" 10.100.0.0/16"
我必须编写一个逻辑来迭代从start
到end
的所有可能范围(具有相同的子网掩码/ 16)。对于每个子网,我将进行一些处理,然后继续下一个。
我可以通过简单的方式实现这一点,我知道,我必须增加最后一个网络octate(即增量40到41 - > 42 - > 43等等。)
start_subnet = "10.40.0.0/16"
end_subnet = "10.100.0.0/16"
start_val = int(start_subnet.split(".")[1])
end_val = int(end_subnet.split('.')[1])
subnet_split = start_subnet.split(".")
subnet_split[1] = "{}"
subnet_proto = ".".join(subnet_split) # "10.{}.0.0/16"
for i in range(start_val, end_val+1): # iterate from 40 to 100
cur_subnet = subnet_proto.format(i) # "10.40.0.0/16", "10.41.0.0/16" etc
# do processing on cur_subnet
是否有更好的(Pythonic)方式来获取下一个子网(采用CIDR格式)。可能netaddr
模块有一些我不知道的东西吗?
答案 0 :(得分:1)
这可能是你的想法(没有经过深思熟虑或经过测试,你已被警告过了!)。
ipaddress模块来自python3,但它有一个backport,只需运行
pip install ipaddress
得到它。
import ipaddress
def subnet_range(start_subnet, end_subnet):
start = ipaddress.ip_network(unicode(start_subnet))
end = ipaddress.ip_network(unicode(end_subnet))
assert start.prefixlen == end.prefixlen
ranges = [
n
for ipaddr in ipaddress.summarize_address_range(
list(start)[0],
list(end)[0])
for n in ipaddr.subnets(new_prefix=start.prefixlen)][:-1]
ranges.append(end)
return ranges
if __name__ == "__main__":
start_subnet = "9.250.0.0/16"
end_subnet = "10.100.0.0/16"
for r in subnet_range(start_subnet, end_subnet):
print r
答案 1 :(得分:1)
使用netaddr
后帮我获得了预期的结果。
from netaddr import IPNetwork
start_range = IPNetwork("10.40.0.0/16")
end_range = IPNetwork("10.45.0.0/16")
allowed_range = []
while start_range<=end_range:
allowed_range.append(start_range)
start_range = start_range.next()
print allowed_range
这将打印以下内容: -
[IPNetwork('10.40.0.0/16'), IPNetwork('10.41.0.0/16'),
IPNetwork('10.42.0.0/16'), IPNetwork('10.43.0.0/16'),
IPNetwork('10.44.0.0/16'), IPNetwork('10.45.0.0/16')]