有効なランダム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. ビットAND 10進数254(11111110 - ビット0を除くすべてのビットが設定されます)
  3. 10進数2を使用したビットごとのOR(00000010 - ビット1のみ設定)
  4. 最初のバイトを最後の5バイトと組み合わせる

例えば

#! /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

0716進数は000001112進数です。ビットAND 25411111110バイナリ)の結果は00000110バイナリ(10進数6)です。 (バイナリ) との2ビット OR 演算は00000010ビット 1 がすでに設定されているため変更されません。最終結果は0616進数です。

関連情報