我尝试通过Python3,ipaddress
模块列出给定网络范围内的有效主机,但在尝试列出所有有效主机时收到ValueError ValueError('%s has host bits set' % self)
。
>>> ip_range=input("Enter IP Range:")
Enter IP Range:192.168.56.101/16
>>> list(ipa.ip_network(ip_range).hosts())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.5/ipaddress.py", line 74, in ip_network
return IPv4Network(address, strict)
File "/usr/local/lib/python3.5/ipaddress.py", line 1536, in __init__
raise ValueError('%s has host bits set' % self)
ValueError: 192.168.56.101/16 has host bits set
4条答案
按热度按时间uqzxnwby1#
你还有一个选择,从上面提到的文件中,我们可以看到:
如果strict为True并且在提供的地址中设置了主机位,则引发ValueError。否则,屏蔽主机位以确定适当的网络地址。
所以,请再次尝试以下操作。
nlejzf6q2#
如文件所述:
如果address不表示有效的IPv4或IPv6地址,则引发ValueError;如果网络设置了主机位,则引发**。**
斜杠后面的数字(在你的例子中是16)表示为subnet保留的位数,所以最后16位是你的主机位。这个方法要求这些位为0(未设置)。
wvmv3b1j3#
两种解决方案
你要么改变你的输入要么改变代码。
1:更改输入
上面你提到你的输入是
192.168.56.101/16
。16
定义了这个ip范围的主机位。Python希望你清除它们(把所有这些位都设置为0)。你指定ip为192.168.56.101
,同时告诉有16
主机位。Python期望最后的16
位是0
。在二进制中,IP如下所示:
11000000.10101000.00111000.01100101
。**您需要清除最后16位。**则如下所示:11000000.10101000.0.0
(十进制中等于192.168.0.0
)。192.168.0.0/16
才能使其正常工作。2:更改代码
查看Python文档:
如果strict为True并且在提供的地址中设置了主机位,则引发ValueError。否则,屏蔽主机位以确定适当的网络地址。
因此,通过更改代码来停用 * strict * 模式:
将
ip_network(target)
更改为ip_network(target, False)
。这里你可以输入
192.168.56.101/16
。参考文献
sqxo8psd4#
您尝试推送的IP实际上“无效”,并且与前缀(/16)不匹配。
使用“no strict”
False
加载它-将实际提供 * 应该 * 作为输入提供的网络/前缀。希望分享另一个示例,以使用
netaddr
模块克服来自用户端的错误输入