Linux tr命令异常:自定义字符集的密码生成器出现意外字符
为什么我的tr命令生成的密码里出现了意外的,和.字符?
你遇到的问题根源在于tr命令对字符集中-的特殊解析规则——它把你写的+-/~误判成了一个ASCII字符范围,从而意外包含了,和.。
咱们来拆解一下tr是怎么处理你的参数'[:alnum:]@#%+-/~'的:
- 首先,
[:alnum:]会被识别为字母数字字符类,这部分是正常的; - 接下来的
@#%会被当成普通单个字符,没问题; - 关键问题出在
+-/~这里:tr规定,只要-不在字符集的开头或结尾,也不在字符类内部,就会被用作字符范围分隔符。你写的+-/~里,-夹在+和/之间,tr就会把它解析成「从+到/的所有ASCII字符」。
查一下ASCII表就知道,+的编码是43,/是47,这个范围里包含的字符是:+(43)、,(44)、-(45)、.(46)、/(47)——这就是,和.出现在密码里的原因!
解决办法
要让tr把-当成普通字符,只需要把它放到字符集的开头或结尾就行。比如把你的字符集改成:
pass 20 '[:alnum:]@#%+/-~'
或者更规范的写法(用[]明确包裹字符类,同时把-放在末尾):
pass 20 '[[:alnum:]]@#%+/~-'
这样修改后,tr就只会保留你指定的字母数字、@、#、%、+、/、~、-这些字符,不会再出现意外的,和.了。
内容的提问来源于stack exchange,提问作者user9541335
相关产品推荐
相关产品推荐

