IP地址操作管理库——IPy库

一、 简介

在IP地址规划中,涉及到计算大量的IP地址,包括网段、网络掩码、广播地址、子网数、IP类型等,即便是专业的网络人员也要进行繁琐的计算,而IPy模块提供了专门针对IPV4地址与IPV6地址的类与工具,可以帮助实现计算子网掩码、网络掩码、广播地址、子网数、IP类型等。

二、 安装

pip install IPy

三、 基本使用

IPy模块内部主要主要提供了IP类、IPint类,IPset类.
我们常用的就是IP类,这个类可以接受几乎任何格式的IP地址和网段。

A、获取IP地址信息

1、version():获取IP地址的版本

x = IPy.IP('192.168.1.1').version()  #该IP地址的版本为:4
x = IPy.IP('192.168.1.0/30').version()  #该IP地址的版本为:4
x = IPy.IP('::1').version()  #该IP地址的版本为:6

2、len():获取子网IP地址的个数

x = IPy.IP('192.168.1.0').len()  #子网IP地址的个数:1
x = IPy.IP('192.168.1.0/30').len()  #子网IP地址的个数:4
x = IPy.IP('192.168.1.0/24').len()  #子网IP地址的个数:256    32-24=8个网络号  2的8次方为256
# IPV4后面如果没有/的话,按单个IP地址计算,有/的话,根据子网计算

3、iptpe():获取IP地址的类型

x = IPy.IP('192.168.1.0').iptype() #IP地址类型:PRIVATE
x = IPy.IP('8.8.8.8').iptype() #IP地址类型:PUBLIC
x = IPy.IP('127.0.0.1').iptype() #IP地址类型:LOOPBACK
# PRIVATE表示私有地址,PUBLIC表示公有地址,LOOPBACK表示环回地址
#IPv6的类型信息与实际不同步。

4、net():作为IP对象返回网络的第一个地址,即基址

x = IPy.IP('192.168.1.0/24')() #IP地址的基址:192.168.1.0
x = IPy.IP('8.8.8.0/24')() #IP地址的基址:8.8.0.0  
x = IPy.IP('127.0.0.0/8')() #IP地址的基址:127.0.0.0

5、broadcast():作为IP对象返回网络的最后地址,即广播地址

x = IPy.IP('192.168.1.0/24').broadcast() #IP地址的广播地址:192.168.1.255
x = IPy.IP('8.0.0.0/8').broadcast() #IP地址的广播地址:8.255.255.255
x = IPy.IP('0.0.0.1').broadcast() #IP地址的广播地址:0.0.0.1# 注意:在这里单个IP地址的广播地址为本身

6、netmask():以IP对象的形式返回网络掩码

x = IPy.IP('192.168.1.1')mask() #IP地址的子网掩码:255.255.255.255
x = IPy.IP('8.8.8.0/24')mask() #IP地址的子网掩码:255.255.255.0
x = IPy.IP('127.0.0.0/8')mask() #IP地址的子网掩码:255.0.0.0
#单个返回四个255,一般是加入的是网段

7、reverseName():返回reverse lookup/PTR记录的值

x = IPy.IP('192.168.1.1').reverseName() #IP的反向显示:1.1.168.192.in-addr.arpa.
x = IPy.IP('8.8.8.0/24').reverseName() #IP的反向显示:8.8.8.in-addr.arpa.
x = IPy.IP('127.0.0.0/8').reverseName() #IP的反向显示:127.in-addr.arpa.#这个我也不是很清楚,感觉就是把IP地址反过来写,而且不管是不是IP地址段

8、reverseNames():返回一个包含形成反向查找的值的列表

x = IPy.IP('192.168.1.1').reverseNames() #IP以列表的显示反向显示:['1.1.168.192.in-addr.arpa.']
x = IPy.IP('8.8.8.0/30').reverseNames() #IP以列表的显示反向显示:['0.8.8.8.in-addr.arpa.', '1.8.8.8.in-addr.arpa.', '2.8.8.8.in-addr.arpa.', '3.8.8.8.in-addr.arpa.']
x = IPy.IP('127.0.0.0/8').reverseNames() #IP以列表的显示反向显示:['127.in-addr.arpa.']#和上面的差不多,不过是列表的形式

9、prefixlen():返回网络前缀

x = IPy.IP('192.168.1.0').prefixlen() #IP的前缀是:32
x = IPy.IP('192.168.0.0/23').prefixlen() #IP的前缀是:23
x = IPy.IP('192.168.1.0/24').prefixlen() #IP的前缀是:24#必须是网段

B、IP地址格式转换

1、int():返回IP地址的十进制整数格式

x = IPy.IP('192.168.1.0').int() #IP地址的十进制整数格式:3232235776
x = IPy.IP('8.8.8.8').int() #IP地址的十进制整数格式:134744072 
x = IPy.IP('0.0.0.1').int() #IP地址的十进制整数格式:1

2、strHex():返回IP地址的十六进制格式

x = IPy.IP('192.168.1.0').strHex() #IP地址的十六进制整数格式:0xc0a80100
x = IPy.IP('8.8.8.8').strHex() #IP地址的十六进制整数格式:0x8080808
x = IPy.IP('0.0.0.1').strHex() #IP地址的十六进制整数格式:0x1

3、strBin():返回IP地址的二进制格式

x = IPy.IP('192.168.1.0').strBin() #IP地址的二进制整数格式:11000000101010000000000100000000
x = IPy.IP('8.8.8.8').strBin() #IP地址的二进制整数格式:00001000000010000000100000001000 
x = IPy.IP('0.0.0.1').strBin() #IP地址的二进制整数格式:00000000000000000000000000000001
  • 注意:在数据库中存储IP地址有两种形式:
    a、以变长字符串的形式将IP地址保存在数据库中
    b、将IP地址转换为整数以后保存到数据库中
    所以有时候可以使用整数的IP形式或者字符串形式注入

4、v46map():IPv4、IPv6地址互相映射

x = IPy.IP('192.168.1.1').v46map() #IP的IPV6地址是:::ffff:192.168.1.1
x = IPy.IP('::ffff:1.1.1.1').v46map() #IP的IPV4地址是:1.1.1.1#返回IPv4、IPv6地址互相映射,如果IPv6地址不可在IPv4地址范围,则为ValueError。

5、strCompressed():返回字符串表示形式

x = IPy.IP('192.168.1.0').strCompressed() #IP的字符串:192.168.1.0
x = IPy.IP('192.168.0.0/23').strCompressed() #IP的字符串:192.168.0.0/23
x = IPy.IP('192.168.1.0/24').strCompressed() #IP的字符串:192.168.1.0/24

6、strFullsize():返回非损坏格式的字符串表示形式

x = IPy.IP('192.168.1.0').strFullsize() #IP的字符串:192.168.1.0
x = IPy.IP('192.168.0.0/23').strFullsize() #IP的字符串:192.168.0.0/23
x = IPy.IP('192.168.1.0/24').strFullsize() #IP的字符串:192.168.1.0/24

7、strNetmask():以字符串形式返回netmask

x = IPy.IP('192.168.1.0').strNetmask() #IP的子网掩码:255.255.255.255
x = IPy.IP('192.168.0.0/23').strNetmask() #IP的子网掩码:255.255.254.0
x = IPy.IP('192.168.1.0/24').strNetmask() #IP的子网掩码:255.255.255.0#以字符串形式返回netmask,主要用于IPv6

8、strNormal():以常规格式返回字符串表示形式,

x = IPy.IP('192.168.1.0').strNormal() #IP地址:255.255.255.255
x = IPy.IP('192.168.0.0/23').strNormal() #IP地址:255.255.254.0
x = IPy.IP('192.168.1.0/24').strNormal() #IP地址:255.255.255.0

IP地址转换成各种格式的字符串(与上面存在冲突?)

>>> IP('10.0.0.0/32').strNormal() # '10.0.0.0'
>>> IP('10.0.0.0/24').strNormal() # '10.0.0.0/24'
>>> IP('10.0.0.0/24').strNormal(0) # '10.0.0.0'
>>> IP('10.0.0.0/24').strNormal(1) # '10.0.0.0/24'
>>> IP('10.0.0.0/24').strNormal(2) # '10.0.0.0/255.255.255.0'
>>> IP('10.0.0.0/24').strNormal(3) # '10.0.0.0-10.0.0.255'

C、设置IP一些参数

1、make_net():通过给定的网络掩码将单个IP地址转换为网络规范

x = IPy.IP('192.168.1.4').make_net('255.0.0.0') #IP地址的规范化:192.0.0.0/8
x = IPy.IP('8.8.8.8').make_net('255.255.0.0') #IP地址的规范化:8.8.0.0/16  
x = IPy.IP('172.1.1.1').make_net('255.255.255.0') #IP地址的规范化:172.1.1.0/24# make_net里面的参数是反子网掩码

x = IP('192.168.3.0-192.168.3.255', make_net=True) # 192.168.3.0

D、地址比较

1、overlaps():检查两个IP地址范围是否重叠

x = IPy.IP('192.168.1.1').overlaps('192.168.1.2') #IP的是否重叠:0
x = IPy.IP('192.168.1.0/24').overlaps('192.168.1.5') #IP的是否重叠:1
x = IPy.IP('192.168.1.0/24').overlaps('192.168.0.0/23') #IP的是否重叠:-1
#如果两个范围不重叠,则返回0;如果给定范围在末尾重叠,则返回1;如果在开头重叠,则返回-1。
#注意:这里说的是范围,不是单个IP对比

2、IP地址 in IPy.IP(‘IP段’)

print( '192.168.1.1' in IPy.IP('192.168.1.0/24')) #True
print( '192.168.1.2' in IPy.IP('192.168.2.0/24')) #False
print( '192.168.1.3' in IPy.IP('192.168.1.3')) #True

E、格式化输出

1、格式化输出IPv4和IPv6的地址

print(IP('127.0.0.1')) # 127.0.0.1
print(IP('10')) # 10.0.0.0
print(IP('0x7f000001')) # 127.0.0.1
print(IP(0x7f000001)) # 127.0.0.1
print(IP('1080:0:0:0:8:800:200C:417A')) # 1080::8:800:200c:417a
print(IP('1080::8:800:200C:417A')) #1080::8:800:200c:417a
print(IP('::1')) # ::1
print(IP('::13.1.68.3')) # ::d01:4403
# 注意输出的不是字符串,是IPy.IP类型

2、子网掩码及网段前缀转换

print(IP('1.0.0.0/8')) # 1.0.0.0/8
print(IP('1.0.0.0/255.0.0.0')) #1.0.0.0/8
print(IP('1.0.0.0-1.255.255.255')) #1.0.0.0/8
print(IP('127.0.0.0-127.255.255.255')) # 127.0.0.0/8

3、解析CIDR网址

>>> from IPy import IP
>>> ip = IP('127.0.0.0/30')
>>> for x in ip:
...  print(x)
...
127.0.0.0
127.0.0.1
127.0.0.2
127.0.0.3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值