我有这个密码生成器:
pass () {
# Generates a random password
local size="${1:-12}"
local alphabet="$2"
</dev/urandom tr -dc "$alphabet" | head -c$size ; echo ""
}
其工作原理如下:
» pass 20 '[:alnum:]'
DpEf8bMp7zfkvSoudItS
但失败如下:
» pass 20 '[:alnum:]@#%+-/~'
JSNweE,.EU+P.l5nqkzd
tr
命令明确说:
删除所有不属于给定集合的字符
因此字符,
和.
是意料之外的。
他们来自哪里?
答案 0 :(得分:2)
您忽略了tr
手册页的另一部分:
CHAR1-CHAR2
从CHAR1到CHAR2的所有字符按升序排列
因此,+-/
部分将代表字符+
,,
,-
,.
和/
。 (man ascii
在这里很有用)。
对于连字符,你可以逃脱它:
pass 20 '[:alnum:]@#%+\-/~'
改为使用\055
:
pass 20 '[:alnum:]@#%+\055/~'
或将其放在最后:
pass 20 '[:alnum:]@#%+/~-'