Bagaimana saya bisa menghasilkan alamat mac acak yang valid dengan bash.
Paruh pertama dari alamat harus selalu tetap sama seperti ini
00-60-2F-xx-xx-xx
hanya nilai x yang harus dihasilkan secara acak?
bash
mac-address
NES
sumber
sumber
echo -n 00-60-2F; dd bs=1 count=3 if=/dev/random 2>/dev/null |hexdump -v -e '/1 "-%02X"'
Jawaban:
Ini ikan.
Script shell ini akan menghasilkan string acak yang Anda cari:
Saya memang punya sesuatu di sini yang menunjukkan cara menjalankannya dari baris perintah, tetapi setelah melihat Dennis Williamson solusi yang berbelit-belit (tapi tervotasikan) saya melihat bahwa jawaban yang orang harapkan adalah jawaban di mana mereka tidak perlu melakukan pekerjaan apa pun diri.
sumber
Di masa lalu saya telah melakukan ini menggunakan:
tapi itu hanya akan membuat mereka berada di kisaran 0-9. Demi tujuan saya, itu sudah cukup baik.
Mungkin solusi yang lebih baik adalah menggunakan printf:
Begini cara kerjanya:
sumber
%02X
akan memberikan satu huruf besar.Atau dengan python:
Perhatikan bahwa versi python hanya menggunakan bidang 16 lebar untuk menghasilkan hex char, jadi Anda tidak perlu khawatir tentang nol padding - pendekatan diubah untuk mengatasi komentar.
sumber
00-60-2F-8B-5-2C
,00-60-2F-A-71-97
,00-60-2F-82-F1-4
.Menggunakan alat standar, baik
atau
mungkin yang terpendek dari semuanya.
sumber
Kunci cara kerjanya:
LC_CTYPE=C
- memungkinkan karakter> 0x7FIFS=
- Menonaktifkan interpretasi\t
(tab),\n
(baris baru) dan ruang-d ''
- memungkinkan baris baru-r
memungkinkan\
(dan harus hampir selalu digunakan oleh kebiasaan denganread
)-%02x\n
menyebabkan output menjadi tanda hubung literal diikuti oleh bilangan heksadesimal dua digit termasuk nol di depan, jika perlu. Baris baru berlebihan di sini dan bisa dihilangkan.read
mendapat satu byte (-n 1
) dari/dev/urandom
dalam kisaran 0 sampai 255 (00
untukFF
).Kutipan tunggal dalam argumen terakhir ke
printf
dalam loop menyebabkan karakter menjadi output sebagai nilai numeriknya ("A" adalah output sebagai "65"). Lihat spesifikasi POSIX untukprintf
mengatakan:sumber
IFS= read …
untuk menghindari melipat 09 0a dan 20 (karakter IFS biasa) menjadi 00.-d ''
. Saya akan memperbaiki jawaban saya. Terima kasih telah memberi tahu saya.-r
yang melindungi `\` rontok. Saya berharap penanganan yang tepat dari data biner dalam program shell tidak terlalu rumit. ☺ Tampaknya mustahil untuk secara akurat mewakili 00 di tengah-tengah string. Metode single-character-at-a-time Anda menangani 00 berdasarkan kerjasama yang nyaman (dirancang?) Antararead
, interpolasi string dan bagaimanaprintf
memperlakukan argumen satu karakter'
. Mendesah.hexdump -C
.Cara terpendek yang bisa saya lakukan adalah menggunakan hexdump secara langsung
Diuji pada GNU / Linux
sumber
hexdump -n3 -e'/3 "00-60-2F" 3/1 "-%02X"' /dev/random
sedikit lebih pendek :-)Solusi satu baris lainnya
Hal yang sama dalam huruf besar
Hasilkan untuk variabel lingkungan Bash
Detail:
od (dump oktal)
-An
Menekan representasi alamat utama (noise ekstra) dari output.-N3
Batasi output hingga tiga byte.-t xC
Keluaran dalam hex, gaya karakter ASCII, seperti yang diinginkan./dev/urandom
Linux pseudo-file kernel angka acak.sed (stream editor) Untuk ruang pengganti tanda hubung.
-e <SCRIPT>
jalankan skrip sed.tr (terjemahan string) Opsional, dalam contoh ini. Saya suka alamat MAC huruf besar di skrip / lingkungan saya.
sumber
sumber
Ini seharusnya bekerja
sumber
sumber
Yang ini juga berfungsi. Output semua dalam huruf besar sesuai kebutuhan.
sumber
Ini berfungsi dalam
#!/bin/sh
skrip shell ( ) klasik :Atau, jika Anda ingin memiliki awalan khusus:
Contoh penggunaan:
sumber
Pilihan lain adalah menggunakan
jot
:-w
mengubah format,-s
mengubah pemisah, dan-r
menghasilkan angka acak.Perintah yang digunakan
od
dalam jawaban yang diposting oleh artistoex dan zero2cx menambahkan tanda hubung ekstra ke output dengan OS X'sod
, tetapi ini tidak:OS X
od
(di/usr/bin/od
bawah) menggunakan format output yang berbeda dari GNUod
:sumber
jot -w%02X -s- -r 3 1 256
menjadijot -w%02X -s- -r 3 0 256
.Di Linux:
Penjelasan:
Di Linux
/proc/sys/kernel/random/uuid
mengembalikan yang baru UUID tipe 4 baru (acak) setiap kali Anda membacanya. Sebagian besar karakternya adalah (pseudo) angka heksadesimal acak, sehingga kita dapat menggunakannya. Misalnya:Sekarang sudah cukup untuk mencetak
00-60-2f-
(tanpa baris baru) terlebih dahulu:Pro:
printf
dancut
merupakan alat POSIX;Cons:
/proc/sys/kernel/random/uuid
mungkin tidak tersedia di beberapa sistem;sumber
One liner (bash)
hasil
sumber