Генерация паролей XKCD из одной строки Bash

Генерация паролей XKCD из одной строки Bash

Есть несколько генераторов "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используется для размещения завершающего символа новой строки. Все это находится в подоболочке для более легкого включения в цикл, конвейер или другую конструкцию.

Связанный контент