如何将 Mac 地址转换为 ipv6 链路本地地址?
你必须fe80::
在开头添加并插入ff:fe
在中间插入
此外,所有前导零都必须被删除
答案1
您可以使用IFS
将 MAC 地址拆分为 6 个以冒号分隔的组并将它们组合起来。您还需要翻转第七个最高有效位(谢谢巴哈马特),即第一个字节的位 1。
mac_to_ipv6 () {
IFS=':'; set $1; unset IFS
ipv6_address="fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
}
您可以使用前缀和后缀剥离结构${VAR#PREFIX}
和${VAR%SUFFIX}
将MAC地址切成碎片。
mac_to_ipv6 () {
mac=$1
ipv6_address=fe80::$(printf %02x $((0x${mac%%:*} ^ 2)))
mac=${mac#*:}
ipv6_address=$ipv6_address${mac%:*:*:*}ff:fe
mac=${mac#*:*:}
ipv6_address=$ipv6_address${mac%:*}${mac##*:}
}
您可以使用子字符串构造(仅限 bash,而不是 sh)。
mac_to_ipv6 () {
local mac=$1 byte0
printf %02x -v byte0 $((0x${mac:0:2} ^ 2))
ipv6_address="fe80::$byte0${mac:3:5}ff:fe${mac:9:5}${mac:15:2}"
}
答案2
接受吉尔斯的解释,但是正确的根据 IPv6 规范翻转第 7 位:
#!/bin/bash
IFS=':'; set $1; unset IFS
printf "fe80::%x%x:%x:%x:%x\n" 0x$(( 0x${1} ^ 0x02 )) 0x${2} 0x${3}ff 0xfe${4} 0x${5}${6}
位翻转的示例:
$ mac_to_ipv6 00:00:00:00:00:00
fe80::200:00ff:fe00:0000
答案3
您可以创建一个函数,用于IFS
将 MAC 地址拆分为 6 个以冒号分隔的组并将它们组合起来。您还需要翻转第 7 个最高有效位(感谢 bahamat),即第一个字节的位 1:
mac_to_ipv6_ll() {
IFS=':'; set $1; unset IFS
echo "fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
}
使用示例:
$ mac_to_ipv6_ll 12:34:56:78:90:12
fe80::1034:56ff:fe78:9012