检查IP地址是否在Python3上的网络中

时间:2018-12-13 16:10:37

标签: python

我试图在两个列表中运行一个例程,这些列表来自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字符串,但这没什么区别。

1 个答案:

答案 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)