【发布时间】:2021-12-31 20:33:20
【问题描述】:
我编写了以下 Python 代码,用于对 IP 是否有效进行分类,如果有效则归类到它所属的类以及是否为私有:
from ipaddress import IPv4Address, IPv4Network, ip_address
import sys
try:
ip = ip_address(sys.argv[1])
print(f"{ip} is a correct IP{ip.version} address.")
if ip_address(ip).is_private:
print("It is a private IP.")
classA = IPv4Network(("10.0.0.0", "255.0.0.0"))
classB = IPv4Network(("172.16.0.0", "255.240.0.0"))
classC = IPv4Network(("192.168.0.0", "255.255.0.0"))
if ip in classA:
print(f"{ip} is a correct class A IP{ip.version} address.")
if ip_address(ip).is_private:
print("It is a private IP.")
elif ip in classB:
print(f"{ip} is a correct class B IP{ip.version} address.")
if ip_address(ip).is_private:
print("It is a private IP.")
elif ip in classC:
print(f"{ip} is a correct class C IP{ip.version} address.")
if ip_address(ip).is_private:
print("It is a private IP.")
except ValueError:
print(f'address/netmask is invalid: {sys.argv[1]}')
except:
print(f'Usage : {sys.argv[0]} ip')
我假设that the range of A 类从1.0.0.0 到127.255.255.255,B 类从128.0.0.0 到191.255.255.255,C 类从192.0.0.0 到223.255.255.255。
当给定141.68.27.102 时,它不会
将类归类为 B(尽管the answer to this cisco lab does),为什么会这样?
当给定192.12.13.14时,它不会
将类归类为 C(虽然 the answer to this cisco lab does),为什么会这样?
【问题讨论】:
-
摆脱那个裸露的
except:处理程序——你永远不会知道在那个try块中发生了什么实际错误。 -
为什么
if ip_address(ip).is_private会重复?f"... IP{ip.version} address."相同 -
@wjandrea 没有充分的理由,但这不是 OP 的重点:)
-
172.32.255.255位于172.32.0.0/12而不是172.16.0.0/12中以172.31.255.255结尾。同样192.168.0.0/16永远不会包含192.12.*,141.68.*根本不是一个特殊的“私有”范围(并且不与您指定的任何类范围重叠)。 -
您创建的三个
IPv4Network对象只包含每个类中的私有地址,而不是整个类(并不是说“类”的概念现在特别有意义)。例如,您的classC仅涵盖 192.168.x.y;您的 192.12.13.14 示例显然不在该范围内。
标签: python ip-address python-ipaddress