• python运维常用模块(二)——IPy


    1.安装

    IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的效率,包括网络性能、可扩展性等方面,在这个过程当中,免不了要计算大量的IP地址,包括网段、网络掩码、广播地址、子网数、IP类型等。Python提供了一个强大的第三方模块————IPy(https://github.com/haypo/python-ipy/)。IPy模块可以很好地辅助我们高效完成IP的规划工作,下面进行详细介绍。

    ipy采用pip安装方式:

    pip3 install ipy
    

    2.模块常用方法

    IPy模块包含IP类,使用它可以方便处理绝大部分格式为IPv6及IPv4的网络和地址。比如通过version方法就可以区分出IPv4与IPv6,如:

    >>> from IPy import IP
    >>> ip=IP('10.0.0.0/8').version()
    # 4代表IPv4类型
    >>> print(ip)
    4
    >>> ip=IP('::1').version()       
    >>> print(ip)             
    6
    

    通过指定的网段输出该网段的IP个数及所有IP地址清单,代码如下:

    >>> ip=IP('192.168.0.0/16')
    >>> print(ip.len())        
    65536
    
    # 输出192.168.0.0/16网段的所有IP清单
    >>> for x in ip:
    >>>     print(x) 
    

    IP类几个常见的方法,包括反向解析名称,IP地址,IP转换等

    >>> ip=IP('192.168.1.20')
    # 反向解析地址格式
    >>> ip.reverseNames()
    ['20.1.168.192.in-addr.arpa.']
    # 192.168.1.20为私网类型'PRIVATE'
    >>> ip=IP('192.168.1.20')
    >>> ip.iptype()
    'PRIVATE'
    # 8.8.8.8是公网类型
    >>> ip=IP('8.8.8.8')     
    >>> ip.iptype()     
    'PUBLIC'
    # 转换为整形格式
    >>> IP('8.8.8.8').int()   
    134744072
    # 转换为十六进制格式
    >>> IP('8.8.8.8').strHex()
    '0x8080808'
    # 转换为二进制格式
    >>> IP('8.8.8.8').strBin()
    '00001000000010000000100000001000'
    # 十六进制转换为IP格式
    >>> print(IP(0x8080808))
    8.8.8.8
    

    IP方法也支持网络地址的转换,例如根据IP与掩码生产网段格式,如下:

    >>> print(IP('192.168.1.0').make_net('255.255.255.0'))
    192.168.1.0/24
    >>> print(IP('192.168.1.0/255.255.255.0',make_net=True))
    192.168.1.0/24
    >>> print(IP('192.168.1.0-192.168.1.255',make_net=True))
    192.168.1.0/24
    

    也可以通过strNormal方法指定不同wantprefixlen参数值以定制不同,输出类型的网段。输出类型为字符串,如下:

    >>> IP('192.168.1.0/24').strNormal(0)
    '192.168.1.0'
    >>> IP('192.168.1.0/24').strNormal(1)
    '192.168.1.0/24'
    >>> IP('192.168.1.0/24').strNormal(2)
    '192.168.1.0/255.255.255.0'
    >>> IP('192.168.1.0/24').strNormal(3)
    '192.168.1.0-192.168.1.255'
    
    wantprefixlen的取值及含义:
    wantprefixlen=0,无返回,如192.168.1.0;
    wantprefixlen=1,prefix格式,如192.168.1.0/24;
    wantprefixlen=2,decimalnetmask格式,如192.168.1.0/255.255.255.0;
    wantprefixlen=3,lastIP格式,如192.168.1.0-192.168.1.255。
    
    多网格计算方法详解

    有时候我们想比较两个网段是否存在包含、重叠等关系,比如同 网络但不同prefixlen会认为是不相等的网段,如10.0.0.0/16不等于 10.0.0.0/24,另外即使具有相同的prefixlen但处于不同的网络地址,同样 也视为不相等,如10.0.0.0/16不等于192.0.0.0/16。IPy支持类似于数值型 数据的比较,以帮助IP对象进行比较,如:

    >>> IP('10.0.0.0/24') < IP('12.0.0.0/24')
    True
    

    判断IP地址和网段是否包含于另一个网段中,如下:

    >>> '192.168.1.100' in IP('192.168.1.0/24')
    True
    >>> IP('192.168.1.0/24') in IP('192.168.1.0/24')   
    True
    >>> IP('192.168.1.0/24') in IP('192.168.0.0/16')
    True
    

    判断两个网段是否存在重叠,采用IPy提供的overlaps方法,如:

    # 返回1代表存在重叠
    >>> IP('192.168.0.0/23').overlaps('192.168.1.0/24')
    1
    # 返回0代表不存在重叠
    >>> IP('192.168.0.0/24').overlaps('192.168.2.0')   
    0
    
    示例:

    根据输入的IP或子网返回网络,掩码,广播,反向解析,子网数,IP类型等信息

    #!/usr/bin/python3
    #_*_coding:utf-8_*_
    from IPy import IP
    # 接受用户输入,参数为IP地址或网段地址
    ip_s = input('Please input an IP or net-range: ')
    ips = IP(ip_s)
    # 为一个网段地址
    if len(ips) > 1:
       # 输出网段地址
       print('net: %s' % ips.net()) 
       # 输出网络掩码
       print('netmask: %s' % ips.netmask())
       # 输出广播地址
       print('broadcast: %s' % ips.netmask())
       # 输出反向解析网络地址
       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('binary ip: %s' % ips.strBin())
       # 输出地址类型 private,public,loopback等
       print('iptype: %s' %ips.iptype())
    

    执行结果:

    [root@prometheus01 ~]# python3 ip.py 
    Please input an IP or net-range: 192.168.1.0/24
    net: 192.168.1.0
    netmask: 255.255.255.0
    broadcast: 255.255.255.0
    reverse address: 1.168.192.in-addr.arpa.
    subnet: 256
    [root@prometheus01 ~]# python3 ip.py 
    Please input an IP or net-range: 192.168.1.120
    reverse address: 120.1.168.192.in-addr.arpa.
    hexadecimal: 0xc0a80178
    binary ip: 11000000101010000000000101111000
    iptype: PRIVATE
    

    4.关于更多

    >>> dir(IP)
    ['__add__', '__bool__', '__class__', '__cmp__', '__contains__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__weakref__', '_getIPv4Map', '_printPrefix', 'broadcast', 'get_mac', 'int', 'iptype', 'len', 'make_net', 'net', 'netmask', 'overlaps', 'prefixlen', 'reverseName', 'reverseNames', 'strBin', 'strCompressed', 'strDec', 'strFullsize', 'strHex', 'strNetmask', 'strNormal', 'v46map', 'version']
    

    官网文档与示例参考:https://github.com/haypo/python-ipy/

  • 相关阅读:
    [Java5新特性]可变参数
    [Java5新特性]自动装箱/拆箱
    CentOS6.5下安装apache2.2和PHP 5.5.28
    VMware Workstation(虚拟机)v10.0.1 简体中文破解版
    [Android]通过js方法回调部分native报错 Web Console: Uncaught TypeError: Object [object Object] has no method 'xxx'
    Android WebView与JavaScript交互操作(Demo)
    【CSS3 入门教程系列】CSS3 Media Queries 实现响应式设计
    Bootstrap 3支持IE 8遇到的一个小问题
    php文件大小单位转换GB MB KB
    2个比较经典的PHP加密解密函数分享
  • 原文地址:https://www.cnblogs.com/even160941/p/16077356.html
Copyright © 2020-2023  润新知