Bagaimana cara menghasilkan alamat MAC acak dari baris perintah Linux?
Saya mencari solusi yang hanya membutuhkan alat standar yang biasa ditemukan di baris perintah Linux.
Alamat MAC akan digunakan untuk KVM tamu.
Bagaimana cara menghasilkan alamat MAC acak dari baris perintah Linux?
Saya mencari solusi yang hanya membutuhkan alat standar yang biasa ditemukan di baris perintah Linux.
Alamat MAC akan digunakan untuk KVM tamu.
Jawaban:
saya menggunakan
macaddr=$(echo $FQDN|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
Manfaat dari metode ini, lebih dari angka acak, adalah mungkin untuk mereproduksi alamat MAC dengan andal berdasarkan FQDN mesin, yang kadang-kadang bermanfaat bagi saya. Untuk 02
oktet pertama hanya menetapkan bit "yang ditentukan secara lokal", yang membuatnya jelas bahwa itu bukan alamat MAC yang disediakan vendor, dan menjamin bahwa Anda tidak akan bertabrakan dengan alamat MAC NIC yang sebenarnya.
Jika Anda perlu membuat beberapa alamat MAC per host, saya biasa menggabungkan FQDN dengan nama jembatan untuk menghubungkan antarmuka ke; ini melakukan pekerjaan yang baik untuk menyebarkan berbagai hal untuk NIC yang berbeda.
tr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
Skrip yang diposting bagus, tapi saya ingin menambahkan peringatan: Mind the Birthday (paradoxon)!
Itu berasal dari fakta bahwa bahkan jika Anda hanya memiliki 23 orang, kesempatannya sudah 50% bahwa 2 dari mereka ulang tahun pada hari yang sama.
Itu tergantung pada skenario Anda bagaimana Anda menggunakannya, tetapi jika Anda menghasilkan MACS secara acak, sekitar 1 juta peluang Anda untuk bentrokan nomor mac adalah 40% pada 2 juta itu sudah 87%!
Jika Anda hanya membutuhkan pasangan ini tidak apa-apa, tetapi ketika Anda mengelola server pertanian dengan ratusan server, masing-masing dari mereka hosting puluhan mesin virtual, atau jika Anda menggunakan mac sebagai indeks dalam beberapa db untuk pembukuan dan Anda perlu unik hati-hati !
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, Gergaji Tentara Swiss itu naik lagi. Dan dengan versi 0.2, saya tanpa malu-malu mencuri poin womble yang sangat baik tentang oktet pertama menjadi 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
Varian ini juga berfungsi.
lebih lama:
openssl rand -hex 6 | sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1:\2:\3:\4:\5:\6/'
atau lebih pendek:
openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'
Konsumsi beban kedua varian sangat mirip menurut pengukuran cepat dengan waktu.
fold -w2|paste -sd: -
alih-alih sed
. The sed
solusi adalah mungkin lebih mudah untuk diingat karena menggunakan alat yang lebih akrab - meskipun aku belajar lebih banyak dari jawaban / nya.
ec
11101100 dalam biner ...
Saya tahu posting ini sudah tua, tetapi untuk pengunjung di masa depan, jika Anda ingin alamat MAC pseudorandom aman secara cryptographically aman, tanpa terbatas pada 0x02 sebagai OUI, berikut adalah generator agnostik platform cepat:
$ 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'
Ini satu lagi, berdasarkan jawaban wombie:
macaddr=$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/')
echo $macaddr
Berikut adalah lima opsi lain, yang semuanya menggunakan bit acak untuk bit paling signifikan dari byte paling signifikan yang menunjukkan apakah alamatnya unicast atau multicast dan untuk bit paling tidak signifikan kedua dari byte paling signifikan yang menunjukkan apakah alamatnya adalah dikelola secara universal atau lokal.
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
hadir dengan OS X dan BSD tetapi tidak dengan sebagian besar distribusi Linux. Dalam jot
-w
mengubah format, -s
mengubah pemisah, dan -r
menghasilkan angka acak.
od
dalam POSIX tetapi hexdump
tidak.
OS X od
(di /usr/bin/od
bawah) menggunakan format output yang berbeda dari 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
Dalam OS X od
Pilihan ditempatkan setelah argumen untuk file input diperlakukan sebagai nama-nama file input, sehingga perintah dalam jawaban oleh Aaron Toponce membaca dari /dev/urandom
tanpa batas dengan OS X od
.
Anda bisa saja menambahkan $ ACAK setelah $ FQDN dan ini akan memberi Anda alamat mac acak setiap kali Anda menjalankannya. Ini sangat membantu untuk poeple yang ingin membuat backup vms menggunakan snapshot atau klon vms.
macaddr=$(echo $FQDN$RANDOM|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
Saya menggunakan:
echo -n 02; od -t x1 -An -N 5 /dev/urandom | tr ' ' ':'
Hanya untuk bersenang-senang, di sini adalah versi bash murni, diuji terhadap Bash 4.4.12 (1) - rilis:
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}"
Baris pertama membaca 6 karakter dari /dev/urandom
; kemudian menggunakan set karakter C cetak nilai hex diisi 0 dari setiap karakter yang dipisahkan dengan titik dua (baris baru opsional tetapi berguna untuk mencetak nilai).
Mengekstraksi nilai karakter menggunakan printf didefinisikan dalam dokumentasi POSIX printf :
Jika karakter utama adalah kuotasi tunggal atau kuotasi ganda, nilainya harus berupa nilai numerik dalam kumpulan kode yang mendasari karakter yang mengikuti kuotasi tunggal atau kuotasi ganda.