在我的shell中,我需要检查一个字符串是否是有效的IPv6地址。
我找到了两条路,但对我来说都不够理想。
一个是http://twobit.us/2011/07/validating-ip-addresses/,而我想知道对于这样一个常见的需求,它是否必须如此复杂。
另一个是expand ipv6 address in shell script,这很简单,但是对于Linux的主要发行版来说,sipcalc不是一个常见的默认实用程序。
因此,我的问题是,是否有一种简单的方法或实用程序可以使用shell验证IPv6地址?
先谢了。
4条答案
按热度按时间eimct9ow1#
第一个链接中的代码并不特别优雅,但是模数风格的修正,我不认为你可以简化太多(正如在评论中指出的,它可能已经太简单了).规范是复杂的,并要求一些可选特性,这对最终用户来说很好,但对实现者来说很麻烦。
你可能会找到一个通用脚本语言的库,它将这个逻辑封装在一个库中,我的想法是Python,Python 3.3确实包含了一个标准模块
ipaddress
;对于旧版本,请尝试类似以下内容另请参见Checking for IP addresses
dluptydi2#
下面是一个POSIX兼容shell脚本的解决方案,它可以使用可选的子网掩码来处理IPv4和IPv6地址。要测试一个不应该有子网掩码的IP,只需在执行测试时传递一个虚拟的子网掩码。这看起来像是很多代码,但它应该比使用外部程序(如grep)或可能会分叉的脚本快得多。
单个IPv6零组压缩到::将被视为无效。强烈建议不要使用这种表示,但从技术上讲是正确的。代码中有一个说明,解释了如果您希望允许使用这种地址,如何更改这种行为。
这里有一些测试。
yfjy0ee73#
大多数发行版都预装了iproute2(名字可能会有变化),所以你可以使用ip命令来查询路由表:
即使在没有适当路由的机器上,当探测器使用有效的v6语法时,也会传递rc=0。
unhi4e5o4#
我接受了sgundlach的答案,但需要在没有ip6连接的机器上使用它,因此通过测试和阅读手册页,我发现我可以相信退出代码1表示语法无效,同时0表示成功,2表示语法有效,但报告了内核错误。
在手册页中: