21. Python之IPy模块
2021-06-01 本文已影响0人
随便写写咯
1 安装
1.1 pip安装
pip3 install IPy
1.2 安装后确认
>>> import IPy
>>> dir(IPy)
['INT_TYPES', 'IP', 'IPSet', 'IPV6_MAP_MASK', 'IPV6_TEST_MAP', 'IPint', 'IPv4ranges', 'IPv6ranges', 'MAX_IPV4_ADDRESS', 'MAX_IPV6_ADDRESS', 'STR_TYPES', '_BitTable', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__version__', '_checkNetaddrWorksWithPrefixlen', '_checkNetmask', '_checkPrefix', '_count0Bits', '_count1Bits', '_countFollowingZeros', '_intToBin', '_ipVersionToLen', '_netmaskToPrefixlen', '_parseAddressIPv6', '_prefixlenToNetmask', '_remove_subprefix', 'bisect', 'collections_abc', 'intToIp', 'parseAddress', 'types', 'xrange']
2 模块的基本使用
语法:
IP("地址|网段").方法()
2.1 .version()
识别ip地址分类
>>> from IPy import IP
>>> IP("10.0.0.0").version() # 如果是具体地址, 不要加掩码, 会报错
4
>>> IP("10.0.0.0/24").version()
4
2.2 .len()
获取网段ip地址数量
>>> IP("10.0.0.0/24").len()
256
>>> IP("10.0.0.1").len()
1
# 如果是具体地址, 不要加掩码, 会报错
>>> IP("10.0.0.1/24").len()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python38\lib\site-packages\IPy.py", line 263, in __init__
raise ValueError("%s has invalid prefix length (%s)" % (repr(self), self._prefixlen))
ValueError: IP('10.0.0.1/24') has invalid prefix length (24)
2.3 获取一个网段, 所有的ip地址
from IPy import IP
ip_range = IP("10.0.0.0/30")
for i in ip_range:
print(i)
10.0.0.0
10.0.0.1
10.0.0.2
10.0.0.3
# IP()的结果, 就是括号中的ip地址本身, 属于类
# 可以直接for循环, 遍历IP("网段")中的ip信息
<class 'IPy.IP'>
2.4 获取一个网段, 可用的ip地址, 并存到指定文件
import IPy
input_ip = input('Please type ip add in CIDR format(10.0.0.0/24): ').strip()
ip_list = IPy.IP('{}'.format(input_ip)) # 输出的地址包括网络位和广播地址
sum_ip = len(ip_list)-2 # 减去网络位和广播地址
print('Total Available IP is {}'.format(sum_ip))
src_file = input("Please type where you would like to save the result in absolute path: ").strip()
with open(r'{}'.format(src_file), mode = 'wt', encoding = 'utf-8') as f: # 将ip地址存到指定文件
for i in ip_list:
f.write(str('{}\n'.format(i)))
3 ip地址基本操作
3.1 反向地址解析
>>> from IPy import IP
>>> ip = IP("10.0.0.0")
>>> print(ip.reverseNames())
['0.0.0.10.in-addr.arpa.']
3.2 查看地址类型
IP("10.0.0.0").iptype()
3.3 格式转换
- 给定ip地址和Netmask, 转成CIDR格式的网络地址(给定的IP值是主机地址)
from IPy import IP
ip_addr = IP("192.168.1.10")
ip_result = ip_addr.make_net("255.255.255.0")
print(ip_result)
>> 192.168.1.0/24
- 给定ip和Netmask, 转成CIDR格式的网络地址(给定的IP值是网络地址)
from IPy import IP
ip_addr = IP("172.17.0.0")
ip_result = ip_addr.make_net("255.255.0.0")
print(ip_result)
>> 172.17.0.0/16
- 根据网络地址和广播地址, 求出其属于的网段(给的值必须是网络地址和广播地址, 否则报错)
from IPy import IP
ip_addr = "192.168.10.0-192.168.10.255"
ip_result = IP(ip_addr,make_net=True)
print(ip_result)
>>
192.168.10.0/24
3.4 输出一个网段的不同信息
利用.strNormal()通过wantprefixlen数值, 来获取一个网段的不同信息
要求输入是一个网段
from IPy import IP
ip_net = '192.168.1.0/24'
print(IP(ip_net).strNormal(wantprefixlen=0))
print(IP(ip_net).strNormal(wantprefixlen=1))
print(IP(ip_net).strNormal(wantprefixlen=2))
print(IP(ip_net).strNormal(wantprefixlen=3))
192.168.1.0
192.168.1.0/24
192.168.1.0/255.255.255.0
192.168.1.0-192.168.1.255