web-dev-qa-db-ja.com

LinuxコマンドラインからランダムなMACアドレスを生成する方法

LinuxコマンドラインからランダムなMACアドレスを生成するにはどうすればよいですか?

Linuxコマンドラインで一般的に見られる標準ツールのみを必要とするソリューションを検索します。

MACアドレスは、ゲストKVMに使用されます。

27
Erik Sjölund

私が使う

macaddr=$(echo $FQDN|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')

この方法の利点は、完全に乱数よりも優れており、マシンのFQDNに基づいてMACアドレスを確実に再現できることです。 02最初のオクテットは「ローカルに割り当てられた」ビットを設定するだけです。これにより、ベンダー提供のMACアドレスではないことが明らかになり、実際のNICのMACアドレスと衝突しないことが保証されます。

ホストごとに複数のMACアドレスを生成する必要がある場合、私はFQDNを、インターフェースを接続するブリッジの名前と連結するために使用しました。これは、さまざまなNICに対応するためにうまく機能しました。

47
womble

投稿されたスクリプトは良いですが、私は警告を追加したいと思います:誕生日を気にしてください(パラドクソン)!

23人しかいない場合でも、そのうち2人が同じ日に誕生日を迎える可能性はすでに50%です。

シナリオによって異なりますが、MACSをランダムに生成した場合、約100万回のMAC番号の衝突の可能性は40%、200万回はすでに87%です。

カップルが必要な場合はこれで問題ありませんが、数百台のサーバーでサーバーファームを維持し、それぞれが数十台の仮想マシンをホストしている場合、または簿記のためにいくつかのdbのインデックスとしてmacsを使用しており、一意に注意する必要がある場合!

8
flolo
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であるというウォンブルの優れた点を恥ずかしがらずに盗んでいます。

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
MadHatter

これらのバリアントも機能します。

より長いです:

openssl Rand -hex 6 | sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1:\2:\3:\4:\5:\6/'

以下:

openssl Rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'

両方のバリアントの負荷消費は、時間をかけてすばやく測定すると非常に似ています。

5
Jaroslav Kucera

私はこの投稿が古いことを知っていますが、将来の訪問者のために、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'
4
Aaron Toponce

他に5つのオプションがあります。これらはすべて、アドレスがユニキャストかマルチキャストかを示す最上位バイトの最下位ビットと、アドレスが最上位かどうかを示す最上位バイトの2番目に最下位のビットにランダムビットを使用します。普遍的または局所的に投与されます。

jot -w%02X -s: -r 6 1 256
openssl Rand -hex 6|fold -w2|paste -sd: -
od -N6 -tx1 -An /dev/random|awk '$1=$1'|tr \  :
god -N6 -tx1 -An /dev/random|cut -c2-|tr \  :
hexdump -n6 -e'/1 ":%02X"' /dev/random|cut -c2-

jotはOS XとBSDに付属していますが、ほとんどのLinuxディストリビューションには付属していません。 jot-wは形式を変更します、-sはセパレータを変更し、-rは乱数を生成します。

odはPOSIXにありますが、hexdumpはありません。

OS Xのod/usr/bin/od以下)は、GNU odとは異なる出力形式を使用します。

$ /usr/bin/od -N6 -tx1 -An /dev/random|tr ' ' :
:::::::::::d9::b9::d7::da::5f::96::::::::::::::::::::::::::::::::::::::::
$ god -N6 -tx1 -An /dev/random|tr ' ' :
:f5:6d:0a:3b:39:f9

OS Xでは、入力ファイルの引数の後に配置されたodオプションは入力ファイルの名前として扱われるため、Aaron Toponceによる回答のコマンドは/dev/urandom無制限にOS Xのodを使用します。

2
nisetama

ウォンビーの答えに基づく別の問題は次のとおりです。

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

$ FQDNの後に$ RANDOMを追加するだけで、実行するたびにランダムなMACアドレスを取得できます。これは、VMのスナップショットまたはクローンを使用してバックアップVMを作成したいユーザーにとって特に役立ちます。

macaddr=$(echo $FQDN$RANDOM|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
1
Quicksilver

私が使う:

echo -n 02; od -t x1 -An -N 5 /dev/urandom | tr ' ' ':'
0

Pythonワンライナー:

python3 -c 'import os; print(":".join(["{:02x}".format(x) for x in b"\02x" + os.urandom(5)]))'
0
presto8

面白くするために、ここにBash 4.4.12(1)リリースに対してテストされた純粋なbashバージョンを示します。

read -N6 b </dev/urandom
LC_ALL=C printf "%02x:%02x:%02x:%02x:%02x:%02x\n" "'${b:0:1}" "'${b:1:1}" "'${b:2:1}" "'${b:3:1}" "'${b:4:1}" "'${b:5:1}"

1行目は/dev/urandomから6文字を読み取ります。次に、C文字セットを使用して、コロンで区切られた各文字の0で埋められた16進値を出力します(改行はオプションですが、値を出力するのに役立ちます)。

Printfを使用した文字の値の抽出は、POSIX printf のドキュメントで定義されています。

先行文字が単一引用符または二重引用符である場合、値は、単一引用符または二重引用符に続く文字の基礎となるコードセット内の数値になります。