选择子网范围的每个第一个和最后一个IP地址



我有一个子网172.16.0.0/22,其中有四个范围172.16.0.0 → 172.16.0.255 172.16.1.0 → 172.16.1.255172.16.2.0 → 172.16.2.255172.16.3.0 → 172.16.3.255。我正在使用netaddr来查找这些范围。

import netaddr
network = netaddr.IPNetwork(addr="172.16.0.0/22")
print(list(network))
# output
[
IPAddress("172.16.0.0"), 
IPAddress("172.16.0.1"),
...,
IPAddress("172.16.0.254"),
IPAddress("172.16.0.255"),
...,
IPAddress("172.16.1.0"),
IPAddress("172.16.1.1"),
...,
IPAddress("172.16.1.254"),
IPAddress("172.16.1.255"),
...,
IPAddress("172.16.2.0"),
IPAddress("172.16.2.1"),
...,
IPAddress("172.16.2.254"),
IPAddress("172.16.2.255"),
...,
IPAddress("172.16.3.0"),
IPAddress("172.16.3.1"),
...,
IPAddress("172.16.3.254"),
IPAddress("172.16.3.255"),
]

如何选择每个范围的每个.1.254?即,我如何才能得到一个看起来像这个的输出

[
    (172.16.0.1, 172.16.0.254), 
    (172.16.1.1, 172.16.1.254),
    (172.16.2.1, 172.16.2.254),
    (172.16.3.1, 172.16.3.254)
]

试试这个:

result = [(str(network[256 * r + 1]), str(network[256 * r + 254]))
          for r in range(len(network) // 256)]

基本上,对于每个范围(有len(network) // 256个范围(,都取元素n.1(network[256 * r + 1](和n.254(network[256 * r + 254](。这些元素是类<class 'netaddr.ip.IPAddress'>的实例:为了将它们转换为字符串,您可以使用str内置函数。

我还没有用netaddr对象尝试过,但代码也应该按原样运行,因为我将地址转换为字符串。但这并不是你想要的。每个范围的地址都保存在列表中。

network = [
"172.16.0.0","172.16.0.1","172.16.0.254","172.16.0.255","172.16.1.0",
"172.16.1.1","172.16.1.254","172.16.1.255","172.16.2.0","172.16.2.1",
"172.16.2.254","172.16.2.255","172.16.3.0",
"172.16.3.1","172.16.3.254","172.16.3.255",
]
def get_adress(network):
    output,tmp = [],[]
    for ad in network:
        ad_str = str(ad)
        if ad_str.endswith('.1') or ad_str.endswith('.254'):
            tmp.append(ad_str)
            if len(tmp)==2:
                output.append(tmp)
                tmp= []
    return(output)
output= get_adress(network)
print(output)
>>[['172.16.0.1', '172.16.0.254'],
 ['172.16.1.1', '172.16.1.254'],
 ['172.16.2.1', '172.16.2.254'],
 ['172.16.3.1', '172.16.3.254']]

编辑

现在,它将地址作为列表中的元组。

def get_adress(network):
    one,two = [],[]
    for ad in network:
        ad_str = str(ad)
        if ad_str.endswith('.1'): 
            one.append(ad_str)
        elif ad_str.endswith('.254'):
            two.append(ad_str)
    return(list(zip(one, two)))
output= get_adress(network)
output
>>[('172.16.0.1', '172.16.0.254'),
 ('172.16.1.1', '172.16.1.254'),
 ('172.16.2.1', '172.16.2.254'),
 ('172.16.3.1', '172.16.3.254')]

检查每个IP地址中的最后一个八进制,看看它们是否是所需的数字。我更喜欢这个解决方案,因为它只使用netaddr对象结构。

[n for n in network if n.words[-1] in [1, 254]]

最新更新