用于计算使用通配符输出的网络主机的脚本

2024-07-02 10:39:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要将一系列IP加载到报告应用程序中,不幸的是,该应用程序不了解子网,也不允许我将几百万个IP地址加载到其中。不过,它允许我使用通配符加载数据,因此我希望通过使用通配符整合网络上的IP地址,将我的IP列表压缩为更易于管理的大小,但我也不希望无意中包括不在网络列表中的IP,这会使这变得更复杂

我有一个CIDR格式的网络列表(例如:192.168.1.0/24),可以很容易地得到这样的最小和最大IP地址

import ipaddress

TheSubnets = open('Networks.txt', 'r')
for network in TheSubnets.readlines():
    AllIPs = ipaddress.IPv4Network(network.strip())
    minIP = AllIPs[0]
    maxIP = AllIPs[-1]

然而,我不知道的是如何有效地整合它们,以生成一组可以覆盖网络上所有IP的通配符IP地址

24位子网掩码很简单,我只删除了最后一个八位字节,因此192.168.1.0/24将只是192.168.1。*

但是,对于不同的子网,这变得更加棘手:

output needed

是否有一种简单的方法将主机列表合并为通配符列表,以确保每个网络中只有IP地址与通配符值匹配


Tags: 数据importip网络应用程序列表格式报告
1条回答
网友
1楼 · 发布于 2024-07-02 10:39:46

这比我预想的要复杂得多,但这应该行得通convert_range是主要函数

def gen_patterns(start, end):
    """
    generator that yields patterns representing a given range of integers
    e.g. for inputs 7, 31 will yield the sequence '7' '8' '9' '1?' '2?' '30' '31'
    """
    endp1 = end + 1
    
    while end > start:
        mult = 1
        mult_next = 10
        mult_col = 0
        while (start % mult_next == 0
               and endp1 - start >= mult * 10):
            mult *= 10
            mult_next *= 10
            mult_col += 1
            
        first_digit = (start // mult) % 10

        start_upper = start // mult_next
        
        if endp1 // mult_next > start_upper:
            last_digit = 9            
        else:
            last_digit = (endp1 // mult) % 10 - 1

        prefix = str(start_upper) if start_upper else ''
        suffix = '?' * mult_col
            
        for digit in range(first_digit, last_digit + 1):
            if start_upper or digit:
                yield f'{prefix}{digit}{suffix}'
            else:
                for i in range(1, mult_col + 1):
                    yield '?' * i

        start += mult * (last_digit - first_digit + 1)


def convert_range(network):
    """
    Convert a network range (IPv4Network object) into a list of
    string patterns that represent it.
    """
    bits = network.prefixlen
    if bits == 0:
        return '*'
    
    num_fixed = bits // 8  # number of octets that are same for all addresses
    num_star = (32 - bits) // 8  # number of octets that have '*'

    first_addr_octets = str(network[0]).split('.')
    last_addr_octets = str(network[-1]).split('.')

    prefix = '.'.join(first_addr_octets[:num_fixed])

    #suffix = '.*' * num_star            # version that produces e.g. 10.*.*.*
    suffix = '.*' if num_star else ''    # version that produces e.g. 10.*

    if num_fixed + num_star == 4:
        return [prefix + suffix]

    else:
        start = int(first_addr_octets[num_fixed])
        end = int(last_addr_octets[num_fixed])

        patterns = gen_patterns(start, end)
        if prefix:
            prefix += '.'
        return [prefix + pattern + suffix for pattern in patterns]

#===================================================================

if __name__ == '__main__':

    import ipaddress

    # test it with all the different ranges that include
    # the single address 10.124.148.135
    test_ranges = """
    0.0.0.0/0
    0.0.0.0/1
    0.0.0.0/2
    0.0.0.0/3
    0.0.0.0/4
    8.0.0.0/5
    8.0.0.0/6
    10.0.0.0/7
    10.0.0.0/8
    10.0.0.0/9
    10.64.0.0/10
    10.96.0.0/11
    10.112.0.0/12
    10.120.0.0/13
    10.124.0.0/14
    10.124.0.0/15
    10.124.0.0/16
    10.124.128.0/17
    10.124.128.0/18
    10.124.128.0/19
    10.124.144.0/20
    10.124.144.0/21
    10.124.148.0/22
    10.124.148.0/23
    10.124.148.0/24
    10.124.148.128/25
    10.124.148.128/26
    10.124.148.128/27
    10.124.148.128/28
    10.124.148.128/29
    10.124.148.132/30
    10.124.148.134/31
    10.124.148.135/32
    """.strip().split()

    for nstr in test_ranges:

        network = ipaddress.IPv4Network(nstr)    
        print(f'Network: {nstr}')
        print(f'Range: {network[0]} - {network[-1]}' )
        print('Patterns:')
        for pattern in convert_range(network):
            print(f'   {pattern}')

        print()

所有测试用例的输出:

Network: 0.0.0.0/0
Range: 0.0.0.0 - 255.255.255.255
Patterns:
   *

Network: 0.0.0.0/1
Range: 0.0.0.0 - 127.255.255.255
Patterns:
   ?.*
   ??.*
   10?.*
   11?.*
   120.*
   121.*
   122.*
   123.*
   124.*
   125.*
   126.*
   127.*

Network: 0.0.0.0/2
Range: 0.0.0.0 - 63.255.255.255
Patterns:
   ?.*
   1?.*
   2?.*
   3?.*
   4?.*
   5?.*
   60.*
   61.*
   62.*
   63.*

Network: 0.0.0.0/3
Range: 0.0.0.0 - 31.255.255.255
Patterns:
   ?.*
   1?.*
   2?.*
   30.*
   31.*

Network: 0.0.0.0/4
Range: 0.0.0.0 - 15.255.255.255
Patterns:
   ?.*
   10.*
   11.*
   12.*
   13.*
   14.*
   15.*

Network: 8.0.0.0/5
Range: 8.0.0.0 - 15.255.255.255
Patterns:
   8.*
   9.*
   10.*
   11.*
   12.*
   13.*
   14.*
   15.*

Network: 8.0.0.0/6
Range: 8.0.0.0 - 11.255.255.255
Patterns:
   8.*
   9.*
   10.*
   11.*

Network: 10.0.0.0/7
Range: 10.0.0.0 - 11.255.255.255
Patterns:
   10.*
   11.*

Network: 10.0.0.0/8
Range: 10.0.0.0 - 10.255.255.255
Patterns:
   10.*

Network: 10.0.0.0/9
Range: 10.0.0.0 - 10.127.255.255
Patterns:
   10.?.*
   10.??.*
   10.10?.*
   10.11?.*
   10.120.*
   10.121.*
   10.122.*
   10.123.*
   10.124.*
   10.125.*
   10.126.*
   10.127.*

Network: 10.64.0.0/10
Range: 10.64.0.0 - 10.127.255.255
Patterns:
   10.64.*
   10.65.*
   10.66.*
   10.67.*
   10.68.*
   10.69.*
   10.7?.*
   10.8?.*
   10.9?.*
   10.10?.*
   10.11?.*
   10.120.*
   10.121.*
   10.122.*
   10.123.*
   10.124.*
   10.125.*
   10.126.*
   10.127.*

Network: 10.96.0.0/11
Range: 10.96.0.0 - 10.127.255.255
Patterns:
   10.96.*
   10.97.*
   10.98.*
   10.99.*
   10.10?.*
   10.11?.*
   10.120.*
   10.121.*
   10.122.*
   10.123.*
   10.124.*
   10.125.*
   10.126.*
   10.127.*

Network: 10.112.0.0/12
Range: 10.112.0.0 - 10.127.255.255
Patterns:
   10.112.*
   10.113.*
   10.114.*
   10.115.*
   10.116.*
   10.117.*
   10.118.*
   10.119.*
   10.120.*
   10.121.*
   10.122.*
   10.123.*
   10.124.*
   10.125.*
   10.126.*
   10.127.*

Network: 10.120.0.0/13
Range: 10.120.0.0 - 10.127.255.255
Patterns:
   10.120.*
   10.121.*
   10.122.*
   10.123.*
   10.124.*
   10.125.*
   10.126.*
   10.127.*

Network: 10.124.0.0/14
Range: 10.124.0.0 - 10.127.255.255
Patterns:
   10.124.*
   10.125.*
   10.126.*
   10.127.*

Network: 10.124.0.0/15
Range: 10.124.0.0 - 10.125.255.255
Patterns:
   10.124.*
   10.125.*

Network: 10.124.0.0/16
Range: 10.124.0.0 - 10.124.255.255
Patterns:
   10.124.*

Network: 10.124.128.0/17
Range: 10.124.128.0 - 10.124.255.255
Patterns:
   10.124.128.*
   10.124.129.*
   10.124.13?.*
   10.124.14?.*
   10.124.15?.*
   10.124.16?.*
   10.124.17?.*
   10.124.18?.*
   10.124.19?.*
   10.124.20?.*
   10.124.21?.*
   10.124.22?.*
   10.124.23?.*
   10.124.24?.*
   10.124.250.*
   10.124.251.*
   10.124.252.*
   10.124.253.*
   10.124.254.*
   10.124.255.*

Network: 10.124.128.0/18
Range: 10.124.128.0 - 10.124.191.255
Patterns:
   10.124.128.*
   10.124.129.*
   10.124.13?.*
   10.124.14?.*
   10.124.15?.*
   10.124.16?.*
   10.124.17?.*
   10.124.18?.*
   10.124.190.*
   10.124.191.*

Network: 10.124.128.0/19
Range: 10.124.128.0 - 10.124.159.255
Patterns:
   10.124.128.*
   10.124.129.*
   10.124.13?.*
   10.124.14?.*
   10.124.15?.*

Network: 10.124.144.0/20
Range: 10.124.144.0 - 10.124.159.255
Patterns:
   10.124.144.*
   10.124.145.*
   10.124.146.*
   10.124.147.*
   10.124.148.*
   10.124.149.*
   10.124.15?.*

Network: 10.124.144.0/21
Range: 10.124.144.0 - 10.124.151.255
Patterns:
   10.124.144.*
   10.124.145.*
   10.124.146.*
   10.124.147.*
   10.124.148.*
   10.124.149.*
   10.124.150.*
   10.124.151.*

Network: 10.124.148.0/22
Range: 10.124.148.0 - 10.124.151.255
Patterns:
   10.124.148.*
   10.124.149.*
   10.124.150.*
   10.124.151.*

Network: 10.124.148.0/23
Range: 10.124.148.0 - 10.124.149.255
Patterns:
   10.124.148.*
   10.124.149.*

Network: 10.124.148.0/24
Range: 10.124.148.0 - 10.124.148.255
Patterns:
   10.124.148.*

Network: 10.124.148.128/25
Range: 10.124.148.128 - 10.124.148.255
Patterns:
   10.124.148.128
   10.124.148.129
   10.124.148.13?
   10.124.148.14?
   10.124.148.15?
   10.124.148.16?
   10.124.148.17?
   10.124.148.18?
   10.124.148.19?
   10.124.148.20?
   10.124.148.21?
   10.124.148.22?
   10.124.148.23?
   10.124.148.24?
   10.124.148.250
   10.124.148.251
   10.124.148.252
   10.124.148.253
   10.124.148.254
   10.124.148.255

Network: 10.124.148.128/26
Range: 10.124.148.128 - 10.124.148.191
Patterns:
   10.124.148.128
   10.124.148.129
   10.124.148.13?
   10.124.148.14?
   10.124.148.15?
   10.124.148.16?
   10.124.148.17?
   10.124.148.18?
   10.124.148.190
   10.124.148.191

Network: 10.124.148.128/27
Range: 10.124.148.128 - 10.124.148.159
Patterns:
   10.124.148.128
   10.124.148.129
   10.124.148.13?
   10.124.148.14?
   10.124.148.15?

Network: 10.124.148.128/28
Range: 10.124.148.128 - 10.124.148.143
Patterns:
   10.124.148.128
   10.124.148.129
   10.124.148.13?
   10.124.148.140
   10.124.148.141
   10.124.148.142
   10.124.148.143

Network: 10.124.148.128/29
Range: 10.124.148.128 - 10.124.148.135
Patterns:
   10.124.148.128
   10.124.148.129
   10.124.148.130
   10.124.148.131
   10.124.148.132
   10.124.148.133
   10.124.148.134
   10.124.148.135

Network: 10.124.148.132/30
Range: 10.124.148.132 - 10.124.148.135
Patterns:
   10.124.148.132
   10.124.148.133
   10.124.148.134
   10.124.148.135

Network: 10.124.148.134/31
Range: 10.124.148.134 - 10.124.148.135
Patterns:
   10.124.148.134
   10.124.148.135

Network: 10.124.148.135/32
Range: 10.124.148.135 - 10.124.148.135
Patterns:
   10.124.148.135

注意gen_patterns并不试图利用255是最高允许值这一事实,因此以255结尾的一些范围将显式地具有250251255而不是25?

相关问题 更多 >