次の方法で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
- 最初のバイトを抽出します(
07
例)。 - ビットAND 10進数254(11111110 - ビット0を除くすべてのビットが設定されます)
- 10進数2を使用したビットごとのOR(00000010 - ビット1のみ設定)
- 最初のバイトを最後の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
07
16進数は00000111
2進数です。ビットAND 254
(11111110
バイナリ)の結果は00000110
バイナリ(10進数6)です。 (バイナリ) との2
ビット OR 演算は00000010
ビット 1 がすでに設定されているため変更されません。最終結果は06
16進数です。