Bash、openssl、退出状态的奇怪行为

Bash, openssl, strange behavior on exit status

我正在编写一个脚本,该脚本应该对作为使用 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 "" -k $word 2>/tmp/err
    pid=$$
    wait $pid
    if [ -s /tmp/err ]
    then
      continue
    else
      openssl enc -d -aes-128-cfb1 -in "" -k $word;
      break;
    fi
  done

我也试过了

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

问题是在某些 cicles 上,即使解密失败,退出状态也是 0,正如我通过启动看到的那样: bash -x ./crack_italian.sh filetodecript.txt 但是相同的命令在终端中按预期运行并失败。

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

rm -f openssl.out