我正在尝试使用
ipaddress
库验证 IP、网关和子网掩码输入,但是当我实际尝试使用经过验证的网络时,我得到了无效结果,这让我认为验证不正确。
network = ipaddress.ip_network("103.162.136.145/255.255.255.252", strict=False)
for ip in ipaddress.ip_network(network):
print(ip)
以下给出了这些有效的IP
103.162.136.144
103.162.136.145
103.162.136.146
103.162.136.147
但是当我尝试在Linux中使用它时,出现以下错误;
localhost:~# ip addr flush dev eth0
localhost:~# ip addr add 103.162.136.145/255.255.255.252 dev ethd localhost:~# ip link set ethO up
localhost:~# ip route replace default via 103.162.136.144
ip: RTNETLINK answers: Invalid argument
显示的正确范围实际上应该是
103.162.136.145
103.162.136.146
我在验证中做错了什么?
编辑 -
103.162.136.145/255.255.255.252
是 IP/子网掩码,103.162.136.144
是网关
正如评论中提到的,这个库似乎返回了网络地址和广播地址,这是您没有想到的两个附加地址。然后你问:
看起来确实如此,但为什么要这样做呢?
这是一个很好的问题,但对于图书馆的作者来说。挖掘他们的想法的一种方法是阅读他们友好的手册。
您没有指定python版本,但我找到了python3的版本:
可以迭代网络对象以列出属于该网络的所有地址。对于迭代,返回所有主机,包括不可用的主机(对于可用的主机,使用hosts()方法)
https://docs.python.org/3/library/ipaddress.html#iteration
那么,不要迭代这个网络对象 - 使用返回可用地址的方法?
我不是Python程序员,但也许是这样的?
for ip in network.hosts():
print(ip)