Каков наилучший способ получить случайную (ish) последовательность печатных / буквенно-цифровых символов?

1257
einpoklum

Я знаю, что могу получить случайные (ну, псевдослучайные) символы без ограничений из '/dev/random'(или /dev/urandom). Но что, если мне понадобятся эти символы для генерации имени файла? Мне нужно как-то иметь поток или последовательность печатных символов, или буквенно-цифровые символы, чтобы быть на безопасной стороне. Какой лучший способ сделать это в оболочке?

(Я знаю, что теоретически я мог бы сделать trна символах, /dev/randomно это не похоже на то, что нужно делать.)

1
Вы можете захотеть взглянуть на команду `mktemp`, если только по какой-то причине вам не нужно генерировать имя, даже не создавая файл с этим именем. chepner 11 лет назад 1
@chepner: Это отличное решение моей мотивирующей проблемы, спасибо! К сожалению это не то, что я в итоге спросил ... einpoklum 11 лет назад 0
Преобразуйте выходные данные urandom в printable. Или продолжайте читать и выводите только те, которые доступны для печати. Matt H 11 лет назад 0

3 ответа на вопрос

2
Nevin Williams

Я вижу, /usr/bin/jotчто способен подавлять указанное количество ограниченных случайных символов, которые могут быть преобразованы в слова, подходящие для имени файла. Вероятно, есть более красноречивый способ указания всех печатаемых символов, но я немного заржавел в своих сценариях оболочки.

[mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g EUCGGSIOIDMPCHXCHIGYXBYWJ [mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g PMKQQZOCYETVIHIMTIQFYTFZK [mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g CXBKEFSIRCOOGUICJPOMZKMSG [mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g MEHSFOSHLKKJRKQLRCXUCBJAD [mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g ZCCGKYIWLBTJUVIHQBCHXCVEU 
Это довольно мило! ... конечно, вам нужно установить `jot`, и я не думаю, что он установлен по умолчанию (по крайней мере, в системах Debian). einpoklum 11 лет назад 0
Кажется, что это вещь BSD ... Как вы уже упоминали, используя сгенерированный текст (однако вы хотите сгенерировать его) для имени файла, вы можете пометить достаточно точную временную метку, такую, которая будет маловероятна для получения одна и та же случайная строка более одного раза, вы все равно будете иметь уникальное имя файла. Nevin Williams 11 лет назад 1
1
dawud

$ dd if=/dev/urandom of=/dev/stdout bs=124 count=1 2>/dev/null | sha256sum | awk ''

1
einpoklum

Тонкая настройка @ Дауд в растворе :

dd if=/dev/urandom bs=124 count=1 2>/dev/null | sha256sum | cut -c1-64 

получает 64 персонажа; и вы можете использовать /dev/randomв системах UN * X без /dev/urandom.

Другой, более простой подход, основанный на предложении @ NevinWilliam: просто сделайте

date +%s.%N 

Никакие символы алфавита не являются особым случаем буквенно-цифровых символов ... это не охватывает весь диапазон возможных строк, оно ограничено 9 символами и не очень случайно - за исключением, может быть, последних 2-4 цифр или около того - но так как мы не делаем крипто, это должно быть достаточно хорошо.

Похожие вопросы