Bagaimana cara membaca dalam karakter acak N dari / dev / urandom?

50
read /dev/urandom 3

Di atas tidak berfungsi .. Bagaimana saya bisa membaca byte acak dari /dev/urandomdalam bash?

linux
sumber

Jawaban:

44
random="$(dd if=/dev/urandom bs=3 count=1)"
Flimzy
sumber
1
@ Flimzy, bagaimana cara $()kerjanya?
linux
2
Ini memperlakukan output dari perintah seperti variabel. Catatan: Itu bashism. Jika Anda tidak menggunakan bash, Anda mungkin perlu menggunakan `` sebagai gantinya. `` lebih universal, tapi saya pikir $ () lebih mudah dibaca.
Flimzy
@ Flimzy, It treats the output of a command like a variable.sebenarnya maksudmu string, kan?
linux
2
Variabel dapat berupa string ... atau angka. Itu memperlakukannya sebagai variabel ... lalu tergantung pada konteks, itu diperlakukan seperti string, atau angka.
Flimzy
1
$()cukup universal, tidak spesifik untuk bash. BTW, hati-hati Anda tidak mengalami keterbatasan pada karakter apa shell dapat menyimpan dalam variabel - misalnya, versi bash yang saya uji dengan meninggalkan nol (\ x00) dari string.
Gordon Davisson
46
head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1

(Jika Anda ingin karakter tanda hubung literal, karakter tanda hubung harus berada di akhir string seperti yang dilakukan di atas, sebagai lawan dari *-_).

Dan untuk menjelaskan apa yang dilakukan karena set perintah di atas:

  1. head -c 500 /dev/urandom: Dapatkan 500 karakter (byte) pertama dari /dev/urandom.
  2. tr -dc 'a-zA-Z0-9~!@#$%^&*_-': Hapus semua kecuali karakter yang ditentukan 'a-zA-Z0-9~!@#$%^&*_-'dari output perintah pertama.
  3. fold -w 3: Format output dari perintah kedua sehingga memiliki 3 karakter per baris.
  4. head -n 1: Tampilkan baris pertama hasil dari perintah ketiga aktif stdout.
ADM
sumber
1
Dia mencari 3 byte ...
Chris S
1
3 plus pola pastinya
ADM
Ini luar biasa.
Danijel-James W
3
Bagus! Ada juga nama-nama kelas char ([: graph | print | etc:]) yang tersedia untuk tr func, dan itu dapat lebih disederhanakan dengan mengganti fold -w 3 | head -n 1dengan head -c 3jika baris char baru tidak diperlukan di akhir.
Zimmi
5
Jika pengkodean default sistem adalah multibyte (misalnya UTF-8) maka tr akan gagal dengan Illegal byte sequencekesalahan. Untuk memperbaikinya, gunakan pengkodean "C"; ubah perintah ke:head -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
devstuff
33

Silakan periksa man od.

Anda bisa menggunakan, misalnya

od -vAn -N4 -tu4 < /dev/urandom

untuk menghasilkan angka acak desimal 4 byte tak bertanda.

Ekrem Aksoy
sumber
1
Ekrem, selamat datang di SF. Saya biasanya tidak menyukai jawaban baru untuk pertanyaan yang telah lama diterima, tetapi ini benar-benar berbeda dari semua jawaban sebelumnya, dan memiliki beberapa keunggulan nyata - bagus! +1 dari saya, dan saya harap Anda tetap di SF dan berkontribusi seperti ini untuk beberapa waktu mendatang.
MadHatter mendukung Monica
19

Inilah salah satu yang membuat string base64, perhatikan bahwa meskipun mereka terbatas pada string base64, padding dihapus dari mereka, sehingga Anda tidak dapat mendekode mereka, Anda mungkin tidak akan memerlukannya juga.

 cat /dev/urandom | base64 | head -c 5

Ganti 5dengan jumlah karakter yang Anda inginkan.

Namun, jika Anda perlu men-decode mereka untuk beberapa alasan, pindah base64ke ujung pipa. Kemudian akan mengumpulkan 5 karakter dari urandom dan base64 menyandikannya dengan bantalan yang tepat, tetapi string terakhir mungkin lebih panjang dari apa yang Anda inginkan karena bantalan.

cat /dev/urandom | head -c 5 | base64
Umur Kontacı
sumber
Ini bukan pertanyaan yang diajukan. Jawaban Anda mungkin masih berguna, tetapi pertanyaannya tidak memiliki konteks yang cukup untuk mengatakan dengan pasti.
kasperd
1
@kasperd Pertanyaannya menanyakan (dalam judul) bagaimana membaca N karakter acak dari / dev / urandom tetapi dalam tubuh ia meminta untuk membaca byte. Saya setuju ada ketidakkonsistenan. Saya datang ke pertanyaan ini dari Google untuk membaca karakter dan saya pikir itu dapat membantu pengunjung masa depan sebagai pilihan.
Umur Kontacı
Saya pikir jawaban Anda adalah yang paling sederhana namun paling mudah dipahami. Terima kasih!
Robert
1
Menggunakan catakan membaca jauh lebih dari jumlah Nkarakter yang diberikan , dan dapat menghabiskan entropi. Bukan jawaban yang berguna.
Dr Beco
1
Sementara Dr Beco benar bahwa ini adalah penyalahgunaan catkarena keduanya base64dan headdapat mengambil nama file sebagai argumen, dalam hal ini berfungsi dan tidak boleh menguras entropi. Lihat stackoverflow.com/questions/10031344/...
J.Money
11

Coba ini: dd if=/dev/urandom bs=1 count=3

Jika Anda ingin memasukkan hasilnya dalam $ variabel:

variable=`dd if=/dev/urandom bs=1 count=3`

Perhatikan bahwa itu mungkin tidak akan dicetak.

Eduardo Ivanec
sumber
Bisakah perintah ini juga digunakan untuk membaca 3 byte acak dari data biner juga?
Dimitrios Desyllas
6

Solusi termudah akan sesederhana:

$ head -cN /dev/urandom
Spack
sumber
2
Apa yang ditambahkan dengan jawaban yang sudah diberikan?
MadHatter mendukung Monica
5
doa yang lebih sederhana
m.kocikowski