【发布时间】:2016-04-08 05:13:55
【问题描述】:
我正在尝试构建一个脚本,我需要使用以下参数创建密码生成器:
- 必须至少有 8 个字符,但不能超过 16 个字符。
- 必须至少包含 1 个数字 (0-9)。
- 必须至少包含 1 个小写字母。
- 必须至少包含 1 个大写字母。
- 必须只包含
@ # $ % & * + - =中的一个且仅一个
我有两个想法:
第一个:
#!/bin/bash
#
#Password Generator
#
#
Upper=('A''B''C''D''E''F''G''H''I''J'K''L''M''N''O''P''Q''R''S''T''U''V''W''X''Y''Z')
Lower=('a''b''c''d''e''z''f''g''h''i''j''k''l''m''o'''p''q''r''s''t''u''v''w''x''y''z')
Numbers=('1''2''3''4''5''6''7''8''9')
SpecialChar=('@''#''$''%''&''*''+''-''=')
if [ S# -eq 0 ] ; then
Pwlength=`shuf -i 8-16 -n 1`
Password=`< /dev/urandom tr -dc A-Za-z0-9$SpecialChar | head -c $Pwlength`
echo "Random Password is being generated for you"
sleep 5
echo "Your new password is : $Password"
exit
问题是我得到了我什至没有定义的字符?
第二个想法:
for((i=0;i<4;i++))
do
password=${Upper[$random % ${#Lower[@]} ] }
password=${Upper[$random % ${#Upper[@]} ] }
password=${Upper[$random % ${#Number[@]} ] }
password=${Upper[$random % ${#SpecialChar[@]} ] }
done
由于某种原因,它们都不起作用;/
【问题讨论】:
-
是
$RANDOM,不是$random。 -
$SpecialChar不会扩展到数组"${SpecialChar[@]}"的内容,并且因为它包含 shell 元字符,所以需要像我展示的那样使用双引号,以便 shell 不对这些元字符做出反应(展开任何通配符匹配等)。 -
真的,
sleep 5的意义何在?? -
无论如何,使用单个字符串的数组是非常没有意义的。去掉引号后,
'A''B''C'等价于'ABC'。 -
:~/bin> UPPER=("A""B""C""D""E""F""G""H""I""J""K"" L""M""N""O""P""Q""R""S""T""U""V""W""X""Y""Z")
标签: arrays bash password-generator