您可以使用IFS将 MAC 地址拆分为 6 个以冒号分隔的组并组装它们。您还需要翻转第 7 个最高有效位(感谢bahamat),即第一个字节的第 1 位。
mac_to_ipv6 () {
IFS=':'; set $1; unset IFS
ipv6_address="fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
}
Run Code Online (Sandbox Code Playgroud)
您可以使用前缀和后缀剥离构造${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##*:}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用子字符串构造(仅限 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}"
}
Run Code Online (Sandbox Code Playgroud)
您可以创建一个函数,用于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"
}
Run Code Online (Sandbox Code Playgroud)
使用示例:
$ mac_to_ipv6_ll 12:34:56:78:90:12
fe80::1034:56ff:fe78:9012
Run Code Online (Sandbox Code Playgroud)