Bash, openssl, странное поведение при выходе - PullRequest
0 голосов
/ 09 июня 2018

Я пишу скрипт, который должен выполнять атаку по словарю на текстовый файл, передаваемый в качестве аргумента, зашифрованного с помощью openssl.Вот что я написал:

#!/bin/bash
# written by Cosimo Colaci

passwords=( $(cat italian.txt) ) # italian.txt is a list of words

for word in ${passwords[@]}
  do
    openssl enc -d -aes-128-cfb1 -in "$1" -k $word 2>/tmp/err
    pid=$$
    wait $pid
    if [ -s /tmp/err ]
    then
      continue
    else
      openssl enc -d -aes-128-cfb1 -in "$1" -k $word;
      break;
    fi
  done

Я также пытался

for word in ${passwords[@]}
  do
    openssl enc -d -aes-128-cfb1 -in "$1" -k $word &>/dev/null
    exitstatus=$?
    if [ $exitstatus -ne 0 ]
    then
      continue
    else
      openssl enc -d -aes-128-cfb1 -in "$1" -k $word;
      break;
    fi
  done

Проблема в том, что на некоторых циклах состояние выхода равно 0, даже если расшифровка не удалась, как я вижу, запустив: bash -x ./crack_italian.sh filetodecript.txt но та же команда в терминале ведет себя как положено и завершается неудачно.

1 Ответ

0 голосов
/ 09 июня 2018
while read -r word; do
    if openssl enc -d -aes-128-cfb1 -in "$1" -k "$word" >openssl.out 2>&1
    then
        cat openssl.out
        break
    fi
done <italian.txt

rm -f openssl.out
  • Вам не нужно считывать файл в массив.
  • Вы можете использовать статус выхода напрямую в операторе if.Обратите внимание, что во втором примере присвоение $? для exitstatus меняет $?.
  • Расширения переменных должны заключаться в двойные кавычки.

Немного короче:

while read -r word; do
    openssl enc -d -aes-128-cfb1 -in "$1" -k "$word" >openssl.out 2>&1 &&
    { cat openssl.out; break; }
done <italian.txt

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