我正在尝试构建一个脚本,我需要使用以下参数创建密码生成器:
@ # $ % & * + - =
中的一个且仅一个
我有两个想法:
第一个:
#!/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
由于某些原因,他们没有工作; /
答案 0 :(得分:0)
在您的第一个示例中,移动&#34; - &#34;字符到SpecialChar的结尾。我认为你所拥有的定义会导致允许&#34; +&#34;到&#34; =&#34; (即,传递给tr的值读作&#34; + - =&#34;),它代表了你不期望的字符。或者,替换&#34; - &#34;用&#34; _&#34;。
So, try a definition like:
SpecialChar=('@''#''$''%''&''*''+''=''-')
答案 1 :(得分:0)
您的首次尝试存在以下问题:
'A''B''C'
相当于'ABC'
。简单地将这些转换为标量变量可能是最简单的修复。Upper
,Lower
和Numbers
,但从不使用它们。tr
中具有特殊含义,如果您想要字面上匹配,则需要是第一个或最后一个。最重要的是,sleep 5
似乎没有任何有用的用途,如果还没有,它会开始惹恼你。如果你真的想要一台较慢的电脑,我相信这里有人愿意交易。
您的第二次尝试存在以下问题:
$RANDOM
拼写为全部大写。%
之后的除数需要是一个整数。你可以将字符代码转换为整数,但这有点痛苦,而且你对结果的期望还不够明确。快速尝试修复第一次尝试将是
Password=$(< /dev/urandom tr -dc 'A-Za-z0-9@#$%&*+=-' | head -c $(shuf -i 8-16 -n 1))
如果要验证生成密码的某些属性,我仍然不明白为什么需要数组。
while read -r category expression; do
case $Password in
*[$expression]*) continue;;
*) echo "No $category"; break;;
esac
done <<'____HERE'
lowercase a-z
uppercase A-Z
numbers 0-9
specials -@#$%&*+=
HERE