从单个 Bash 行生成 XKCD 密码

从单个 Bash 行生成 XKCD 密码

有一些“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 coreutilsmacOS(我也使用)
  • 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。可以使用而不是 GNUsed来将每行的第一个字符大写。awk最后,echo用于放置终止换行符。这一切都在子 shell 中,以便更容易包含在循环、管道或其他构造中。

相关内容