Как base64 кодировать /dev/random или /dev/urandom?

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

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

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


person alexanderpas    schedule 08.08.2009    source источник
comment
Вы определенно необычны в своем определении веселья.   -  person Stefano Borini    schedule 09.08.2009


Ответы (7)


Как насчет чего-то вроде

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

Или без (бесполезного) cat+pipe :

base64 /dev/urandom

(тот же вывод ^^ )


EDIT: вы также можете использовать опцию --wrap для base64, чтобы избежать "коротких линий":

base64 --wrap=0 /dev/urandom

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

person Pascal MARTIN    schedule 08.08.2009
comment
Все, что я вижу сейчас, это блондинка, брюнетка, рыжая. - person alexanderpas; 09.08.2009
comment
@Stefano: я тоже :-D; @alexanderpas: если просмотр случайных прокручиваемых символов заставляет вас видеть такие символы, может быть, мне следует чаще смотреть случайные символы ^^ - person Pascal MARTIN; 09.08.2009
comment
@alexanderpas: кошка /dev/urandom | уэнкод - | тр -д '0-9' | sed -e 's/([@$&~#(?)+‹›^;])/^[[1m^[[32m\1^[[0m/g' | sed -e 's/([*!])/^[[30m\1^[[0m/g' | sed -e 's/([A-Z])/^[[32m\1^[[0m/g' | tr -d '\n' # 1) преобразовать ^[ в ctrl-v esc после вставки 2) можно улучшить, но уже надоело ;) - person Stefano Borini; 09.08.2009
comment
base64 --wrap=0 /dev/urandom |head -c 100 даст вам 100 случайных символов base64. Если вам нужна экранная заставка в матричном стиле на основе bash, у нее есть было сделано раньше :-) - person Adam Katz; 28.05.2015
comment
head -c128 /dev/urandom | base64 --wrap=0, чтобы не сломать трубку @AdamKatz. - person sebastian; 20.03.2019
comment
@sebastian - Верно, но это не должно быть проблемой, и ваш метод требует проб и ошибок (или передачи в другой вызов, head -c 100), чтобы получить правильное количество выходных символов (осторожно, вы не хотите = символов в конце!) . Попробуйте head -c 75 /dev/urandom |base64 -w 0 для 100 символов. - person Adam Katz; 20.03.2019

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

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
person Adam Batkin    schedule 08.08.2009
comment
Или, например, head -c 100 напечатает первые 100 байт файла. - person Mark Rushakoff; 09.08.2009
comment
При использовании строк вы также можете удалить символы новой строки с помощью дополнительной вертикальной черты: strings /dev/urandom | perl -pe 's/\n//' - person mivk; 07.11.2013

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

cat /dev/urandom | uuencode -

?

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

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

person dmckee --- ex-moderator kitten    schedule 08.08.2009
comment
не знал о опции тире. спасибо что научил меня этому ;) - person alexanderpas; 09.08.2009
comment
(на самом деле в этом случае тире означает стандартный вывод) Бесполезное использование cat - вместо этого сделайте это: uuencode /dev/random - - person Dennis Williamson; 03.12.2009

Уже есть несколько хороших ответов о том, как 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 для создания надежных паролей.

person Aaron J Lang    schedule 04.02.2014
comment
бесполезное использование кота (UUoC) -- вместо этого рассмотрите tr -dC '[:graph:]' </dev/urandom - person RubyTuesdayDONO; 23.01.2016

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

uuencode <(head -c 200 /dev/urandom | base64 | gzip)
person greyfade    schedule 09.08.2009

Пытаться

xxd -ps /dev/urandom

xxd(1)

person lhf    schedule 13.08.2009
comment
Это будет производить шестнадцатеричный/base16 не base64 - person Aaron J Lang; 04.02.2014

person    schedule
comment
Это неправильный способ сделать это. Это не Base64, в преобразовании не хватает двух символов, поэтому оно больше похоже на Base62, и поэтому декодированные значения будут смещены, например. не такой уж и случайный. - person Yann Droneaud; 12.02.2013