Як читати в N випадкових символів з / dev / urandom?


50
read /dev/urandom 3

Вищезгадане не працює..Як я можу читати випадкові байти з /dev/urandombash?

Відповіді:


44
random="$(dd if=/dev/urandom bs=3 count=1)"

1
@ Flimzy, як $()працює?
linux

2
Він трактує вихід команди, як змінну. Примітка. Це башизм. Якщо ви не використовуєте bash, можливо, вам знадобиться використовувати `` натомість. `` є більш універсальним, але я думаю, що $ () читати простіше.
Flimzy

@Flimzy, It treats the output of a command like a variable.ви насправді маєте на увазі як рядок, правда?
linux

2
Змінна може бути рядок ... або число. Він трактує це як змінну ... тоді, залежно від контексту, він трактується як рядок або число.
Flimzy

1
$()є досить універсальним, не специфічним для bash. BTW, будьте обережні, що ви не стикаєтесь з обмеженнями того, які символи оболонка може зберігати у змінних - наприклад, версія тестування, яку я тестував, випускає з рядка нулі (\ x00).
Гордон Девіссон

44
head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1

(Якщо ви хочете буквально тире символів, тире повинен містити тире в кінці рядка, як це зроблено вище, на відміну від *-_).

І пояснити, що робиться завдяки вищенаведеному набору команд:

  1. head -c 500 /dev/urandom: Отримайте перші 500 символів (байт) від /dev/urandom.
  2. tr -dc 'a-zA-Z0-9~!@#$%^&*_-': Видаліть усі, крім символів, вказані у 'a-zA-Z0-9~!@#$%^&*_-'виводі першої команди.
  3. fold -w 3: Відформатуйте вихід другої команди таким чином, щоб вона містила 3 ​​символи на рядок.
  4. head -n 1: Показує перший рядок результату третьої команди stdout.

1
Він шукає 3 байти ...
Chris S

1
3 плюс точний зразок
ADM

Це чудово.
Danijel-James W

3
Чудово! Існують також імена класів char ([: graph | print | тощо:]), доступні для tr func, і це можна додатково спростити, замінивши на fold -w 3 | head -n 1a, head -c 3якщо новий рядок не потрібен в кінці.
Zimmi

5
Якщо кодування за замовчуванням системи є багатобайтовим (наприклад, UTF-8), то tr вийде з ладу з Illegal byte sequenceпомилкою. Щоб виправити це, використовуйте кодування "C"; змінити команду на:head -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
devstuff

33

Будь ласка, перевірте man od.

Можна використовувати, наприклад

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

для створення безпідписаних десяткових 4-байтних випадкових чисел.


1
Екрем, ласкаво просимо в СФ. Зазвичай я не віддаю перевагу новим відповідям на давно прийняті запитання, але це справді відрізняється від усіх попередніх відповідей і має деякі реальні переваги - приємно! +1 від мене, і я сподіваюсь, що ти залишишся навколо СФ та зробиш такий внесок ще деякий час.
MadHatter

19

Ось такий, який створює строк base64, зауважте, що, хоча вони обмежені рядками base64, прокладки видаляються з них, тому ви не можете їх розшифрувати, ви, ймовірно, не знадобляться.

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

Замініть 5на кількість символів, які ви хочете.

Якщо вам потрібно чомусь їх розшифрувати, перейдіть base64до кінця труби. Потім буде зібрано 5 символів з urandom, а base64 кодує його правильним вкладишем, але остаточний рядок може бути довшим, ніж ви хотіли завдяки прокладці.

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

Це не зовсім те, про що задавали питання. Ваша відповідь все ще може бути корисною, але в цьому питанні недостатньо контексту, щоб точно сказати.
kasperd

1
@kasperd Питання задає (у назві), як прочитати N випадкових символів з / dev / urandom, але в тілі він запитує для читання байтів. Я згоден, є суперечливість. Я прийшов до цього питання з Google для читання персонажів і думаю, що це може допомогти майбутнім відвідувачам як варіант.
Umur Kontacı

Я думаю, що ваша відповідь є найпростішим, але найпростішим для розуміння. Дякую!
Роберт

1
Використання catзчитує набагато більше заданої кількості Nсимволів і може вичерпати ентропію. Не корисна відповідь.
Д-р Беко

1
Незважаючи на те, що доктор Беко вважає, що це зловживання, catоскільки обоє base64і headможуть приймати ім'я файлу як аргумент, в цьому випадку воно працює і не повинно вичерпувати ентропію. Див stackoverflow.com/questions/10031344 / ...
J.Money

11

Спробуйте це: dd if=/dev/urandom bs=1 count=3

Якщо ви хочете поставити результат у змінну $:

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

Зауважте, що він, ймовірно, не може бути надрукований.


Чи може команда також використовуватись для зчитування 3 випадкових байтів двійкових даних?
Дімітріос Десільяс

6

Найпростіше рішення було б таким же простим, як:

$ head -cN /dev/urandom

2
Що це додає до вже наданих відповідей?
MadHatter

5
простіший виклик
m.kocikowski
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.