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.
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:
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ı.
tr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
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. !
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
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.
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.
ec
11101100 ile ikili olarak başlıyor ...
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'
İş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
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-
jot
OS X ve BSD'ler ile birlikte gelir, ancak çoğu Linux dağıtımıyla gelmez. Gelen jot
-w
, biçimini değiştirir -s
ayırıcı değiştirir ve -r
rastgele sayılar üretir.
od
POSIX’de, ancak hexdump
değil.
OS X'ler od
( /usr/bin/od
aş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/urandom
OS X'lerde süresiz olarak okunur od
.
$ 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/')
Kullanırım:
echo -n 02; od -t x1 -An -N 5 /dev/urandom | tr ' ' ':'
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.