ipaddress模块​​ValueError('%s有主机位设置'%self)

时间:2016-11-28 07:31:03

标签: python python-3.x ip-address

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

3 个答案:

答案 0 :(得分:6)

documentation中所述:

  

如果地址不代表有效的IPv4或,则会引发ValueError   IPv6地址,如果网络设置了主机位,则为

斜杠后的数字(在您的情况下为16)表示为subnet保留的位数,因此最后16位是您的主机位。此方法要求这些位为0(未设置)。

答案 1 :(得分:6)

你有另一种选择。 从上面提到的document,我们可以看到:

  

如果strict为True,并且在提供的地址中设置了主机位,则   引发ValueError。否则,主机位被屏蔽掉   确定合适的网络地址。

所以,请再试一次。

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

答案 2 :(得分:3)

两种解决方案

您可以更改输入内容或代码。

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-port-scanner-will-not-accept-address-range

如果strict为True并且在提供的地址中设置了主机位,则 引发ValueError。否则,主机位将被屏蔽为 确定合适的网络地址。

因此,通过更改代码来停用 strict 模式:

ip_network(target)更改为ip_network(target, False)

在这里您可以从技术上输入192.168.56.101/16

参考文献


这个答案来晚了,但是我认为这是有帮助的!