2016-04-08 28 views
0

我想建立一個腳本,我需要創建一個具有以下參數的密碼生成器:如何在聲明數組使用RANDOM命令

  • 必須至少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 

對於他們的一些原因,非正常工作;「 - 」字符到SpecialChar結束/

+0

它是'$ RANDOM',而不是'$ random'。 – rici

+0

'$ SpecialChar'不會擴展到數組''SpecialChar [@]}''的內容,並且因爲它包含了shell元字符,所以它需要像雙引號一樣引用,以便shell不響應這些元字符(展開任何通配符匹配等)。 – tripleee

+0

真的,「睡眠5」有什麼意義? – tripleee

回答

0

在你的第一個例子中,移動。我認爲這個定義會導致允許將「+」改爲「=」(即傳遞給tr讀取的值爲「+ - =」),這說明了您不期望的字符。或者,將「 - 」替換爲「_」。

So, try a definition like: 
SpecialChar=('@''#''$''%''&''*''+''=''-') 
+0

你對這個特殊角色的位置是正確的。我做了一個改變,現在它工作。關於另一種方法,我想了解我必須引用哪個部分? password =「$ {Upper [$ random%$ {#Upper [@]}」]} – isRealistic

+0

我想使用RANDOM來混合數組中的字符,並給我一個字符,它將被添加到「Password」變量中。使它在所有數組中運行四次,所以我可以有16個字符 – isRealistic

0

你的第一次嘗試中存在以下問題:

  • 您正在使用的陣列包含單一字符串。粘貼'A''B''C'相當於'ABC'。簡單地將這些轉換爲標量變量可能是最簡單的修復。
  • 您不是quoting your variables
  • 您聲明Upper,LowerNumbers,但從未使用它們。
  • 將變量用於您只曾使用過的東西(或更少:-)無論如何都是可疑的。
  • 正如@KevinO所指出的那樣,短劃線在tr中有特殊的含義,如果你想直接匹配它,則需要首先或最後一個。

最重要的是,sleep 5似乎沒有任何有用的用途,並且如果它尚未出現,它將開始惱人。如果你真的想要一臺較慢的電腦,我肯定這裏有人願意交易。

你的第二次嘗試中存在以下問題:

  • Bash中的特殊變量$RANDOM在所有大寫拼寫。
  • 您正試圖對未定義的(未加引號的!)字符數組進行模運算。%之後的除數需要是一個整數。您可以將字符代碼轉換爲整數,但這有點令人痛苦,並且不清楚您希望得到的結果是什麼。

在固定的第一次嘗試一個快速嘗試將

Password=$(< /dev/urandom tr -dc '[email protected]#$%&*+=-' | 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 [email protected]#$%&*+= 
HERE 
+0

我聲明瞭一個數組,因爲後來我必須使用它來對密碼進行驗證密碼規則 – isRealistic

+0

然後在初始化時需要在各個元素之間有空格。你的代碼並不顯示你如何使用數組,所以不幸的是,我不知道如何修復這部分代碼。無論如何'tr'都需要一個字符串。 – tripleee

+0

如果您當前的代碼使用數組,它並不是真的,並且將其轉換爲使用常規標量可能仍然是最簡單的修復。 – tripleee

0
  • 前面已經提到,這將是更清潔和更容易直接使用字符串處理的字符的列表。處理數組中的特殊字符可能會導致副作用(例如,使用'*'字符獲取當前目錄中的文件列表)。另外,數組可能很難作爲函數參數傳遞)。

    ALPHA_LOW="abcdefghijklmnopqrstuvwxyz" 
    
    # Then simply access the char in the string at the ith position 
    CHAR=${ALPHA_LOW:$i:1} 
    
  • 您可以生成從下例上的情況。

    ALPHA_UP="`echo \"$ALPHA_LOW\" | tr '[:lower:]' '[:upper:]'`" 
    
  • 其中包含的隨機數的變量是$RANDOM(大寫字母)。

  • sleep 5是不必要的。

  • 您需要找到一種方法來保留每種字符類型的出現次數。欲瞭解更多信息,我寫了一個完整的腳本來做你所描述的here

+0

我已經打開了整個腳本的另一篇文章http://stackoverflow.com/questions/36524872/check-single-character-in-array-bash-for-password-generator?noredirect=1#comment60655086_36524872 – isRealistic