自学内容网 自学内容网

【IPy模块02】Python运维模块之多网络计算方法详解

实用的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.2、多网络计算方法详解

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

1.多网络实践
简介
相同ip段,不同的掩码获取的ip地址不一样
不同ip段,相同的掩码获取的ip地址不一样
而不同的网段,彼此之间有可能存在ip地址重合
简单实践
from IPy import IP
#1 掩码的作用
#1-1 相同ip段,不同的掩码获取的ip地址不一样
ip_range = IP('192.168.8.0/30')    #192.168.8.0-192.168.8.3
ip_range = IP('192.168.8.0/27')    #192.168.8.0-192.168.9.31
ip_result = ip_range.len()
print("IP网段:{:<17}有{}个ip".format(str(ip_range), ip_result))
for i in ip_range:
    print(str(i))

#2 掩码的作用
#2-1 不同ip段,相同的掩码获取的ip地址不一样
ip_range = IP('192.168.8.0/30')    #192.168.8.0-192.168.8.3
ip_range = IP('192.168.9.0/30')    #192.168.9.0-192.168.9.3
ip_result = ip_range.len()
print("IP网段:{:<17}有{}个ip".format(str(ip_range), ip_result))
for i in ip_range:
    print(str(i))

2.判断IP地址和网段是否包含于另一个网段

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

基本语法
from IPy import IP
#1 网段的比较
ip_net1 = '192.168.8.0/24'
ip_net2 = '192.168.8.0/24'
result = IP(ip_net1) == IP(ip_net2)

#2 地址包含
#2-1 判断ip地址是否在某一个ip段内
ip_net1 = '192.168.8.100'
ip_net2 = '192.168.8.0/24'
result = IP(ip_net1) in IP(ip_net2)
简单实践
from IPy import IP
#1 网段的比较
ip_net1 = '192.168.8.0/24'
ip_net2 = '192.168.8.0/24'
result = IP(ip_net1) == IP(ip_net2)
print("{} 和 {} 网段信息是否一致:{}".format(ip_net1, ip_net2, result))

ip_net1 = '192.168.8.0/24'
ip_net2 = '192.168.9.0/24'
result = IP(ip_net1) == IP(ip_net2)
print("{} 和 {} 网段信息是否一致:{}".format(ip_net1, ip_net2, result))

ip_net1 = '192.168.8.0/24'
ip_net2 = '192.168.9.0/24'
result = IP(ip_net1) < IP(ip_net2)
print("{} 和 {} 网段信息是否一致:{}".format(ip_net1, ip_net2, result))


#2 地址包含
#2-1 判断ip地址是否在某一个ip段内
ip_net1 = '192.168.8.100'
ip_net2 = '192.168.8.0/24'
result = IP(ip_net1) in IP(ip_net2)
print("{}  是否在网段 {} 内:{}".format(ip_net1, ip_net2, result))

#2-2 判断ip地址是否在另一个ip段内
ip_net1 = '192.168.8.0/24'
ip_net2 = '192.168.0.0/16'
result = IP(ip_net1) in IP(ip_net2)
print("{}  是否在网段 {} 内:{}".format(ip_net1, ip_net2, result))




输出:
192.168.8.0/24 和 192.168.8.0/24 网段信息是否一致:True
192.168.8.0/24 和 192.168.9.0/24 网段信息是否一致:False
192.168.8.0/24 和 192.168.9.0/24 网段信息是否一致:True
192.168.8.100  是否在网段 192.168.8.0/24 内:True
192.168.8.0/24  是否在网段 192.168.0.0/16 内:True
3.判断两个网段是否存在重叠

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

基本语法
#3网段重叠
#3-1 返回值-1代表,前面的网段是后面网段的子集
#3-2 返回值1代表,后面的网段是前面网段的子集
#3-3 返回值0代表,两个网段没有重合
ip_net1 = '192.168.8.0/24'
ip_net2 = '192.168.0.0/16'
result = IP(ip_net1).overlaps(ip_net2)
简单实践
#3网段重叠
#3-1 返回值-1代表,前面的网段是后面网段的子集
ip_net1 = '192.168.8.0/24'
ip_net2 = '192.168.0.0/16'
result = IP(ip_net1).overlaps(ip_net2)
print("{} 和 {} 是否存在网络重叠:{}".format(ip_net1, ip_net2, result))
#3-2 返回值1代表,后面的网段是前面网段的子集
ip_net1 = '192.168.0.0/16'
ip_net2 = '192.168.8.0/24'
result = IP(ip_net1).overlaps(ip_net2)
print("{} 和 {} 是否存在网络重叠:{}".format(ip_net1, ip_net2, result))
#3-3 返回值0代表,两个网段没有重合
ip_net1 = '192.168.8.0/24'
ip_net2 = '192.168.9.0/24'
result = IP(ip_net1).overlaps(ip_net2)
print("{} 和 {} 是否存在网络重叠:{}".format(ip_net1, ip_net2, result))

输出:
192.168.8.0/24 和 192.168.0.0/16 是否存在网络重叠:-1
192.168.0.0/16 和 192.168.8.0/24 是否存在网络重叠:1
192.168.8.0/24 和 192.168.9.0/24 是否存在网络重叠:0
4.根据输入的IP 或子网返回网络、掩码、广播、反向解析、子网数、IP 类型等信息

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

目标

通过 一个简单的场景,来讲我们的 ipy 模块进行综合实践

思路

1 接收用户的输入信息
2 对用户输入的信息进行判断
3 如果是多个ip地址就逐一的查看具体信息
4 如果是单个ip地址,就显示ip反解析域名
5 输出ip地址的其他几种格式
简单实践
from IPy import IP
#1 接收用户的输入信息
ip_s = input("Please input an Ip or net-range: ")
#2对用户输入的信息进行判断
try:
    ips = IP(ip_s)
except Exception as e:
    print("您输入的ip地址不是正确的格式")

else:
    if len(ips)> 1:
        #3 如果是多个ip地址就逐一的查看具体信息
        print("net:{}".format(ips.net()))
        print("netmask:{}".format(ips.netmask()))
        print("broadcast:{}".format(ips.broadcast()))
        print("reverse address:{}".format(ips.reverseNames()))
        print("subnet:{}".format(ips.len()))
    else:
        #4如果是单个ip地址,就显示ip反解析域名
        print("reverse address:{}".format(ips.reverseNames()[0]))
    #5 输出ip地址的其他几种格式
    print("ip地址的十六进制格式:{}".format(ips.strHex()))
    print("ip地址的二进制格式:{}".format(ips.strBin()))
    print("ip地址的类型:{}".format(ips.iptype()))




原文地址:https://blog.csdn.net/weixin_74814027/article/details/145094326

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!