LinuxコマンドラインからランダムなMACアドレスを生成するにはどうすればよいですか?
Linuxコマンドラインで一般的に見られる標準ツールのみを必要とするソリューションを探しています。
MACアドレスはゲストKVMに使用されます。
LinuxコマンドラインからランダムなMACアドレスを生成するにはどうすればよいですか?
Linuxコマンドラインで一般的に見られる標準ツールのみを必要とするソリューションを探しています。
MACアドレスはゲストKVMに使用されます。
回答:
私が使う
macaddr=$(echo $FQDN|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
完全にランダムな数に対するこの方法の利点は、マシンのFQDNに基づいてMACアドレスを確実に再現できることです。これは時々役立ちます。02
最初のオクテットのためだけでは、本当のNICのMACアドレスと衝突しないことを「ローカルに割り当てられた」ことが明らかにそれはベンダー提供のMACアドレスではないことになりますビット、および保証を設定します。
ホストごとに複数のMACアドレスを生成する必要がある場合、FQDNをブリッジの名前に連結して、インターフェイスを接続しました。これにより、さまざまなNICに対応できるようになりました。
tr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
投稿されたスクリプトは良いですが、警告を追加したいと思います:誕生日(マインドザバースド)(パラドキソン)!
23人しかいない場合でも、同じ日に2人が誕生日を迎える可能性はすでに50%です。
どのように使用するかによってシナリオは異なりますが、MACSをランダムに生成すると、約100万回でMac番号が衝突する可能性は40%で200万回で既に87%です!
数個だけが必要な場合はこれで構いませんが、数百台のサーバーでサーバーファームを維持し、それぞれが数十台の仮想マシンをホストしている場合、またはブックキーピングのためにdbのインデックスとしてmacsを使用している場合、一意が必要です!
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
これらのバリアントも機能します。
より長いです:
openssl rand -hex 6 | sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1:\2:\3:\4:\5:\6/'
以下:
openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'
両方のバリアントの負荷消費量は、時間の経過とともに迅速に測定すると非常に似ています。
fold -w2|paste -sd: -
代わりに使用しましたsed
。このsed
ソリューションは、使い慣れたツールを使用しているため、おそらく覚えやすいでしょう-私は彼/彼女の答えから多くを学びました。
ec
...バイナリでそう11101100
以下に5つのオプションを示します。すべてが、アドレスがユニキャストかマルチキャストかを示す最上位バイトの最下位ビット、およびアドレスが普遍的または局所的に管理されます。
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
od
入力ファイルの引数の後に置かれたOS Xのオプションでは、入力ファイルの名前として扱われるため、Aaron Toponceによる回答のコマンドは、/dev/urandom
OS Xで無期限に読み取りますod
。
楽しみのために、Bash 4.4.12(1)-releaseに対してテストされた純粋な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}"
最初の行は/dev/urandom
、から6文字を読み取ります。次に、C文字セットを使用して、コロンで区切られた各文字の0で埋められた16進値を印刷します(改行はオプションですが、値を印刷するには便利です)。
printfを使用して文字の値を抽出する方法は、POSIX printfドキュメントで定義されています。
先行文字が単一引用符または二重引用符である場合、値は、単一引用符または二重引用符に続く文字の基になるコードセットの数値でなければなりません。