• Python-IPy模块


    IPy

    1.简单介绍

    Python官方提供了一个强大的模块IPy辅助我们完成IP的规划工作。官方介绍(Class and tools for handling of IPv4 and IPv6 addresses and networksIPy - class and tools for handling of IPv4 and IPv6 addresses and networks.)做运维工作的同学不妨去Website看看。
    Website: https://github.com/autocracy/python-ipy/ (github地址)

    2.安装

    我使用了一台装有python3.6.1的Mac笔记本去安装。

    pip3.6 install ipy
    可以看到pip下载到的是0.83版本的IPy。
    Collecting ipy
      Downloading IPy-0.83.tar.gz
    Installing collected packages: ipy
      Running setup.py install for ipy ... done
    Successfully installed ipy-0.83
    

    3.基本使用

    3.1 ip地址,网段基本处理

    通过指定的网段输出该网段的IP个数以及所有IP地址的清单。

    In [1]: from IPy import IP
    In [2]: ip = IP('192.168.1.0/24')
    In [3]: print (ip.len())
    256
    In [4]: for i in ip:
       ...:     print (i)
       ......
    192.168.1.243
    192.168.1.244
    192.168.1.245
    192.168.1.246
    192.168.1.247
    192.168.1.248
    192.168.1.249
    192.168.1.250
    192.168.1.251
    192.168.1.252
    192.168.1.253
    192.168.1.254
    192.168.1.255
    

    区分IPv4和IPv6地址。

    In [5]: IP('192.168.136.0/24').version()
    Out[5]: 4
    In [6]: IP('::13.13.13.13').version()
    Out[6]: 6
    

    反向解析,IP类型,IP转换等。

    In [7]: ip = IP('127.0.0.1')
    In [8]: ip.reverseNames()	#反向解析地址格式
    Out[8]: ['1.0.0.127.in-addr.arpa.']
    In [9]: ip.iptype()	#IP类型私网地址
    Out[9]: 'PRIVATE'
    In [10]: ip = IP('8.8.8.8')
    In [11]: ip.reverseName()	#注意反向解析reverseNames返回的列表格式
    Out[11]: '8.8.8.8.in-addr.arpa.'
    In [12]: ip.reverseNames()
    Out[12]: ['8.8.8.8.in-addr.arpa.']
    In [13]: ip.iptype() #IP类型公网地址
    Out[13]: 'PUBLIC'
    In [14]: IP('8.8.8.8').int()
    Out[14]: 134744072
    In [15]: IP('8.8.8.8').strBin()
    Out[15]: '00001000000010000000100000001000'
    In [16]: IP('8.8.8.8').strHex()
    Out[16]: '0x8080808'
    In [17]: IP('8.8.8.8').strNetmask()
    Out[17]: '255.255.255.255'
    In [19]: print(IP(0x8080808))
    8.8.8.8
    

    IP方法也支持网络地址转换,比如根据IP与子网掩码生产网段。

    In [20]: print (IP('192.168.1.0').make_net('255.255.255.0'))
    192.168.1.0/24
    In [21]: print (IP('192.168.1.0').make_net('255.255.0.0'))
    192.168.0.0/16
    In [22]: print (IP('192.168.1.0').make_net('255.0.0.0'))
    192.0.0.0/8
    In [24]: print (IP('192.168.1.0/255.0.0.0',make_net=True))
    192.0.0.0/8
    In [25]: print (IP('192.168.1.0/255.255.0.0',make_net=True))
    192.168.0.0/16
    In [26]: print (IP('192.168.1.0/255.255.255.0',make_net=True))
    192.168.1.0/24
    In [30]: print (IP('192.1.0.0-192.1.255.255',make_net=True))
    192.1.0.0/16
    In [31]: print (IP('192.169.0.0-192.169.255.255',make_net=True))
    192.169.0.0/16
    In [32]: print (IP('192.169.1.0-192.169.1.255',make_net=True))
    192.169.1.0/24
    

    也可以通过strNormal方法指定不同的wantprefixlen参数值以定制不同输出类型的网段。

    说明
    wantprefixlen == 0 / None     don't return anything   1.2.3.0
    wantprefixlen == 1            /prefix                 1.2.3.0/24
    wantprefixlen == 2            /netmask                1.2.3.0/255.255.255.0
    wantprefixlen == 3            -lastip                 1.2.3.0-1.2.3.255
    例子
    In [33]: IP('192.168.1.0/24').strNormal()
    Out[33]: '192.168.1.0/24'
    In [34]: IP('192.168.1.0/24').strNormal(0)
    Out[34]: '192.168.1.0'
    In [35]: IP('192.168.1.0/24').strNormal(1)
    Out[35]: '192.168.1.0/24'
    In [36]: IP('192.168.1.0/24').strNormal(2)
    Out[36]: '192.168.1.0/255.255.255.0'
    In [37]: IP('192.168.1.0/24').strNormal(3)
    Out[37]: '192.168.1.0-192.168.1.255'
    In [38]: ip = IP('192.168.136.0')
    In [39]: print (ip)
    192.168.136.0
    In [40]: ip.NoPrefixForSingleIp = None
    In [41]: print (ip)
    192.168.136.0/32
    In [42]: ip.WantPrefixLen = 3
    In [43]: print(ip)
    192.168.136.0-192.168.136.0
    

    3.2多网络计算方法

    判断ip地址和网段是否包含于另一个网段中
    In [44]: IP('192.168.136.0/24') in IP('192.168.0.0/16')
    Out[44]: True
    In [46]: IP('192.168.136.0/24') in IP('192.168.1.0/24')
    Out[46]: False
    判断俩个网段是否重叠
    In [48]: IP('192.168.0.0/16').overlaps('192.168.136.0/24')
    Out[48]: 1	#返回1表示重叠
    In [49]: IP('192.168.137.0/24').overlaps('192.168.136.0/24')
    Out[49]: 0	#返回0表手不存在重叠
    小例子:
    #!/usr/bin/python
    from IPy import IP
    
    ip_input = input("Please input an IP or net-range:")
    ips = IP(ip_input)
    
    if len(ips) > 1:
        print('net: %s' % ips.net())
        print('netmask: %s' % ips.netmask())
        print('broadcast: %s' % ips.broadcast())
        print('reverse address: %s' % ips.reverseNames()[0])
        print('subnet: %s' % len(ips))
    else:
        print('reverse address: %s' % ips.reverseNames()[0])
    
    print('hexadecimal: %s' % ips.strHex())
    print('binaryip: %s' % ips.strBin())
    print('iptype: %s' % ips.iptype())
    
    运行
    Please input an IP or net-range:8.8.8.0/24
    net: 8.8.8.0
    netmask: 255.255.255.0
    broadcast: 8.8.8.255
    reverse address: 8.8.8.in-addr.arpa.
    subnet: 256
    hexadecimal: 0x8080800
    binaryip: 00001000000010000000100000000000
    iptype: PUBLIC
    
  • 相关阅读:
    ef unitofwork 主从表更新
    自己写的enum转换的一个扩展,
    最近在做政务项目,此种项目,本来并不大,主要原因呢,就是要理好业务需要。
    sql server创建外键,子母表,级联删除。
    js querySelector与getElementById
    写一个system.data.entity的simpledatarepo,实现crudq这些功能,不需要引入entityframework,直接可以使用,用到objectset
    无法更新 EntitySet“W_ReceiveData”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持当前操作的 <InsertFunction> 元素。
    Kubernetes v1.17 版本解读 | 云原生生态周报 Vol. 31
    开放下载 | 《Knative 云原生应用开发指南》开启云原生时代 Serverless 之门
    有了 serverless,前端也可以快速开发一个 Puppeteer 网页截图服务
  • 原文地址:https://www.cnblogs.com/jason007/p/7844172.html
Copyright © 2020-2023  润新知