我试图在两个列表中运行一个例程,这些列表来自MySQL查询-一个包含CIDR网络,另一个包含IP地址。我正在尝试比较IP列表中的条目,以查看它们是否在CIDR列表所描述的网络中,并对不存在的网络采取行动。
我正在尝试使用netaddr
模块,但这似乎还没有在Python3上实现吗?
我也尝试使用ipaddress
,但似乎无法正确比较它们。使用ipaddress,我有以下代码:
networks = (('1.1.6.0/20',), ('2.8.2.0/19',), ('7.2.2.0/19',), ('2.2.0.0/19',))
ips = ((8888, 'customer', b'2.8.4.64', '8888*200'),(8888, 'customer', b'1.1.6.3', '8888*201'), (8888, 'customer', b'122.223.159.3', '8888*202'))
straglers = list()
for ip in ips:
exclude = 0
for network in networks:
subnet = ip_network(network[0])
if ip_address(ip[2]) in subnet:
exclude = 1
if exclude == 0:
straglers.append([ip[3],ip[2],ip[1]]) # extension, customer_ip, company
按目前的情况,代码会给出以下值错误:ValueError: b'82.148.47.64' does not appear to be an IPv4 or IPv6 address
我尝试将ip[2]
转换为utf-8字符串,但这没什么区别。
答案 0 :(得分:2)
您所描述的列表实际上是一个元组。
首先,当我运行您的代码时,我没有收到您遇到的错误
ValueError:b'82.148.47.64'似乎不是IPv4或IPv6地址
相反,我收到了以下信息
提高ValueError('%s已设置主机位'%self) ValueError:1.1.6.0/20设置了主机位
这是您实际上收到的错误吗?如果是这样,这就是正确纠正它的方法。
参考ipaddress模块Defining Networks:
默认情况下,尝试创建设置了主机位的网络对象将导致引发ValueError。要请求将其他位强制改为零,可以将标志strict = False传递给构造函数:
这是因为主机位已设置,并且需要强制为零,如上面的文档所述。将以下标志 strict = False 传递给构造函数。
例如。
subnet = ip_network(network[0], strict=False)
此外,在元组中包含的ip中,只需将其格式化为字符串即可。
例如。
ips = ((8888, 'customer', '2.8.4.64', '8888*200')
或者将显示以下内容。
'ValueError: b'2.8.4.64'似乎不是IPv4或IPv6地址”
完整的工作代码。
from ipaddress import ip_network, ip_address
networks = (('1.1.6.0/20',), ('2.8.2.0/19',), ('7.2.2.0/19',), ('2.2.0.0/19',))
ips = ((8888, 'customer', b'2.8.4.64', '8888*200'),(8888, 'customer', b'1.1.6.3', '8888*201'), (8888, 'customer', b'122.223.159.3', '8888*202'))
straglers = list()
for ip in ips:
exclude = 0
for network in networks:
subnet = ip_network(network[0], strict=False)
print(ip_address(ip[2].decode('utf-8')))
print(subnet)
if ip_address(ip[2].decode('utf-8')) in subnet:
exclude = 1
if exclude == 0:
straglers.append([ip[3],ip[2],ip[1]]) # extension, customer_ip, company
print(straglers)