使用 bash 将 MAC 地址转换为链路本地地址

rub*_*o77 5 shell bash string ipv6

如何将 Mac 地址转换为 ipv6 Link-Local 地址?

您必须fe80::在开头添加并ff:fe在中间插入

此外,必须去除所有前导零

Gil*_*il' 5

您可以使用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)


rub*_*o77 1

您可以创建一个函数,用于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)