2016-08-30 3 views
0

5文字の単語を生成する単語ループを作成しようとしていますが、テストはテストに反しています。そうでない場合は、次の単語が生成されます。しかし、現在、それは一度にすべての53200個の単語を生成している、私は一度にBash Word生成ループ

#!/bin/bash 
i=1 
for n in $(seq 0 54000) 
do 
    IFS=$'' 
    hash="hash" 
    myword=$(echo {a..z}{a..z}{a..z}{a..z}{a..z} | awk '{print $1}') 
    test=$(echo -n "$myword" | awk '{print $1}') 
    if [ "$test" == "$hash" ] 
    then 
     echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! The password is  $test1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" 
     break 
    else 
     echo "Password $myword is incorrect" 
     echo "$test" 
    fi 
done 

で、これはループ内で1つの単語であることを「myword」をしたいです。

+0

..あなたが行くありループ全体 –

+0

を表示:)のUnix&Linux上 – Jolan

+1

同様の質問:http://unix.stackexchange.com/questions/243802/combination-generator-with-memory-and-resource-management – Aaron

答えて

0

実際にはiまたはnのいずれも使用していません。あなたが本当に反復したいものは、可能な5文字の組み合わせです。あなたが反復を開始する前に、それが生成する完全なリストを生成するのに非常に長い時間がかかりますので、これは本当に、お勧めしません。

hash="hash" 
for myword in {a..z}{a..z}{a..z}{a..z}{a..z}; do 
    test=$(echo -n "$myword" | awk '{print $1}') 
    if [[ $test = $hash ]]; then 
     break 
    else 
     ... 
    fi 
done 

複数の別個の塊に反復を壊す方が良いでしょう。全体的に速くなるわけではありませんが、少なくともメモリー上に11,881,376個の可能性をすべて生成することなく、実際の計算を開始することができます。

for a in {a..z}; do 
    for b in {a..z}; do 
    for c in {a..z}; do 
     for d in {a..z}; do 
     for e in {a..z}; do 
      myword="$a$b$c$d$e" 
      test1=... 
      if [[ ... ]]; then 
       break 5 
      fi 
     done 
     done 
    done 
    done 
done 

しかし、最高のアイデアは、一般的なデータ処理ではなく、bashのために設計された言語でこれを行うことであろう。特に、パスワードごとに新しいプログラムを作成するのではなく、SHA-256チェックサムを計算するためのライブラリを持つ言語。

+0

ありがとうございますあなたの最高: – Jolan

+0

これをどのように停止させるのですか? – Jolan

+0

スクリプトがブレークで終了しない、または終了する1 – Jolan