有一些「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
。可以使用而不是 GNUsed
來將每行的第一個字元大寫。awk
最後,echo
用於放置終止換行符。這一切都在子 shell 中,以便更容易包含在循環、管道或其他構造中。