【发布时间】:2012-07-05 16:05:41
【问题描述】:
具体来说,我正在寻找一种方法来判断系统是否具有配置有 global 范围的 IPv6 地址的网络接口。环回和链接范围的地址“不算数”。
我想要实现的是匹配getaddrinfo() 是否会返回带有AI_ADDRCONFIG 提示标志的任何IPv6 地址。
我可以通过编写一些使用getaddrinfo() 查找 IPv6 环回地址 ("::1") 的代码来做到这一点。但这是一个相当复杂的构建过程的测试的一部分,不必为了测试这个相当简单的东西而构建可执行文件会简单得多。
目前我发现的最好的只适用于 Linux,并使用最近发行版附带的 ip 命令。
if ip -f inet6 -o addr | cut -f 9 -s -d' ' | grep global > /dev/null ; then
echo "IPv6 addresses configured continuing"
else
echo "No global IPv6 addresses configured - skipping test"
exit 0
fi
但是,这依赖于ip 的当前输出格式,我怀疑这是有保证的,并且在其他版本的 Unix(例如 FreeBSD)上不存在。
我不认为 ifconfig 在不同的 Unix 版本之间提供了足够相似的输出以供使用。
我还缺少其他工具吗?
【问题讨论】:
-
我不认为你能找到一个随处安装并且输出格式一致的工具。不过,也许您可以编写一个简单的 Perl 或 Python 脚本。
-
你肯定需要编写脚本,ifconfig 在 unix 平台上给出相当相似的结果,例如,所有 ipv6 地址都以 inet6
开头。一点 Perl 应该在这里完成这项工作,当然任何以 fe80 或 fec0 开头的 ipv6 地址然后我们就忽略它,因为它是链接本地/站点本地地址。