【问题标题】:How to check given IP address range contains only one CIDR?如何检查给定的 IP 地址范围仅包含一个 CIDR?
【发布时间】:2020-12-21 23:14:52
【问题描述】:

我正在尝试编写一个 Python 脚本来将两个 IP 地址之间的范围转换为 CIDR,

# cidr.py
import argparse
import netaddr
import sys

parser = argparse.ArgumentParser()
parser.add_argument('start_addr')
parser.add_argument('end_addr')
args = parser.parse_args()

start_addr = netaddr.IPAddress(args.start_addr)
end_addr = netaddr.IPAddress(args.end_addr)
if end_addr < start_addr:
  print('start address is larger than end address. check arguments.')
  sys.exit()
ip_cidr = netaddr.iprange_to_cidrs(start_addr, end_addr)

print(str(ip_cidr))

例如,使用Salesforce's IP address range 作为参数执行此脚本, 它返回正确的 CIDR 表达式。

$ python cidr.py 13.108.0.0 13.111.255.255
[IPNetwork('13.108.0.0/14')]

但是当我修改第二个参数时,它会返回几个 CIDR。

$ python hoge.py 13.108.0.0 13.211.255.255
[IPNetwork('13.108.0.0/14'), IPNetwork('13.112.0.0/12'), IPNetwork('13.128.0.0/10'), IPNetwork('13.192.0.0/12'), IPNetwork('13.208.0.0/14')]

我想知道 2 个 IP 地址的地址范围只包含 1 个 CIDR 表达式。 如何查看?

【问题讨论】:

  • 您在问列表的长度是否为 1?您可能需要len 函数...
  • @alani 是的,我可以使用len 检查列表的长度,但我不确定ip_cidr[0] 总是返回带有第一个参数的IP 地址的CIDR。在这种情况下,13.108.0.0/14.

标签: python network-programming ip-address cidr


【解决方案1】:

如果iprange_to_cidrs 始终返回跨越所提供范围所需的最小 IP 范围数(看起来很可能),那么您只需要测试它返回的列表的长度。

但是,如果您不想验证是否始终如此,可以使用以下方法。

def ip_to_int(ip):
    return sum(256**i * int(v) for i, v in enumerate(reversed(ip.split('.'))))

def single_cidr(ip1, ip2):
    n1 = ip_to_int(ip1)
    n2 = ip_to_int(ip2)
    xor = n2 ^ n1
    return xor == abs(n2 - n1) and '0' not in bin(xor)[2:]

print(single_cidr('13.108.0.0', '13.111.255.255'))  # True
print(single_cidr('13.108.0.0', '13.211.255.255'))  # False

这里,xor 包含一个 1,表示两个 IP(转换为整数时)不同的每个位。我们希望这个数字等于两个值之间的差,并且还小于 2 的幂 - 以便二进制中的两个 IP 地址以相同的词干开头,然后一个全为 0,而另一个全为 1。

在'0' not in bin(xor)[2:] 部分中,我们使用了这样一个事实,即在初始0b 之后bin 的输出将从前1 位开始,不填充任何前导零(例如,对于65535,它将是'0b11111111'),所以我们只需要测试初始0b后面没有0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 2019-10-26
    • 2011-08-21
    • 2011-06-28
    相关资源
    最近更新 更多