3

这是密码生成器的片段:

# ...
ascstring='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHILKLMNOPQRSTUVWXYZ!#$%&()*+-;   <=>?@^_`{|}~'
asclen=${#ascstring} # modulo ascstring
#...
r=$(openssl rand 100000 | sha1sum) # generates 40 hex sequence
#...
for i in {0..38..2}
do
    v=${r:i:2} ; echo -n ${ascstring:$[ 0x$v % $asclen]:1}
done
echo
# ...

它使用各种定义,ascstring但显示的定义偶尔会导致问题。大多数情况下没关系:

$ ./password-gen.sh 
`?OCw&a|746|SRm8b&c=

$ ./password-gen.sh 
eE?R%3NdUjSpd<)wPuBV

$ ./password-gen.sh 
0X8)p8hPobt$x@iGy?!I

$ ./password-gen.sh 
P7LD;p<^lX1d87;{V4S$

但偶尔:

$ ./password-gen.sh 
5w@$ypassword-gen.sh@)A|l`06B(50f7

*如果我从中删除ascstring似乎永远不会发生。我想知道发生了什么以及如何解决这个问题(不减少熵)?

谢谢。

4

1 回答 1

5

您应该引用要回显的字符串:

...
echo -n "${ascstring:$[ 0x$v % $asclen]:1}"
于 2012-07-19T06:41:02.627 回答