我有一个脚本,它使用argparse从命令行中提取标志并使用socket验证IP地址。到目前为止,如果我只使用标准的IPv4 X.X.X.X格式,它可以工作。我想要做的是验证包含CIDR表示法的IP地址。如何修改我的代码以验证CIDR字段中的2位整数(即:192.168.2.1/32)
import argparse
import socket
parser = argparse.ArgumentParser()
parser.add_argument("-i", "--ipaddr")
args = parser.parse_args()
# Validate IP Address Given in (-i) argparse
try:
s = socket.inet_aton(args.ipaddr)
except socket.error:
print ""
print("Bad IP Address entered")
print ""
sys.exit()
答案 0 :(得分:3)
有一个ipaddress模块可以完成这项工作。
类Ip4Network
的构造函数处理255.255.255.255
和255.255.255.255/32
(以及IPv6格式,Ip6Network
)
因此,您可以添加代码
import ipaddress
并使用以下代码创建Ip4Network
:
try:
ip_addr = ipaddress.ip_address(args.ipaddr)
except ValueError:
# handle bad ip
然后,继续使用套接字上的代码:
socket.inet_aton(str(ip_addr))
你只需要用字符串转换它。
必须从存储库(ipaddress
)安装py2-ipaddress
,并且在str
和bytearray
字符串解释之间存在一些问题(请参阅here)< / p>
如果你这样做,它可以在我的实验中使用:
ipaddress.ip_address(bytearray('192.168.1.1'))
ipaddress.ip_network(u'10.0.0.0/24')