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