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
原文地址:https://www.cnblogs.com/jason007/p/7844172.html