如何生成有效且随机的 MAC 地址?

如何生成有效且随机的 MAC 地址?

您可能知道可以通过以下方式生成 MAC 地址:

macaddr=$(dd if=/dev/random bs=1024 count=1 2>/dev/null|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/')
echo $macaddr

但这种方法可能会产生如下所示的 MAC 地址:07:d4:51:9f:50:6c您根本无法使用该地址。如果您尝试过,您会收到此错误:

# ip link set dev wlan0 address $macaddr
RTNETLINK answers: Cannot assign requested address

所以上面的行应该重写。问题是它应该是什么样子才能使 MAC 地址始终有效?

答案1

  1. 提取第一个字节(例如07从您的示例中)
  2. 按位与十进制 254(11111110 - 除第零位设置之外的所有位)
  3. 按位或与十进制 2(00000010 - 仅设置第 1 位)
  4. 将第一个字节与最后五个字节组合起来

例如

#! /bin/sh

mac='07:d4:51:9f:50:6c'

lastfive=$( echo "$mac" | cut -d: -f 2-6 )
firstbyte=$( echo "$mac" | cut -d: -f 1 )

# make sure bit 0 (broadcast) of $firstbyte is not set,
# and bit 1 (local) is set.
# i.e. via bitwise AND with 254 and bitwise OR with 2.

firstbyte=$( printf '%02x' $(( 0x$firstbyte & 254 | 2)) )

mac="$firstbyte:$lastfive"

echo "$mac"

输出:

06:d4:51:9f:50:6c

07十六进制是00000111二进制。按位与25411111110二进制)结果为00000110二进制(十进制 6)。与2(二进制)进行按位或运算00000010不会导致任何变化,因为位 1 已设置。最终结果是06十六进制。

相关内容