python 使用ipy 模块处理出现错误 ValueError: IP('127.0.0.1/30') has invalid prefix length (30)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 使用ipy 模块处理出现错误 ValueError: IP('127.0.0.1/30') has invalid prefix length (30)相关的知识,希望对你有一定的参考价值。

Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on 32 Type "help", "copyright", "credits" or "license" for more information.
>>> import IPy
>>> IPy.IP('127.0.0.1/30')
File "build\bdist.win32\egg\IPy.py", line 259, in __init__
ValueError: IP('127.0.0.1/30') has invalid prefix length (30)
>>> IPy.IP('127.0.0.1/32')
IP('127.0.0.1')
求解求解。。。谢谢

这个需要加一个参数,看了外国的文档用法如下,IPY.IP('127.0.0.1/24',make_net=1)
主要是make_net默认为0,就是标准的iP最后一位是16,32,这种才行,设置为1,就可以自己定义了。‘“'''',.()*&%##$^&!@#$%^:"<>”’
参考技术A 我也遇到了这个问题有一些思考不知道对不对,就是这个模块你想使用的时候必须要使用网络号加上掩码的形式,不能取其中的ip地址来计算,不然会报错,例如:
>>> ip = IP('172.16.0.1/16')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/anaconda3/lib/python3.7/site-packages/IPy.py", line 260, in __init__
raise ValueError("%s has invalid prefix length (%s)" % (repr(self), self._prefixlen))
ValueError: IP('172.16.0.1/16') has invalid prefix length (16)
这样就会报错,如果使用下面:
>>> ip = IP('172.16.0.0/16')
>>>
就不会报错,所以我是这么想的,不知道对不堵
参考技术B IPy.IP('127.0.0.1/30')

其中127.0.0.1为ip地址,30是子网掩码

127.0.0.1/30这个地址计算处理是错误的,具体可以参考

http://baike.baidu.com/view/878.htm追问

同样使用IPy.IP(‘127.0.01/255.255.255.0’)计算,等同于IPy.IP('127.0.0.1/24'),上面只是参考python IPy 模块使用,http://www.cnblogs.com/babykick/archive/2011/11/08/2241412.html,这只是一个例子,关键错误应该不在于 这里的30 上面巴。。。

追答

示例里写的是127.0.0.0/30
import IPy

for i in IPy.IP('127.0.0.0/30'):
print i
结果是
127.0.0.0
127.0.0.1
127.0.0.2
127.0.0.3

追问

但是我现在的问题是python 在处理这段ip段的时候就出现了 invalid prefix length (30)
使用 for i in IPy.IP('127.0.0.0/30'):同样会出现该问题,你能使用
for i in IPy.IP('127.0.0.0/30'): print i 得到正确结果么?

追答

追问

....我的环境问题么。。。还是谢谢、、、

本回答被提问者采纳

Python自动化运维:DNS域名轮循业务监控(IP地址处理模块IPy和DNS处理模块dnspython)

IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的效率,包括网络性能、可扩展性等方面。在这个过程当中,免不了要计算大量的IP地址,包含网段、网络掩码、广播地址、子网数、Ip类型等。
IPy模块可以很好的辅助我们高校完成Ip的规划工作。

1.1 IP地址、网段基本处理

IPy模块包含IP类,使用它可以方便处理绝大部分格式为IPv6以及IPv4的网络和地址。
比如通过version方法就可以区分出IPv4和IPv6
eg:

>>> from IPy import IP
>>> IP('192.168.217.135').version()
4
>>> IP('::1').version()            
6
>>> 

通过指定的网段输出该网段的IP个数以及所有IP地址清单,

[root@devops python]# vim ip.py    
  1 #!/usr/bin/env python
  2 from IPy import IP
  3 ip = IP('192.168.217.135')
  4 print (ip.len())
  5 for x in ip:
  6     print(x)

执行结果如下:

[root@devops python]# python ip.py 
1
192.168.217.135


下面介绍常用的Ip类的几个常见方法,包括反向解析名称、IP类型、IP转换等

>>> ip = IP('192.168.217.135')
>>> ip.reverseNames()    #反向解析地址格式
['135.217.168.192.in-addr.arpa.']

>>> ip.iptype()     # 为私网类型
'PRIVATE'
>>> 
>>> IP('8.8.8.8').int()    #转换为整形格式
134744072
>>> IP('8.8.8.8').strHex()     #转换为十六进制格式
'0x8080808'
>>> IP('8.8.8.8').strBin() #转换为二进制格式
'00001000000010000000100000001000'
>>> 

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

[root@devops python]# vim pyIPy.py 
  1 #!/usr/bin/env python
  2 from IPy import IP
  3 
  4 #def input(param):
  5 #    pass
  6 ip_s = input('Please input an IP or net-range:')
  7 #if ip_s is None:
  8 #    print("ip_s is None!!!")
  9 ips = IP(ip_s)
 10 if len(ips) > 1:
 11     print('net: %s' % ips.net())
 12     print('netmask: %s' % ips.netmask())
 13     print('broadcast: %s' % ips.broadcast())
 14     print('reverse address: %s' % ips.reverseNames()[0])
 15     print('subnet: %s' % len(ips))
 16 else:
 17     print('reverse address: %s' % ips.reverseName()[0])
 18 
 19 print('hexadecimal: %s' % ips.strHex())
 20 print('binary ip: %s' % ips.strBin())
 21 print('iptype: %s' % ips.iptype())
 22 print('ip_version: %s' % ips.version())

运行输出结果:

[root@devops python]# python pyIPy.py 
Please input an IP or net-range:192.168.100.10
reverse address: 1
hexadecimal: 0xc0a8640a
binary ip: 11000000101010000110010000001010
iptype: PRIVATE
ip_version: 4


[root@devops python]# python pyIPy.py 
Please input an IP or net-range:192.168.100.0/24
net: 192.168.100.0
netmask: 255.255.255.0
broadcast: 192.168.100.255
reverse address: 100.168.192.in-addr.arpa.
subnet: 256
hexadecimal: 0xc0a86400
binary ip: 11000000101010000110010000000000
iptype: PRIVATE
ip_version: 4
[root@devops python]# 
2 。DNS处理模块dnspython

dnspython (http://www.dnspyhon.org)是Python实现的一个 DNS工具包,它支持几乎所有的记录类型,
可以用于查询、传输并动态更新ZONE信息,
同时支持TSIG (事务签名)验证消息和EDNSO (扩展DNS)。
在系统管理方面,我们可以利用其查询功能来实现DNS服务监控以及解析结果的校验,可以代替nslookup及dig等工具,轻松做到与现有平台的整合.

首先介绍dnspython模块的安装,这里采用源码的安装方式如下:
# http://www.dnspython.org/kits/1.9.4/dnspython-1.9.4.tar.gz
# tar -zxvf dnspython-1.9.4.tar.gz 
# cd dnspython-1.9.4
# python setup.py install



dnspython模块提供了大量的DNS处理方法,最常用的方法是域名查询
dnspython供了一个DNS解析器类一resolver, 使用它的query方法来实现域名的查询功能。

query()方法的定义如下:


query(self ,qname,rdtype=1,rdclass=1,tcp=Flase,source=None,raise_on_no_answer=True,source_port=0)

其中,qname参数为查询的域名。rdtype参数用来指定RR资源的类型,常用的有以下几种:

A记录,将主机名转换为Ip地址
MX记录,邮件交换记录,定义邮件服务器的域名
CNAME记录 指别名记录,实现域名间的映射
NS记录,标记区域的域名服务器以及授权子域
PTR记录 反向解析,与A记录相反,将Ip转换为主机名
SOA记录 SOA标记,一个起始授权区的定义

2.1 A记录:
[root@devops python]# vim dnsDemo.py 

  1 #!/usr/bin/env python
  2 import dns.resolver
  3 #def raw_input(param):
  4 #   pass
  5 domain = input('Please input an domain:')
  6 A = dns.resolver.query(domain,rdtype='A')    #指定查询类型为A记录
  7 for i in A.response.answer:   #通过response.answer 方法获取查询回应信息
  8     for j in i.items:   #遍历回应信息
  9         print (j)


运行结果:
[root@devops python]# python dnsDemo.py 
Please input an domain:www.google.com
6.6.6.6
[root@devops python]# 
2.2 MX记录:
[root@devops python]# vim simple1MX.py 
  1 #!/usr/bin/env python
  2 import dns.resolver
  3 domain = input('Please input an domain:')  # example 163.com
  4 MX = dns.resolver.query(domain,rdtype='MX')   #指定查询类型为MX记录
  5 for i in MX:	 #遍历回应信息
  6     print ('MX preference = ',i.preference,'mail exchanger = ',i.exchange)

运行结果:

[root@devops python]# python simple1MX.py 
Please input an domain:baidu.com
MX preference =  10 mail exchanger =  mx.maillb.baidu.com.
MX preference =  20 mail exchanger =  jpmx.baidu.com.
MX preference =  15 mail exchanger =  mx.n.shifen.com.
MX preference =  20 mail exchanger =  mx50.baidu.com.
MX preference =  20 mail exchanger =  mx1.baidu.com.
[root@devops python]# 
[root@devops python]# python simple1MX.py
Please input an domain:163.com
MX preference =  10 mail exchanger =  163mx02.mxmail.netease.com.
MX preference =  10 mail exchanger =  163mx03.mxmail.netease.com.
MX preference =  50 mail exchanger =  163mx00.mxmail.netease.com.
MX preference =  10 mail exchanger =  163mx01.mxmail.netease.com.

2.3 NS记录:
[root@devops python]# vim simple1NS.py 
  1 #!/usr/bin/env python
  2 import dns.resolver
  3 #LimitOneLeavelDomain example baidu.com
  4 domain = input('Please input an domain:')
  5 ns = dns.resolver.query(domain,rdtype='NS')
  6 for i in ns.response.answer:
  7     for j in i.items:
  8         print (j.to_text())
~        

运行结果:
注意:这里仅仅只能输入一级域名,如baidu.com

[root@devops python]# python simple1NS.py    
Please input an domain:baidu.com
ns7.baidu.com.
ns4.baidu.com.
dns.baidu.com.
ns3.baidu.com.
ns2.baidu.com.
                         
2.4 CNAME记录:
[root@devops python]# vim simple2CNAME.py 
  1 #!/usr/bin/env python
  2 import dns.resolver
  3 domain = input('Please input an domain:')
  4 cname = dns.resolver.query(domain,rdtype='CNAME')   #指定查询类型为CNAME记录
  5 for i in cname.response.answer:    #结果将回应cname后的目标域名
  6     for j in i.items:
  7         print (j.to_text())

综合:DNS域名轮循业务监控

大部分的DNS解析都是一个域名对应 一个 IP地址,但是通过DNS轮循技术可以做到一个域名对应多个 IP,
从而实现最简单且高效的负载平衡,不过此方案最大的弊端是目标主机不可用时无法被自动剔除,因此做好业务主机的眼务可用监控至关重要。
本示例通过分析当前域名的解析IP,再结合服务端口探测来实现自动监控,在域名解析中添加、删除IP时,
无须对监控脚本进行更改。架构图如下所示:(使用PPT绘制,效果不太明显)

1.步骤
1 )实现城名的解析,获取域名所有的A记录解析IP列表;
2)对IP列表进行HTTP级别的探测。

2.代码解析
第一步通过 dns.resolver.query()方法获取业务城名^记录信息,查询出所有IP地址列表,再使用httplib模块的request()方法以GET方式请求监控页面,监控业务所有服务的IP是否服务正常。


[root@devops python]# vim simple5DnsDomain.py 
  1 #!/usr/bin/python
  2 #-*- coding:utf-8 -*-
  3 import dns.resolver
  4 import os
  5 import httplib
  6 
  7 iplist=[]   #定义域名IP的列表变量
  8 appdomain='www.google.com.hk'   #定义业务域名
  9 
 10 def get_iplist(domain=""):  #域名解析函数,解析成功IP将被追加到iplist
 11     try:
 12         A = dns.resolver.query(domain,rdtype='A')   #解析A记录类型
 13     except Exception,e:
 14         print "dns resolver error:"+str(e)
 15         return
 16     for i in A.response.answer:
 17         for j in i.items:
 18             iplist.append(j.address)    #追加到iplist
 19     return True
 20 def checkip(ip):
 21     checkurl=ip+":80"
 22     getcontent=""
 23     httplib.socket.setdefaulttimeout(5)     #定义http连接超时时间为5秒
 24     conn=httplib.HTTPConnection(checkurl)   #创建http连接对象
 25 
 26     try:
 27         conn.request("GET","/",headers = "Host":appdomain)    #发起URL请求,添加host主机头
 28         r=conn.getresponse()
 29         getcontent=r.read(15)   #获取URL页面前15个字符,以便做可用性校验
 30     finally:
 31         if getcontent=="<!doctype html>":   #监控URL页的内容一般是事先定义好的,比"HTTP200"等
 32             print ip+" [OK]"
 33         else:
 34             print ip+" [Error]"     #此处可放告警程序,可以是邮件、短信通知
 35 if __name__=="__main__":
 36     if get_iplist(appdomain) and len(iplist)>0:     #条件:域名解析正确且至少返回一个IP
"simple5DnsDomain.py" 40L, 1326C                                                                

我们可以将此脚本放到crontab中定时运行,再结合告警程序,这样一个基于域名轮循的业务监控完成。

以上是关于python 使用ipy 模块处理出现错误 ValueError: IP('127.0.0.1/30') has invalid prefix length (30)的主要内容,如果未能解决你的问题,请参考以下文章

Python学习笔记-IP地址处理模块Ipy

python学习-IPy模块

IPy模块--IP地址处理

Python自动化运维:DNS域名轮循业务监控(IP地址处理模块IPy和DNS处理模块dnspython)

python-IPy模块

python之IP地址或IP段处理模块-ipaddr