2016-08-21 172 views
1

我目前正在使用bash脚本测试一个简单的字典攻击。我已经简单地键入以下命令编码我的密码“蛇”与sha256sum:Bash脚本IF语句不起作用

echo -n Snake | sha256sum 

这产生如下:

aaa73ac7721342eac5212f15feb2d5f7631e28222d8b79ffa835def1b81ff620 *- 

我然后复制粘贴的散列串入程序,但脚本没有做到打算做的事情。这个脚本(请注意,我创建了一个测试字典文本文件,该文件只包含6行):

echo "Enter:" 
read value 

cat dict.txt | while read line1 
    do 
      atax=$(echo -n "$line1" | sha256sum) 

      if [[ "$atax" == "$value" ]]; 
      then 
        echo "Cracked: $line1" 
        exit 1 
      fi 

    echo "Trying: $line1" 

    done 

结果:

Trying: Dog 
Trying: Cat 
Trying: Rabbit 
Trying: Hamster 
Trying: Goldfish 
Trying: Snake 

代码应显示“破解:蛇”并终止时,它将散列字符串与单词“Snake”进行比较。我哪里错了?

编辑:该错误确实是我的文本文件中的DOS行。我做了一个unix文件和校验和匹配。感谢大家。

+0

后也顺便说一句,运行'bash的-x yourscript'会给你什么是这里发生了一个更好的想法。 –

+2

......另一方面,'echo -n'实际上并不是很好的形式。'echo'的POSIX规范将'-n'描述为“未指定”,这意味着实现可以在给出该参数时做任何事情 - 它可以在其输出上抑制换行,但也可以在输出上打印“-n”并且符合要求 - 并且在启用“xpg_echo”和“posix”选项的情况下运行时,bash的行为就是如此。 –

+0

...参见http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html中的上述规范,特别是APPLICATION USAGE部分,该部分使用'printf'提供替代建议来模拟常见的'echo'用法。 –

回答

1

夫妇的问题 - 变量名称没有设置任何地方 - 你的意思是价值?也更好的形式来使用重定向代替cat

while read ...; do ... done <dict.txt 

变量由while循环管道中的设定是不是在父shell可没有倒过来,因为我误之前说的 - 这不是一个问题,这里虽然

+2

不是我的downvote。确实没有设置“名称”。子壳不能访问外壳中设置的变量。 (反之亦然。) – kojiro

+0

嘿,谢谢你的回复。我尝试了你的建议,但没有奏效。编辑:我没有downvote。 – Bane

1

一个问题是,正如pakistanprogrammerclub指出的那样,您从未初始化name(而不是line1)。

另一个问题是,sha256sum不只是打印出校验和,还有*-(意思是“我从二进制模式的标准输入读取文件”)。

我不知道是否有一个干净的方式得到公正校验—有可能是,但我不能找到它—但你至少可以写这样的事:

atax=$(echo -n "$name" | sha256sum | sed 's/ .*//') 

(使用sed剥离空间中的所有东西)。

+1

或者您可以使用'awk'{print $ 1}''或调用'cut'。 – kojiro

0

感谢您的回复。 Pakistanprogrammerclub指出了一个很好的错误。 “名称”变量不应该在那里。我已经纠正,并使用“sed的”和“AWK”命令也试过了,但它仍然产生相同的结果:

echo "Enter:" 
read value 

cat dict.txt | while read line1; 
do 
     atax=$(echo -n "$line1" | sha256sum | sed 's/ .*//') 

     if [[ "$atax" = "$value" ]]; 
     then 
       echo "Cracked: $line1" 
       exit 1 

     fi 

echo "Trying: $line1" 

done 
+0

这应该是对问题的编辑,而不是回答,除非它实际上提供了解决方案。 –

+0

顺便说一句,你知道你的'dict.txt'是一个UNIX文件吗?如果它有DOS换行符,那就是你的错误。 –

+0

谢谢你的回应Charles,对不起,我是一个新来的人。我尝试了bash -x yourscript,而你是对的。校验和是不同的,我认为这是因为我的文本文件。我现在会解决这个问题,看看会发生什么。 – Bane

0

可能是一个切ñ粘贴错误 - 添加回声后的第一次读

echo "value \"$value\"" 

atax设置

echo "line1 \"$line1\" atax \"$atax\""