python-3.x ipaddress模块值错误(“% s已设置主机位”% self)

41zrol4v  于 2023-02-06  发布在  Python
关注(0)|答案(4)|浏览(137)

我尝试通过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
uqzxnwby

uqzxnwby1#

你还有一个选择,从上面提到的文件中,我们可以看到:
如果strict为True并且在提供的地址中设置了主机位,则引发ValueError。否则,屏蔽主机位以确定适当的网络地址。
所以,请再次尝试以下操作。

ip_range = '192.168.56.101/16'
list(ipaddress.ip_network(ip_range, False).hosts())
nlejzf6q

nlejzf6q2#

如文件所述:
如果address不表示有效的IPv4或IPv6地址,则引发ValueError;如果网络设置了主机位,则引发**。**
斜杠后面的数字(在你的例子中是16)表示为subnet保留的位数,所以最后16位是你的主机位。这个方法要求这些位为0(未设置)。

wvmv3b1j

wvmv3b1j3#

两种解决方案

你要么改变你的输入要么改变代码。

1:更改输入

上面你提到你的输入是192.168.56.101/1616定义了这个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

参考文献

sqxo8psd

sqxo8psd4#

您尝试推送的IP实际上“无效”,并且与前缀(/16)不匹配。
使用“no strict”False加载它-将实际提供 * 应该 * 作为输入提供的网络/前缀。
希望分享另一个示例,以使用netaddr模块克服来自用户端的错误输入

from netaddr import IPNetwork

f = IPNetwork("192.168.56.101/16")
network = list(f.subnet(16))[0]
print(network)       <= from this point i would work with this variable

# -- output --
IPNetwork('192.168.0.0/16')

相关问题