解決策 1:
私は使用します
macaddr=$(echo $FQDN|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
完全な乱数に対するこの方法の利点は、マシンの FQDN に基づいて MAC アドレスを確実に再現できることです。これは時々役立つと思います。 02
最初のオクテットについては、「ローカルに割り当てられた」ビットを設定するだけです。これにより、ベンダー提供の MAC アドレスではないことが明らかになり、実際の NIC の MAC アドレスと衝突しないことが保証されます。
ホストごとに複数の MAC アドレスを生成する必要がある場合、以前は FQDN をブリッジの名前と連結してインターフェースを接続していました。これにより、さまざまな NIC にうまく分散できました。
解決策 2:
投稿されたスクリプトは優れていますが、警告を追加したいと思います:誕生日 (パラドクソン) に注意してください!
これは、23 人しかいない場合でも、そのうちの 2 人が同じ日に誕生日を迎える確率はすでに 50% であるという事実に由来します。
どのように使用するかはシナリオによって異なりますが、MACS をランダムに生成する場合、約 100 万で mac 番号が衝突する可能性は 40% で、200 万ではすでに 87% です!
数台しか必要ない場合はこれで問題ありませんが、数百台のサーバーを備えたサーバー ファームを維持し、それぞれが数十台の仮想マシンをホストしている場合、または簿記のためにいくつかのデータベースでインデックスとして mac を使用していて、一意が必要な場合は注意してください!
解決策 3:
これらのバリアントも同様に機能します。
長い:
openssl rand -hex 6 | sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1:\2:\3:\4:\5:\6/'
またはそれより短い:
openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'
両方のバリアントの負荷消費は、時間のクイック測定によると非常に似ています.
解決策 4:
myserver% perl -e 'for ($i=0;$i<6;$i++){@m[$i]=int(rand(256));} printf "%X:%X:%X:%X:%X:%X\n",@m;'
55:C2:A5:FA:17:74
ああ、昔のスイス アーミー チェーンソーがまた乗った。バージョン 0.2 では、最初のオクテットが 02 であるという womble の優れた点を恥ずかしがらずに盗みます:
myserver% perl -e 'for ($i=0;$i<5;$i++){@m[$i]=int(rand(256));} printf "02:%X:%X:%X:%X:%X\n",@m;'
02:8E:94:A3:47:26
解決策 5:
この投稿が古いことは承知していますが、将来の訪問者のために、OUI として 0x02 に制限されることなく、暗号的に安全な疑似ランダム MAC アドレスが必要な場合は、主にプラットフォームに依存しない高速なジェネレーターを次に示します。
$ printf '%02x' $((0x$(od /dev/urandom -N1 -t x1 -An | cut -c 2-) & 0xFE | 0x02)); od /dev/urandom -N5 -t x1 -An | sed 's/ /:/g'