Как читать N случайных символов из / dev / urandom?

Ответы:

44
random="$(dd if=/dev/urandom bs=3 count=1)"
Flimzy
источник
1
@ Flimzy, как $()работает?
Linux
2
Он обрабатывает вывод команды как переменную. Примечание: это башизм. Если вы не используете bash, вам может понадобиться использовать `` вместо этого. `` более универсален, но я думаю, что $ () легче читать.
Хлипкий
@ Flimzy, It treats the output of a command like a variable.ты ведь имеешь в виду строку, верно?
Linux
2
Переменная может быть строкой ... или числом. Он обрабатывает его как переменную ... затем, в зависимости от контекста, он обрабатывается как строка или число.
Хлипкий
1
$()довольно универсальный, а не специфичный для bash. Кстати, будьте осторожны, вы не столкнетесь с ограничениями на то, какие символы оболочка может хранить в переменных - например, версия bash, которую я тестировал, опускает нули (\ x00) из строки.
Гордон Дэвиссон
46
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.
ADM
источник
1
Он ищет 3 байта ...
Крис S
1
3 плюс точный шаблон
ADM
Это отлично.
Даниэль-Джеймс W
3
Большой! Для функции tr доступны также имена классов char ([: graph | print | etc:]), которые могут быть еще более упрощены путем замены на fold -w 3 | head -n 1a, head -c 3если в конце новая строка char не нужна.
Зимми
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
Экрем, добро пожаловать в SF. Я обычно не очень одобряю новые ответы на давно принятые вопросы, но это действительно отличается от всех предыдущих ответов и имеет некоторые реальные преимущества - приятно! +1 от меня, и я надеюсь, что ты останешься рядом с СФ и внесешь свой вклад в течение некоторого времени.
MadHatter поддерживает Монику
19

Вот тот, который создает строки base64, обратите внимание, что, хотя они ограничены строками base64, отступы удаляются из них, поэтому вы не можете их декодировать, возможно, вам это все равно не понадобится.

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

Замените 5количество символов, которые вы хотите.

Однако если вам по каким-то причинам необходимо декодировать их, перейдите base64к концу канала. Затем он соберет 5 символов из urandom и base64 закодирует его с правильным заполнением, но итоговая строка может быть длиннее, чем вы хотели из-за заполнения.

cat /dev/urandom | head -c 5 | base64
Умур Контачи
источник
Это не совсем то, о чем спрашивал вопрос. Ваш ответ может все еще быть полезным, но у вопроса нет достаточного контекста, чтобы сказать наверняка.
Касперд
1
@kasperd Вопрос задает (в заголовке), как читать N случайных символов из / dev / urandom, но в теле он запрашивает чтение байтов. Я согласен, что есть несоответствие. Я пришел к этому вопросу из Google для чтения символов, и я думаю, что он может помочь будущим посетителям как вариант.
Умур Контачи
Я думаю, что ваш ответ самый простой, но самый простой для понимания. Спасибо!
Роберт
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
Spack
источник
2
Что это добавляет к уже даным ответам?
MadHatter поддерживает Монику
5
более простой вызов
m.kocikowski