Есть несколько генераторов "XKCD паролей", но задача кажется такой простой, поэтому я хотел компактное и простое решение. Мои требования были:
- Однострочный псевдоним (или функция из нескольких строк) для вставки
.profile
- Стандартные команды Unix (не требуют пакетов)
- Вывод столбца (например
pwgen
) - Заглавные слова (для удобства чтения)
(Я с радостью откажусь от параметров командной строки в обмен на простоту.)
for i in {1..32}; do grep -E "^[a-z]{4,8}$" /usr/share/dict/words | gshuf -n4 | gsed 's/.*/\u&/' | tr -d '\n' | awk '{print $1}'; done | column
Текущие проблемы:
shuf
требуетсяbrew install coreutils
на macOS (которую я тоже использую)sed
требуетbrew install gnu-sed
(то же самое)tr -d '\n' | awk '{print $1}'
кажется глупым.
Как создать короткую, но удобочитаемую командную строку, которая будет работать как в Linux, так и в macOS?
Кстати, я обнаружил, что с помощью SCOWL, который предлагает широкий спектр слов: от коротких списков с распространенными названиями до длинных списков с малоизвестными словами, можно найти компромисс между запоминаемостью и энтропией.
решение1
У меня нет доступа к моему Mac, где я нахожусь, но поскольку он работает под управлением OS X 10.4.11, я не уверен, что это будет сопоставимо с вашей средой. Следующий способ работает для генерации одного пароля на FreeBSD. Если это не соответствует вашим потребностям, не стесняйтесь сообщить мне, чего не хватает в комментариях:
(sort -R /usr/share/dict/words \
| head -n 4 \
| awk '{ sub(".", substr(toupper($0),1,1)); printf "%s", $0 }' \
; echo)
На FreeBSD и на моей системе Arch Linux sort -R
случайным образом упорядочивает ввод. Это только псевдослучайно, но это самое лучшее, что вы получите с большинством других программ. Затем выберите четыре слова из этого набора с помощью head
. Вместо GNU sed
, awk
может использоваться для заглавия первого символа каждой строки. Наконец, echo
используется для размещения завершающего символа новой строки. Все это находится в подоболочке для более легкого включения в цикл, конвейер или другую конструкцию.