Answers:
当前,GNU tr仅完全支持单字节字符。因此,在使用多字节编码的语言环境中,输出可能很奇怪:
$ </dev/urandom LC_ALL=vi_VN.tcvn tr -dc '[:print:]' | head -c 64
`�pv���Z����c�ox"�O���%�YR��F�>��췔��ovȪ������^,<H ���>
Shell将正确打印多字节字符,但是GNU tr
会删除它认为不可打印的字节。
如果要使其稳定,则必须设置区域设置:
$ </dev/urandom LC_ALL=C tr -dc '[:print:]' | head -c 64
RSmuiFH+537z+iY4ySz`{Pv6mJg::RB;/-2^{QnKkImpGuMSq92D(6N8QF?Y9Co@
:graph:
,而不是:print:
:</dev/urandom LC_ALL=C tr -dc '[:graph:]' | head -c 64
考虑代替
$ dd if=/dev/urandom bs=48 count=1 status=none | base64
imW/X60Sk9TQzl+mdS5PL7sfMy9k/qFBWWkzZjbYJttREsYpzIguWr/uRIhyisR7
这有两个优点:
您只能从随机设备读取48个字节,而不是〜8KB;如果同一主机上的其他进程需要随机数,则一次耗尽8KB可能是一个严重的问题。(是的,可以说任何人都不应使用堵随机器,但人们这样做。)
的输出base64
几乎不包含具有特殊含义的字符。(对于根本没有,钉| tr +/ -_
在端,以及(如实施例)确保的字节数输入到base64
是3的倍数)
这种方式生成一个密码,熵,这是正好384位稍微低于你正在做(日志2 96 64 ≈421.4),但更足以满足大多数目的(熵的256位是安全的“的时候,还在猜测Sun烧尽了”区域,但 RSA密钥AFAIK除外。
其他人已经指出,语言环境决定了什么[:print:]
。但是,并非所有可打印的字符都适用于密码(即使在ascii中也不适用)。您真的不想要空格,制表符和#$%^吗?用您的密码-不仅难以记住,而且还对基础身份验证系统造成潜在危险,可能无法在输入字段中输入,依此类推。在这种情况下,您应该只手动选择“理智”字符:
LC_ALL=C </dev/urandom tr -dc '[:alnum:]_' | head -c 64
或简单地
</dev/urandom tr -dc 'A-Za-z0-9_' | head -c 64
甚至更好,base64
按照其他答案中的建议使用。
?
或^
太糟糕以至于不能被认真对待。
[:print:]
类并没有包含标签。它只是[:alnum:]
+ [:punct:]
+空间(单个空间,不是 [:space:]
)。
关于什么
tr -dc [:print:] < /dev/urandom | head -c 64 | strings
字符串应以可打印的格式打印urandom的输出
-bash: /dev/urandom: Permission denied
我不知道您是否有理由使用/dev/random
该密码来生成密码,但是我建议您使用pwgen来减轻您的痛苦。
$ pwgen -s 10 1
其中10是密码的长度。