Как мне сжать мой bash скрипт в 5 для циклов? - PullRequest
2 голосов
/ 07 января 2020

Я пытаюсь сжать сценарий bash, чтобы он не перезапускал одни и те же коды снова и снова. но, по мнению некоторых людей, я могу запустить линию на test, имея в виду все 4 шифрования на 1 go.

помогите, я не знаю, что они имеют в виду.
Код Гор:

#!/bin/bash

LIST1=(K F L W )
LIST2=(8 2 9 2 )
LIST3=(x b s v )
LIST4=("~" "-" "[" "*" )
LIST5=("$" "+" "]" "%" )

encr1=".8742cNKlzqQ8Mgjip/Fg1"
salt1="bCgxj8Yt"
encr2="31HvJ8Iinxk2k"
salt2="31"
encr3="AyPVCzU.ourSwFdL3N6/YP9RRfIwwKZPNrnt0/yn5vB"
salt3="klPjs90j"
encr4="Cd9AjUI4nGglIcP3MByrZUnu.hHBJc7.eR0o/v0A1gu0/6ztFfBxeJgKTzpgoCLptJS2NnliZLZjO40LUseED/"
salt4="8899Uidd"

for i in "${LIST1[@]}"
  do
   for j in "${LIST2[@]}"
    do
    for k in "${LIST3[@]}"
     do
      for l in "${LIST4[@]}"
        do
        for a in "${LIST5[@]}"
            do     
            test="$(mkpasswd -m MD5 "$i$j$k$l$a" -s $salt1 | cut -d"$" -f4)"
            if [ "$test" == "$encr1" ] ; then
            echo " MD5 Salted Hash Password is: $i$j$k$l$a"
            echo " Salt: "$salt1""

for i in "${LIST1[@]}"
  do
   for j in "${LIST2[@]}"
    do
    for k in "${LIST3[@]}"
     do
      for l in "${LIST4[@]}"
        do
        for a in "${LIST5[@]}"
            do
   test="$(mkpasswd -m SHA-256 "$i$j$k$l$a" -s $salt3 | cut -d"$" -f4)"
    if [ "$test" == "$encr3" ] ; then
            echo " SHA-256 Salted Hash Password is: $i$j$k$l$a"
            echo " Salt: "$salt3""
        fi
        done
       done
      done
    done
done

for i in "${LIST1[@]}"
  do
   for j in "${LIST2[@]}"
    do
    for k in "${LIST3[@]}"
     do
      for l in "${LIST4[@]}"
        do
        for a in "${LIST5[@]}"
            do
   test="$(mkpasswd -m SHA-512 "$i$j$k$l$a" -s $salt4 | cut -d"$" -f4)"
    if [ "$test" == "$encr4" ] ; then
            echo " SHA-512 Salted Hash Password is: $i$j$k$l$a"
            echo " Salt: "$salt4""

for i in "${LIST1[@]}"
  do
   for j in "${LIST2[@]}"
    do
    for k in "${LIST3[@]}"
     do
      for l in "${LIST4[@]}"
        do
        for a in "${LIST5[@]}"
            do
    test="$(mkpasswd -m des "$i$j$k$l$a" -s $salt2)"
    if [ "$test" == "$encr2" ] ; then
            echo " DES Salted Hash Password is: $i$j$k$l$a"
            echo " Salt: "$salt2""
            exit
        fi
        done
       done
      done
    done
done
        fi
        done
       done
      done
    done
done


        fi
        done
       done
      done
    done
done


Вывод все еще как-то отображается так, как я хотел: Output

Ответы [ 3 ]

5 голосов
/ 07 января 2020

Поскольку вы используете массивы LIST1 ... LIST5 только для конструкций 5 × for, я бы заменил их расширениями скобок. Таким образом, вы получите только один l oop.

Вместо ручного перечисления и проверки пар переменных, таких как encr1 и salt1, используйте три массива encr, salt и algo (алгоритм, который вы указали ранее). Затем вы можете использовать al oop для перебора всех этих троек вместо того, чтобы писать каждую проверку вручную.

#! /bin/bash
n=4
encr=(
    ".8742cNKlzqQ8Mgjip/Fg1"
    "31HvJ8Iinxk2k"
    "AyPVCzU.ourSwFdL3N6/YP9RRfIwwKZPNrnt0/yn5vB"
    "Cd9AjUI4nGglIcP3MByrZUnu.hHBJc7.eR0o/v0A1gu0/6ztFfBxeJgKTzpgoCLptJS2NnliZLZjO40LUseED/"
)
salt=(bCgxj8Yt 31 klPjs90j 8899Uidd)
algo=(MD5 SHA-256 SHA-512 des)
for candidate in {K,F,L,W}{8,2,9}{x,b,s,v}{'~','-','[','*'}{'$','+',']','%'}; do
    for (( i = 0; i < n; i++ )); do
        test="$(mkpasswd -m "${algo[i]}" "$candidate" -s "${salt[i]}")"
        if [ "$test" = "${encr[i]}" ]; then
            echo " ${algo[i]} Salted Hash Password is: $candidate"
            echo " Salt: ${salt[i]}"
        fi
    done
done

Здесь я удалил дублированный 2 из кандидатов на второй символ. Спасибо Гордону Дэвиссону за указание на это.

Кстати: я использовал имена переменных из вашего оригинального сценария. Однако было бы лучше назвать массив хэшей чем-то отличным от encr. Хеширование и шифрование отличаются - точно так же, как измельчение листа бумаги и последующая сортировка фрагментов отличаются от блокировки всей бумаги.

3 голосов
/ 07 января 2020

Вы можете l oop по всем кандидатам в одном l oop с комбинаторным расширением {}:

for candidate in {K,F,L,W}{8,2,9,2}{x,b,s,v}{\~,-,[,\*}{$,+,],%}; do
    ...
done

Обратите внимание, что это не POSIX, но работает в bash и zsh.

2 голосов
/ 07 января 2020

В текущем скрипте все ваши циклы и блоки if странно вложены друг в друга. Простой способ сделать это - просто иметь один набор циклов, который генерирует пароли-кандидаты, и для каждого теста-кандидата все 4 хэша:

#!/bin/bash

LIST1=(K F L W )
LIST2=(8 2 9 2 )
LIST3=(x b s v )
LIST4=("~" "-" "[" "*" )
LIST5=('$' "+" "]" "%" )

encr1=".8742cNKlzqQ8Mgjip/Fg1"
salt1="bCgxj8Yt"
encr2="31HvJ8Iinxk2k"
salt2="31"
encr3="AyPVCzU.ourSwFdL3N6/YP9RRfIwwKZPNrnt0/yn5vB"
salt3="klPjs90j"
encr4="Cd9AjUI4nGglIcP3MByrZUnu.hHBJc7.eR0o/v0A1gu0/6ztFfBxeJgKTzpgoCLptJS2NnliZLZjO40LUseED/"
salt4="8899Uidd"

# Loop over characters to generate candidate passwords
for i in "${LIST1[@]}"; do
  for j in "${LIST2[@]}"; do
    for k in "${LIST3[@]}"; do
      for l in "${LIST4[@]}"; do
        for a in "${LIST5[@]}"; do

          # For this candidate...
          candidate="$i$j$k$l$a"

          # test whether it matches the MD5 hash
          test="$(mkpasswd -m MD5 "$candidate" -s "$salt1" | cut -d'$' -f4)"
          if [ "$test" = "$encr1" ] ; then
            echo " MD5 Salted Hash Password is: $candidate"
            echo " Salt: $salt1"
          fi

          # test whether it matches the SHA-256 hash
          test="$(mkpasswd -m SHA-256 "$candidate" -s "$salt3" | cut -d'$' -f4)"
          if [ "$test" = "$encr3" ] ; then
            echo " SHA-256 Salted Hash Password is: $candidate"
            echo " Salt: $salt3"
          fi

          # test whether it matches the SHA-512 hash
          test="$(mkpasswd -m SHA-512 "$candidate" -s "$salt4" | cut -d'$' -f4)"
          if [ "$test" = "$encr4" ] ; then
            echo " SHA-512 Salted Hash Password is: $candidate"
            echo " Salt: $salt4"
          fi

          # test whether it matches the DES hash
          test="$(mkpasswd -m des "$candidate" -s "$salt2")"
          if [ "$test" = "$encr2" ] ; then
            echo " DES Salted Hash Password is: $candidate"
            echo " Salt: $salt2"
          fi
        done
      done
    done
  done
done

Обратите внимание, что при этом пароли DES и SHA-512 будут найдены дважды, потому что "2" указан дважды в LIST2.

. Этот подход немного менее эффективен, чем мог бы быть, потому что он продолжает проверять совпадения с хешами, которым уже найдены совпадения. Это может быть исправлено несколькими способами, но все они усложнят код больше, чем я хочу здесь разобраться. В обычной ситуации, когда вы ищете только одно совпадение, вы можете просто выйти из циклов, как только найдете его.

Кстати, я исправил оператор сравнения (как указал @Jens, = является стандартным в выражении [ ]) и в кавычках (соли не были правильно указаны, а использование буквального выражения $ в двойных кавычках странно даже тогда, когда это допустимо).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...