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

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

如何将 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

相关内容