【IPy模块01】Python运维模块之IP 地址、网段的基本处理
实用的IP地址处理模块IPy
IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的效率,包括网络性能、可扩展性等方面,在这个过程当中,免不了要计算大量的IP地址,包括网段、网络掩码、广播地址、子网数、P类型等。Python 提供了一个强大的第三方模块IPy(https://github.com/haypo/python-ipy/)
IPy模块可以很好地辅助我们高效完成IP的规划工作,下面进行详细介绍。
安装方式:pip install IPy
检测方法:
[root@python project]#ipython
In [1]: import IPy
In [2]: dir(IPy)
Out[2]:
['INT_TYPES',
'IP',
'IPSet',
'IPV6_MAP_MASK',
'IPV6_TEST_MAP',
'IPint',
。。。。。。。(省略)
1.2.1、IP 地址、网段的基本处理
1.通过 version方法就可以区分出IPv4与IPv6
IPy模块包含IP类,使用它可以方便处理绝大部分格式为IPv6及IPv4的网络和地址。比如通过 version方法就可以区分出IPv4与IPv6,如:
#IP().version()
from IPy import IP
ip_content = '172.16.17.32'
ip_result = IP(ip_content).version()
print("IP:{:<13}ip类型为:{}".format(ip_content,ip_result))
ip_content = 'fe80::20c:29ff:fe60'
ip_result = IP(ip_content).version()
print("IP:{:<20}ip类型为:{}".format(ip_content,ip_result))
#输出:
IP:172.16.17.32 ip类型为:4
IP:fe80::20c:29ff:fe60 ip类型为:6
2.通过指定的网段输出该网段的IP个数及所有IP地址清单,代码如下:
#IP().len()
from IPy import IP
ip_range = IP('192.168.127.0/30')
ip_result = ip_range.len()
print("IP网段:{:<17}有{}个ip".format(str(ip_range),ip_result))
for i in ip_range:
print(str(i))
#输出:
IP网段:192.168.127.0/30 有4个ip
192.168.127.0
192.168.127.1
192.168.127.2
192.168.127.3
3.反向解析名称、IP类型、IP转换等
下面介绍IP 类几个常见的方法,包括反向解析名称、IP类型、IP转换等。
基本语法
反向解析名称
reverseNames()
ip类型
iptype()
ip转换
转换成整型!int()
转换成十六进制 strHex()
转换成二进制 strBin()
十六进制转换成ip地址 IP()
简单实践
from IPy import IP
#1 反向解析名称
#1-1 定制ip地址
my_ip = IP('153.3.238.110')
#1-2 获取定制域名
name = my_ip.reverseNames()
print("{}的域名名称是{}.".format(my_ip,name))
输出:153.3.238.110的域名名称是['110.238.3.153.in-addr.arpa.']
#2 ip类型
#2-1 定制ip地址
my_ip1 = IP('153.3.238.110')
my_ip2 = IP('192.168.1.1')
#2-2 获取定制域名
name1 = my_ip1.iptype()
name2 = my_ip2.iptype()
print("{}的类型是 {}.".format(my_ip1,name1))
print("{}的类型是 {}.".format(my_ip2,name2))
输出:
153.3.238.110的类型是 PUBLIC #PUBLIC(公网),PRIVATE(私网)
192.168.1.1的类型是 PRIVATE
#3 ip类型
#3-1 定制ip地址
my_ip1 = IP('153.3.238.110')
#3-2 转换类型
int_reslut = my_ip.int()
print("{} 的转换成整型 {}.".format(my_ip,int_reslut))
Hex_reslut = my_ip.strHex()
print("{} 的转换成16进制 {}.".format(my_ip,Hex_reslut))
Bin_reslut = my_ip.strBin()
print("{} 的转换成2进制 {}.".format(my_ip,Bin_reslut))
int_reslut = IP(Hex_reslut)
print("{} 的16进制转换成ip {}.".format(Hex_reslut,int_reslut))
输出:
153.3.238.110 的转换成整型 2567171694
153.3.238.110 的转换成16进制 0x9903ee6e
153.3.238.110 的转换成2进制 10011001000000111110111001101110
0x9903ee6e 的16进制转换成ip 153.3.238.110
4.根据IP与掩码生成网段格式
IP方法也支持网络地址的转换,例如根据IP与掩码生产网段格式,如下:
基本语法
1 网段地址转换
IP('ip地址').make_net('掩码地址')
IP('ip地址段'),make_net=True)
简单实践
from IPy import IP
#1 网段地址转换
#1-1 转换样式1
ip_net = '192.168.1.0'
ip_result = IP(ip_net).make_net('255.255.255.0')
print("{} 转换后的样式 {}".format(ip_net,ip_result))
#1-1 转换样式2
ip_net = '192.168.1.0/255.255.0.0'
ip_result = IP(ip_net,make_net=True)
print("{} 转换后的样式 {}".format(ip_net,ip_result))
#1-1 转换样式3
ip_net = '192.168.1.0-192.168.1.255'
ip_result = IP(ip_net,make_net=True)
print("{} 转换后的样式 {}".format(ip_net,ip_result))
输出:
192.168.1.0 转换后的样式 192.168.1.0/24
192.168.1.0/255.255.0.0 转换后的样式 192.168.0.0/16
192.168.1.0-192.168.1.255 转换后的样式 192.168.1.0/24
5.strNormal方法
也可以通过 strNormal方法指定不同 wantprefixlen 参数值以定制不同输出类型的网段输出类型为字符串,如下:
wantprefixlen的取值及含义:
wantprefxlen=0,无返回,如192.168.1.0;
wantprefxlen=1,prefx格式,如 192.168.1.0/24;
wantprefxlen=2,decimalnetmask格式,如192.168.1.0/255.255.255.0;
wantprefxlen=3,lastIP格式,如192.168.1.0-192.168.1.255。
简单实践
from IPy import IP
#1 网段地址转换
#1-1 定制ip地址
my_ip = IP('192.168.8.0/24')
#1-2 格式转换
format_0 = my_ip.strNormal(0)
print("{} 转换样式0 {}".format(my_ip,format_0))
format_1 = my_ip.strNormal(1)
print("{} 转换样式1 {}".format(my_ip,format_1))
format_2 = my_ip.strNormal(2)
print("{} 转换样式2 {}".format(my_ip,format_2))
format_3 = my_ip.strNormal(3)
print("{} 转换样式3 {}".format(my_ip,format_3))
输出:
192.168.8.0/24 转换样式0 192.168.8.0
192.168.8.0/24 转换样式1 192.168.8.0/24
192.168.8.0/24 转换样式2 192.168.8.0/255.255.255.0
192.168.8.0/24 转换样式3 192.168.8.0-192.168.8.255