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


26

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

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

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

回答:


46

私が使う

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

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

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


再現性のために+1。特定のアプリケーションでは、それが私の優れた方法になります。
MadHatterはモニカをサポートします

本当にありがとう、私はそれを再現可能にするというアイデアが好きです。
エリックシェールンド

さらに、同じMACを2回ランダムに生成するというめったにないイベントでMACアドレスの競合がありません
ペッターH 14

3
代わりに使用できますtr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
-ALex_hha

1
これは、私のスニペットが行うこととはまったく異なる最終結果を生成するという意味での「代替」に
すぎ

8

投稿されたスクリプトは良いですが、警告を追加したいと思います:誕生日(マインドザバースド)(パラドキソン)!

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

どのように使用するかによってシナリオは異なりますが、MACSをランダムに生成すると、約100万回でMac番号が衝突する可能性は40%で200万回で既に87%です!

数個だけが必要な場合はこれで構いませんが、数百台のサーバーでサーバーファームを維持し、それぞれが数十台の仮想マシンをホストしている場合、またはブックキーピングのためにdbのインデックスとしてmacsを使用している場合、一意が必要です!


誕生日のパラドックスに関する警告をありがとう!私の場合、約20のMACアドレスを生成するため、リスクを負います。
エリックシェールンド

3
それぞれが同じブロードキャストドメインで数十の仮想マシンをホストする数百のサーバーを実行している場合、MACアドレスの衝突リスクよりも大きな問題が発生します。
ワンブル

1
23人しかいない場合でも、同じ日に2人が誕生日を迎える可能性はすでに50%です。」23人のうち2人が同じ誕生日ではなく同じ誕生日を迎える可能性は約50%です。
ロンモーピン

5
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

MadHatterに感謝します。2番目の亜種を試しましたが、うまくいきました。非常に素晴らしい!
エリックシェールンド

5

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

より長いです:

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

以下:

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

両方のバリアントの負荷消費量は、時間の経過とともに迅速に測定すると非常に似ています。


こんにちはAnthony、ここでopenssl randとsedを組み合わせた他のバリアントはないので、これはこのトピックのユニークなソリューションです。
ヤロスラフクセラ

それは本当だ。彼/彼女はのfold -w2|paste -sd: -代わりに使用しましたsed。このsedソリューションは、使い慣れたツールを使用しているため、おそらく覚えやすいでしょう-私は彼/彼女の答えから多くを学びました。
アンソニーG-モニカの正義

最初のコマンドは、最初のビットを偶数に設定しないため、機能しないと思います!
amrx

こんにちは@ amrx、MACの最初のビットは偶数でなければなりませんか?私はで始まる、私のサーバー、のいずれかでNICを持っているec...バイナリでそう11101100
ヤロスラフ・クセラ

1
こんにちは、@ JaroslavKucera、ユニキャストMACアドレスは、最初のバイトに1の場所ビットを決して設定してはいけません。それが「グループ」(マルチキャスト/ブロードキャスト)ビットです。独自のMACアドレスを作成する場合は、最初のバイトに2のプレースビット(「ローカル管理」ビット)を設定して、保証されたグローバルに一意のMACアドレスと区別する必要があります。
amrx

4

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

2

ウォンビーの答えに基づいた別の例を次に示します。

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

md5sumを使用してurandom出力を実行する必要はありません。Aaron Toponceの答えに従ってodを使用できます。
ワンブル

2

以下に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-

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

odPOSIXにありますが、そうで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/urandomOS Xで無期限に読み取りますod


1

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

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

1
$ RANDOMはbashで利用可能ですが、他のシェルでは利用できない可能性があることに注意してください。
マイケルハンプトン


0

Pythonワンライナー:

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

0

楽しみのために、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ドキュメントで定義されています。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.