Python3:根据CIDR符号创建可能的ip地址列表

Python3:根据CIDR符号创建可能的ip地址列表,python,subnet,cidr,Python,Subnet,Cidr,我的任务是用python(3.1)创建一个函数,该函数将采用CIDR表示法并返回可能的ip地址列表。我查看了python.org,发现了以下内容: 但我还没有看到任何能满足这种需要的东西。。。如果有人愿意为我提供帮助,我将不胜感激。提前感谢。:-) 你退房了吗?这似乎很合适。文档中没有,但浏览源代码表明ipaddr实现了\uuuu iter\uuuu和iterhosts,这正是您想要的 呃,没关系 它看起来像是在3.1beta版中将ipaddr.py添加到stdlib中,但被3.1rc删除了

我的任务是用python(3.1)创建一个函数,该函数将采用CIDR表示法并返回可能的ip地址列表。我查看了python.org,发现了以下内容:


但我还没有看到任何能满足这种需要的东西。。。如果有人愿意为我提供帮助,我将不胜感激。提前感谢。:-)

你退房了吗?这似乎很合适。

文档中没有,但浏览源代码表明
ipaddr
实现了
\uuuu iter\uuuu
iterhosts
,这正是您想要的


呃,没关系

  • 它看起来像是在3.1beta版中将
    ipaddr.py
    添加到stdlib中,但被3.1rc删除了
  • 我在看原始版本的源代码,它似乎是与python.org上的副本分开发展而来的

  • 您可以将后者捆绑起来。

    如果您还不习惯使用内置模块,那么有一个名为“这是我用于IP网络的最佳模块”的项目

    请看一看,这说明使用网络和识别IP是多么容易。简单的例子:

    >>> from netaddr import IPNetwork
    >>> for ip in IPNetwork('192.0.2.0/23'):
    ...    print '%s' % ip
    ...
    192.0.2.0
    192.0.2.1
    192.0.2.2
    192.0.2.3
    ...
    192.0.3.252
    192.0.3.253
    192.0.3.254
    192.0.3.255
    

    下面的代码将生成提供IP和子网的IP范围。展开CIDR表示法,如(255.255.255.0)


    我宁愿做一点数学,而不是安装一个外部模块,没有人和我有同样的品味

    #!/usr/bin/env python
    # python cidr.py 192.168.1.1/24
    
    import sys, struct, socket
    
    (ip, cidr) = sys.argv[1].split('/')
    cidr = int(cidr) 
    host_bits = 32 - cidr
    i = struct.unpack('>I', socket.inet_aton(ip))[0] # note the endianness
    start = (i >> host_bits) << host_bits # clear the host bits
    end = start | ((1 << host_bits) - 1)
    
    # excludes the first and last address in the subnet
    for i in range(start, end):
        print(socket.inet_ntoa(struct.pack('>I',i)))
    
    #/usr/bin/env python
    #python cidr.py 192.168.1.1/24
    导入系统、结构、套接字
    (ip,cidr)=sys.argv[1]。拆分('/'))
    cidr=int(cidr)
    主机\u位=32-cidr
    i=struct.unpack('>i',socket.inet_aton(ip))[0]35;注意结尾
    
    Python 3中的start=(i>>主机\u位)与

    >>> import ipaddress
    >>> [str(ip) for ip in ipaddress.IPv4Network('192.0.2.0/28')]
    ['192.0.2.0', '192.0.2.1', '192.0.2.2',
    '192.0.2.3', '192.0.2.4', '192.0.2.5',
    '192.0.2.6', '192.0.2.7', '192.0.2.8',
    '192.0.2.9', '192.0.2.10', '192.0.2.11',
    '192.0.2.12', '192.0.2.13', '192.0.2.14',
    '192.0.2.15']
    
    生成给定CIDR的所有公共IP地址 将生成有效IP公共地址列表,包括地址

    '1.0.0.0/8'
    '191.0.0.0/8'
    是有效的公用IP地址范围,不包括保留的专用IP地址

    IP发生器 生成IP地址和相关地理信息的JSON转储。 请注意,有效的公共IP地址范围为 从
    '1.0.0.0/8'
    '191.0.0/8'
    ,不包括保留的 本自述文件下方显示的专用IP地址范围

    docker build-t geo-ip。
    docker run-e IPRANGE='54.0.0.0/30'地理ip##几个ip
    docker run-e IPRANGE='54.0.0.0/26'地理ip##更多ip
    docker run-e IPRANGE='54.0.0.0/16'地理ip##更多ip
    docker run-e IPRANGE='0.0.0.0/0'地理ip###所有ip(SLOOOWWW)
    docker run-e IPRANGE='0.0.0.0/0'geo-ip>geo-ip.json##所有ip都保存到json文件
    docker运行地理ip
    
    扫描所有有效公共地址的更快选项:

    以美元表示的i的
    (序号191);做\
    docker run-e IPRANGE=“$i.0.0.0/8”地理ip\
    睡眠1;\
    完成
    
    这会将少于4228250625行JSON打印到标准输出。 以下是其中一行的示例:

    {"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
     "continent": "North America", "continent_code": "NA",
     "state": "California", "country": "United States", "latitude": 37.418,
     "iso_code": "US", "state_code": "CA", "aso": "PubNub",
     "asn": "11404", "zip_code": "94107"}
    
    专用和保留IP范围 上面repo中的dockerfile将排除不可用的IP地址 遵循维基百科文章中的指南:

    MaxMind Geo IP
    dockerfile导入由

    提供的免费公共数据库,因为它似乎不支持Python 2.3,所以可能至少需要付出一定的努力才能支持Python 3.1。我已经更新了iptools以支持Python 2.3、2.5、,2.6和3.1.如果您的问题有帮助,我可能希望返回并接受一些答案……我已经在Python2.x上使用了IPy(),现在正在将其移植到Python3。完成后,我将发布一个链接作为答案。@AJ:IPy也是一个不错的选择,但我推荐NetAddress,因为我更喜欢它。:)更新:我已经将IPy的新版本提交给当前的维护者进行审查。考虑到假期,我不确定何时发布,但一旦发布,我将发布一个链接。请注意,这不包括广播地址,广播地址可能是您想要的,也可能不是您想要的。当计算“结束”以包含它时,删除
    -1
    。@Peter,删除
    -1
    仅适用于偶数IP地址(例如,第四个八位字节以偶数结尾)。在减去1后,添加
    end+=1
    作为行。@jfky你能解释一下这个数学吗?有趣的是,映射是如何完成的?是否存在将CIDR网络映射到单个IP地址的确定性公式?或者需要一个数据库来进行映射?这直接在python3终端上工作,但在.py文件中如何?@Tony此答案的前两行可以进入.py文件,减去每行开头的>>>。在第二行中,您应该将列表分配给一个变量,然后可以查看该变量或对其执行其他操作。如果将[str(ip)for ip按原样放入ipaddress.IPv4Network('192.0.2.0/28')中的文件,然后运行它,则不会有输出。但将其分配给一个变量,如ip_list=[str(ip)for ip in ipaddress.IPv4Network('192.0.2.0/28')],然后您可以打印(ip_list)以查看列表。
    {"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
     "continent": "North America", "continent_code": "NA",
     "state": "California", "country": "United States", "latitude": 37.418,
     "iso_code": "US", "state_code": "CA", "aso": "PubNub",
     "asn": "11404", "zip_code": "94107"}