Python:如何使用 CIDR 表示法验证 IP 地址(导入套接字)

Alb*_*lby 0 python sockets validation

我有一个脚本,它使用 argparse 从命令行提取标志并使用套接字来验证 IP 地址。到目前为止,如果我只是使用标准的 IPv4 XXXX 格式,它就可以工作。我想要做的是验证包含 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()
Run Code Online (Sandbox Code Playgroud)

Mat*_*gni 5

蟒蛇 3

有一个ip地址模块可以完成这项工作。

类的构造函数Ip4Network处理255.255.255.255255.255.255.255/32(以及 IPv6 格式,使用Ip6Network

所以你可以添加你的代码

import ipaddress
Run Code Online (Sandbox Code Playgroud)

Ip4Network使用以下代码创建一个:

try:
    ip_addr = ipaddress.ip_address(args.ipaddr)
except ValueError:
    # handle bad ip
Run Code Online (Sandbox Code Playgroud)

然后,继续在套接字上执行您的代码:

socket.inet_aton(str(ip_addr))
Run Code Online (Sandbox Code Playgroud)

您只需将其转换为字符串。

蟒蛇 2.7

ipaddress必须从仓库进行安装(py2-ipaddress),并具有之间的一些问题strbytearray字符串的解释(参见这里

所以如果你这样做,它在我的实验中有效:

ipaddress.ip_address(bytearray('192.168.1.1'))
ipaddress.ip_network(u'10.0.0.0/24')
Run Code Online (Sandbox Code Playgroud)