我想检查用户输入是否是 bash 中的有效 IP 地址/CIDR,并且我正在使用正则表达式来执行此操作。所以有效的 CIDR 应该是 0-32 和 IP 从(1-254).(1-255).(1-255).(1-255)/(1-32)
所以我的代码目前是:
read -p "Input: " ip_address
if [[ $ip_address =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+$ ]];
then
echo "VALID"
else
echo "NOT VALID"
fi
但它太慷慨了,接受了一些无效的组合。因此,有效的 IP 地址/CIDR 组合应该是:10.11.11.11/24
或者254.255.255.255/23
无效将是256.19.11.11/24
因为第一个八位字节高于 255,或者222.222.222.222/33
这里的 CIDR 高于 32。除了正则表达式之外,还有其他方法可以检查有效的 IP 地址/CIDR 吗?
要正确处理 IP 地址或 CIDR 的验证,请使用专门为此制作的库函数,例如模块
cidrvalidate()
中的 Perl 函数Net::CIDR
:看看
perldoc Net::CIDR
这个库还能做什么。在上面的示例中不是必需的,但可以用于用户的任意输入,否则,如果输入以 .开头,则
--
该输入将被视为一个选项。perl
-
以下方法是您尝试的变体,它不关心无效的网络掩码。
0 到 255 之间的正十进制整数可以匹配
0 到 32 之间的正十进制整数可以匹配
使用这个:
表达方式
将扩展为有效 CIDR 的完整正则表达式,该 CIDR 跨越给定字符串的完整长度。
另一个明显的方法是读取给定字符串中的数字并测试前四个是否在 0-255 范围内,以及第五个是否在 0-32 范围内:
在这里,我们将五个单词读入五个变量。
.
输入的字符串在读取时被拆分为单词/
(这意味着3/3/3/3.2
将被解析为有效,但请参见$ipaddr
代码)。任何非整数数据读取都会触发脚本退出。然后我们开始根据有效范围测试它们的值。如果任何测试失败,则输入的地址无效。