Как base64 кодировать / dev / random или / dev / urandom? - PullRequest
43 голосов
/ 09 августа 2009

cat /dev/urandom - это всегда забавный способ создания прокручиваемых символов на вашем дисплее, но при этом создается слишком много непечатаемых символов.

Существует ли простой способ кодировать его в командной строке таким образом, чтобы все его выходные данные были читаемыми символами, например, base64 или uuencode.

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

Ответы [ 7 ]

66 голосов
/ 09 августа 2009

Как насчет

cat /dev/urandom | base64

Что дает (много) таких вещей, как

hX6VYoTG6n+suzKhPl35rI+Bsef8FwVKDYlzEJ2i5HLKa38SLLrE9bW9jViSR1PJGsDmNOEgWu+6
HdYm9SsRDcvDlZAdMXAiHBmq6BZXnj0w87YbdMnB0e2fyUY6ZkiHw+A0oNWCnJLME9/6vJUGsnPL
TEw4YI0fX5ZUvItt0skSSmI5EhaZn09gWEBKRjXVoGCOWVlXbOURkOcbemhsF1pGsRE2WKiOSvsr
Xj/5swkAA5csea1TW5mQ1qe7GBls6QBYapkxEMmJxXvatxFWjHVT3lKV0YVR3SI2CxOBePUgWxiL
ZkQccl+PGBWmkD7vW62bu1Lkp8edf7R/E653pi+e4WjLkN2wKl1uBbRroFsT71NzNBalvR/ZkFaa
2I04koI49ijYuqNojN5PoutNAVijyJDA9xMn1Z5UTdUB7LNerWiU64fUl+cgCC1g+nU2IOH7MEbv
gT0Mr5V+XAeLJUJSkFmxqg75U+mnUkpFF2dJiWivjvnuFO+khdjbVYNMD11n4fCQvN9AywzH23uo
03iOY1uv27ENeBfieFxiRwFfEkPDgTyIL3W6zgL0MEvxetk5kc0EJTlhvin7PwD/BtosN2dlfPvw
cjTKbdf43fru+WnFknH4cQq1LzN/foZqp+4FmoLjCvda21+Ckediz5mOhl0Gzuof8AuDFvReF5OU

Или без (бесполезной) кошки + трубы:

base64 /dev/urandom

(Тот же тип вывода ^^)


РЕДАКТИРОВАТЬ: вы также можете использовать параметр --wrap base64, чтобы избежать "коротких линий":

base64 --wrap=0 /dev/urandom

Это удалит перенос, и вы получите «полноэкранный» дисплей ^^

21 голосов
/ 09 августа 2009

Некоторые люди предложили cat обвязать и пропустить через base64 или uuencode. Одна из проблем заключается в том, что вы не можете контролировать, сколько данных читать (это будет продолжаться вечно, или пока вы не нажмете Ctrl + C). Другая возможность - использовать команду dd, которая позволит вам указать, сколько данных нужно прочитать перед выходом. Например, чтобы прочитать 1kb:

dd if=/dev/urandom bs=1k count=1 2>/dev/null | base64

Другим вариантом является передача по команде strings, которая может дать больше разнообразия в ее выводе (непечатные символы отбрасываются, отображаются любые пробежки по меньшей мере из 4 печатных символов [по умолчанию]). Проблема с strings заключается в том, что он отображает каждый «запуск» в отдельной строке.

dd if=/dev/urandom bs=1k count=1 2>/dev/null | strings

(конечно, вы можете заменить всю команду на

strings /dev/urandom

если вы не хотите, чтобы это когда-либо прекращалось).

Если вы хотите что-то действительно прикольное, попробуйте одно из:

cat -v /dev/urandom
dd if=/dev/urandom bs=1k count=1 2>/dev/null | cat -v
5 голосов
/ 09 августа 2009

Итак, что не так с

cat /dev/urandom | uuencode -

Исправлено после того, как первая попытка не сработала ... :: sigh ::

Кстати: многие утилиты unix используют «-» вместо имени файла, что означает «использовать стандартный ввод».

4 голосов
/ 04 февраля 2014

Уже есть несколько хороших ответов о том, как base64 кодировать случайные данные (т.е. cat /dev/urandom | base64). Однако в теле вашего вопроса вы уточняете:

... кодировать [urandom] в командной строке таким образом, чтобы все его выходные данные были читаемыми символами, например, base64 или uuencode.

Учитывая, что вы на самом деле не требуете разбираемого base64 и просто хотите, чтобы он был читабельным, я бы предложил

cat /dev/urandom | tr -dC '[:graph:]'

base64 выводит только буквенно-цифровые символы и два символа (+ и / по умолчанию). [:graph:] будет соответствовать любой печатной непробельной символике ascii, включая множество символов / знаков препинания, которых не хватает в base64. Поэтому использование tr -dC '[:graph:]' приведет к более случайному выводу и получит лучшую эффективность ввода / вывода.

Я часто использую < /dev/random stdbuf -o0 tr -Cd '[:graph:]' | stdbuf -o0 head --bytes 32 для создания надежных паролей.

1 голос
/ 24 августа 2012
cat /dev/urandom | tr -dc 'a-zA-Z0-9'
1 голос
/ 10 августа 2009

Вы можете делать более интересные вещи с трубами BASH FIFO:

uuencode <(head -c 200 /dev/urandom | base64 | gzip)
0 голосов
/ 13 августа 2009

Попробуйте

xxd -ps /dev/urandom

xxd(1)

...