![Linux/bash:如何获取接口的 IPv6 地址?](https://linux22.com/image/1304896/Linux%2Fbash%EF%BC%9A%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E6%8E%A5%E5%8F%A3%E7%9A%84%20IPv6%20%E5%9C%B0%E5%9D%80%EF%BC%9F.png)
我可以使用什么命令来获取脚本中接口的 IPv6 地址?
更新:来自其中一个答案的 sed 输出。
$ ip -6 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
inet6 fe80::224:d7ff:fed0:4f5c/64 scope link
valid_lft forever preferred_lft forever
另一个:
$ ip addr show dev eth0 | sed -e's/^.*inet6 \([^ ]*\)\/.*$/\1/;t;d'
$ ip addr show dev eth0
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
link/ether f0:de:f1:7b:e9:6c brd ff:ff:ff:ff:ff:ff
答案1
您可以使用:
ip -6 addr
它将返回您已配置的所有 IPv6 地址。
答案2
有很多方法可以做到这一点。
以下是其中之一:
ip addr show dev eth0 | sed -e's/^.*inet6 \([^ ]*\)\/.*$/\1/;t;d'
它与罗伯特的回答类似,只是删除了地址。
答案3
如果你使用的是 Linux,你也可以解析:
/proc/net/if_inet6
第一列是完整的 IPv6(不带冒号)。第六列是接口名称。
这是一个相当冗长的未优化的版本(我现在只了解 awk 的基础知识)也许 python/perl 是更好的选择。
for i in "$(grep enp0s25 /proc/net/if_inet6)"; do
echo "$i" | awk '{
split($1, _, "[0-9a-f]{,4}", seps)
joined = sep = ""
for (i=1; i in seps; i++) {
joined = joined sep seps[i]
sep = ":"
}
print joined
}'
done
如果您有 GNU awk (gawk),可以将其缩短为:
for i in "$(grep enp0s25 /proc/net/if_inet6)"; do
echo "$i" | gawk '@include "join"
{
split($1, _, "[0-9a-f]{,4}", seps)
print join(seps, 1, length(seps), ":")
}'
done
您可以将其放入 {ba,z,}sh 函数中以便稍后使用它。
答案4
这里提到的其他方法将失败如果 IF 未命名为eth0
。而在 SystemD 的世界里,IF 名称远不能预测为如果命名约定发生了巨大变化
我的方法是查找并提取全局单播地址 - 无论 IF 的名称是什么。可以配置 IPv6 地址wlan0
- 或任何其他名称 - 并且我的 bash 代码片段将成功提取并将其扩展为配置文件中的变量,该文件需要指定侦听地址。
IPV6GLOBALUNICAST="$(ip -6 addr|awk '{print $2}'|grep -P '^(?!fe80)[[:alnum:]]{4}:.*/64'|cut -d '/' -f1)"
将以下内容粘贴到配置了 IPv6 地址的主机的 CLI 上以进行测试:
ip -6 addr|awk '{print $2}'|grep -P '^(?!fe80)[[:alnum:]]{4}:.*/64'|cut -d '/' -f1
我使用它非常成功,到目前为止,在任何情况下都没有失败过。HTH- Terrence Houlahan