Linux komut satırından rastgele bir MAC adresi oluşturma


26

Linux komut satırından rastgele bir MAC adresi nasıl oluşturabilirim?

Yalnızca Linux komut satırında yaygın olarak bulunan standart araçları gerektiren bir çözüm arıyorum.

MAC adresi bir misafir KVM için kullanılacaktır.

Yanıtlar:


46

kullanırım

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

Bu yöntemin yararı, tamamen rastgele bir sayı üzerinden, bazen yararlı bulduğum makinenin FQDN'sine göre MAC adresini güvenilir bir şekilde çoğaltmak mümkün. 02İlk sekizli için sadece bir satıcı tarafından sağlanan MAC adresi değil ve garanti O kadar belli yapar "yerel atanan" biti, ayarlar değil çarpışır gerçek NIC MAC adresi ile olacak o.

Ana bilgisayar başına birden fazla MAC adresi oluşturmanız gerekiyorsa, FQDN'yi arayüzü bağlamak için köprü adı ile birleştirmek için kullanılır; bu, farklı NIC'ler için işleri yaymak için iyi bir iş yaptı.


Tekrarlanabilirlik için +1; Bazı uygulamalar için bu benim için çok daha üstün bir yöntemdir.
MadHatter, Monica,

Çok teşekkürler, tekrarlanabilir hale getirme fikrini seviyorum.
Erik Sjölund,

Ayrıca, rastgele aynı makola iki kez
Petter H

3
Alternatif olarak kullanabilirsiniztr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
ALex_hha


8

Gönderilen senaryolar iyi, ama bir uyarı eklemek istiyorum: Doğum Gününe Dikkat Edin (paradoxon)!

Sadece 23 kişiniz olsa bile, iki kişinin aynı gün doğum günü geçirme şansının zaten% 50 olması gerçeğinden geliyor.

Senaryonuza nasıl kullandığınıza bağlıdır, ancak MACS'i rastgele üretirseniz, yaklaşık 1 milyonda bir mac numarası çatışması şansınız 2 milyonda% 40, zaten% 87'dir!

Eğer sadece birkaç taneye ihtiyacınız varsa, sorun yok ama yüzlerce sunucuya sahip bir sunucu grubu işletiyorsanız, her biri onlarca sanal makineye ev sahipliği yapıyorsa veya mac'ları defter tutma için bazı db'lerde indeks olarak kullanıyorsanız ve benzersiz olmanız gerekir. !


Doğum günü paradoksuna ilişkin uyarı için teşekkürler! Benim durumumda yaklaşık 20 MAC adresi oluşturacağım için risk alacağım.
Erik Sjölund

3
Her biri aynı yayın alanında onlarca sanal makineyi barındıran yüzlerce sunucu çalıştırıyorsanız, MAC adres çarpışma riskinden daha büyük sorunlarınız olur.
womble

1
Bu, sadece 23 kişiniz olsa bile , aynı gün içinde ikisinin doğum günü geçirme şansının zaten% 50 olması gerçeğinden geliyor. ” Bu uzaktan bile doğru değil. 23 kişiden ikisinin aynı doğum gününe değil aynı doğum yıldönümüne sahip olma ihtimalinin% 50 olması ihtimali var .
Ron Maupin,

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

Ah, ol ' İsviçre Ordusu Testere yeniden sürmek. Ve 0.2 sürümüyle, utanmadan ilk sekizlinin 02 olduğu konusundaki mükemmel noktasını çalıyorum:

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

Teşekkürler MadHatter, ikinci versiyonunuzu denedim ve işe yaradı. Çok hoş!
Erik Sjölund

5

Bu değişkenler de çalışır.

uzun:

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

veya daha kısa:

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

Her iki varyantın yük tüketimi, zamanla hızlı ölçüme göre çok benzer.


Merhaba Anthony, openssl rand ve sed'i burada birleştiren başka bir değişken göremiyorum, bu yüzden bu konudaki benzersiz bir çözüm.
Jaroslav Kucera

Bu doğru. Onun fold -w2|paste -sd: -yerine kullandı sed. sedÇözelti muhtemelen bir daha tanıdık bir araç kullandığından hatırlamak daha kolaydır - Daha onun / onu cevabını öğrendim bile.
Anthony G - Monica

Bence ilk komut işe yaramaz çünkü ilk biti bile ayarlamaz!
amrx

Merhaba @ amrx, MAC'in ilk bitinin bile olması gerektiğine emin misiniz? Sunucularmdan birinde NIC var, ki ec11101100 ile ikili olarak başlıyor ...
Jaroslav Kucera

1
Merhaba @ JaroslavKucera, Unicast MAC adresleri asla ilk 1 bayt'taki yer biti ayarlamamalıdır. Bu "grup" (multicast / broadcast) bitidir. Kendi MAC adresinizi oluşturursanız, garantili global olarak benzersiz bir MAC adresinden ayırt etmek için 2'nin yer bitini ("yerel olarak yönetilen" bit) ilk baytta ayarlamanız gerekir.
amrx

4

Bu yazının eski olduğunu biliyorum, ancak gelecekteki ziyaretçiler için, kriptografik olarak güvenli bir sözde ve MAC adresi istiyorsanız, OUI olarak 0x02 ile sınırlandırılmadan istiyorsanız, hızlı bir çoğunlukla platform agnostic jeneratörü:

$ 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

İşte rahminin cevabına dayanan başka bir tane daha:

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

Urandom çıktısını md5sum üzerinden çalıştırmaya gerek yoktur; Aaron Toponce'un cevabına göre sadece od kullanabilirsiniz.
womble

2

Hepsi, adresin tek noktaya yayın mı yoksa çok noktaya yayın mı olduğunu belirten en önemli baytın en az anlamlı biti için rastgele bit kullanan ve adresin olup olmadığını belirten en önemli baytın en az ikinci önemli biti için rastgele bit kullanan beş seçenek evrensel olarak veya yerel olarak yönetilir.

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 ve BSD'ler ile birlikte gelir, ancak çoğu Linux dağıtımıyla gelmez. Gelen jot -w, biçimini değiştirir -sayırıcı değiştirir ve -rrastgele sayılar üretir.

odPOSIX’de, ancak hexdumpdeğil.

OS X'ler od( /usr/bin/odaşağıda) GNU'dan farklı bir çıktı formatı kullanır 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'te od, bir giriş dosyası için bir argümandan sonra yerleştirilen seçenekler, giriş dosyalarının adları olarak değerlendirilir, bu nedenle Aaron Toponce tarafından verilen cevaptaki komut /dev/urandomOS X'lerde süresiz olarak okunur od.


1

$ FQDN'den sonra sadece $ RANDOM ekleyebilirsiniz ve bu size her çalıştırışınızda rastgele mac adresleri verir. Bu özellikle, anlık görüntüleri veya vms klonlarını kullanarak yedek vms oluşturmak isteyen kişiler için faydalıdır.

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

1
$ RANDOM'un bash olarak mevcut olduğunu, ancak diğer kabuklarda bulunmayabileceğini unutmayın.
Michael Hampton,


0

Python bir astar:

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

0

Sadece eğlence için, işte Bash 4.4.12 (1) sürümüne karşı test edilmiş saf bir bash versiyonu.

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}"

İlk satır 6 karakterden başlıyor /dev/urandom; daha sonra C karakter setini kullanarak iki nokta üst üste ayrılmış her karakterin 0 dolu onaltılık değerini yazdırın (yeni satır isteğe bağlıdır ancak değeri yazdırmak için kullanışlıdır).

Bir karakterin printf kullanarak çıkarılması POSIX printf belgelerinde tanımlanır :

Baştaki karakter bir tek alıntı veya çift alıntı ise, değer, tek alıntı veya çift alıntıyı izleyen karakterin temel kod kümesindeki sayısal değer olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.