Jawaban:
random="$(dd if=/dev/urandom bs=3 count=1)"
It treats the output of a command like a variable.
sebenarnya maksudmu string, kan?
$()
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.
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:
head -c 500 /dev/urandom
: Dapatkan 500 karakter (byte) pertama dari /dev/urandom
.tr -dc 'a-zA-Z0-9~!@#$%^&*_-'
: Hapus semua kecuali karakter yang ditentukan 'a-zA-Z0-9~!@#$%^&*_-'
dari output perintah pertama.fold -w 3
: Format output dari perintah kedua sehingga memiliki 3 karakter per baris. head -n 1
: Tampilkan baris pertama hasil dari perintah ketiga aktif stdout
.fold -w 3 | head -n 1
dengan head -c 3
jika baris char baru tidak diperlukan di akhir.
Illegal byte sequence
kesalahan. 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
Silakan periksa man od
.
Anda bisa menggunakan, misalnya
od -vAn -N4 -tu4 < /dev/urandom
untuk menghasilkan angka acak desimal 4 byte tak bertanda.
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 5
dengan jumlah karakter yang Anda inginkan.
Namun, jika Anda perlu men-decode mereka untuk beberapa alasan, pindah base64
ke 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
cat
akan membaca jauh lebih dari jumlah N
karakter yang diberikan , dan dapat menghabiskan entropi. Bukan jawaban yang berguna.
cat
karena keduanya base64
dan head
dapat mengambil nama file sebagai argumen, dalam hal ini berfungsi dan tidak boleh menguras entropi. Lihat stackoverflow.com/questions/10031344/...
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.
Solusi termudah akan sesederhana:
$ head -cN /dev/urandom
$()
kerjanya?