【问题标题】:How can I generate all possible IPs from a CIDR list in Python?如何从 Python 中的 CIDR 列表生成所有可能的 IP?
【发布时间】:2026-02-08 19:45:01
【问题描述】:

假设我有一个文本文件包含一堆这样的 cidr ip 范围:

x.x.x.x/24
x.x.x.x/24
x.x.x.x/23
x.x.x.x/23
x.x.x.x/22
x.x.x.x/22
x.x.x.x/21

然后继续……

如何在 Python 的新文本文件中将这些 cidr 表示法转换为所有可能的 ip 列表?

【问题讨论】:

  • @brbcoding 根本没有。这个问题是“从 cidr 列表生成所有可能的 ips”,而这个问题是“将 cidr 列表转换为 ip 范围列表”。 “IP范围”和“可能的ips”不是一回事。它们是完全不同的东西。 IP 范围类似于“x.x.x.x-y.y.y.y”,但可能的 ip 列表是从符号生成的每个 ip。

标签: python ip converter generator cidr


【解决方案1】:

您可以为此使用 netaddr。下面的代码将在您的磁盘上创建一个文件,并用请求块中的每个 IP 地址填充它:

from netaddr import *

f = open("everyip.txt", "w")
ip = IPNetwork('10.0.0.0/8')

for addr in ip:
    f.write(str(addr) + '\n')

f.close()

【讨论】:

    【解决方案2】:

    如果您不需要从头开始编写脚本的满足感,您可以使用 python cidrize 包。

    【讨论】:

      【解决方案3】:

      基于How can I generate all possible IPs from a list of ip ranges in Python?

      import struct, socket
      def ips(start, end):
          start = struct.unpack('>I', socket.inet_aton(start))[0]
          end = struct.unpack('>I', socket.inet_aton(end))[0]
          return [socket.inet_ntoa(struct.pack('>I', i)) for i in range(start, end)]
      
      # ip/CIDR
      ip = '012.123.234.34'
      CIDR = 10
      i = struct.unpack('>I', socket.inet_aton(ip))[0] # number
      # 175893026
      start = (i >> CIDR) << CIDR # shift right end left to make 0 bits
      end = i | ((1 << CIDR) - 1) # or with 11111 to make highest number
      start = socket.inet_ntoa(struct.pack('>I', start)) # real ip address
      end = socket.inet_ntoa(struct.pack('>I', end))
      ips(start, end) 
      

      【讨论】:

      • 恐怕您将 CIDR 误认为是主机位数。您的代码给出了错误的输出。
      • 如果我错了,我该如何改进?你想编辑代码,让它工作吗?应该是CIDR = 32 - 10
      • 是的,你可以试试192.168.1.1/24来验证。
      最近更新 更多