如何在Bash中迭代单词列表? #/bin/bash input=“usr/share/dict/words” 而IFS=读取-r行 做 如果[${line:0:1}==“a”]] 然后 key=“$(openssl dgst-sha1-hmac'$line'whisky.jpg)” 如果[$key==“G11a600a8dad2Gb98f18cefec4315a6c92777292”] 然后 回音“$line” fi fi 完成[$line==a*]
这就是我目前所学的课程。说明是编写一个简短的Bash脚本,逐行阅读单词列表,过滤掉任何不以字母“a”开头的单词,然后运行以查看任何给定单词的out是否与为图像whisky.jpg提供的所需摘要匹配,因为其中一个单词是它的关键如何在Bash中迭代单词列表? #/bin/bash input=“usr/share/dict/words” 而IFS=读取-r行 做 如果[${line:0:1}==“a”]] 然后 key=“$(openssl dgst-sha1-hmac'$line'whisky.jpg)” 如果[$key==“G11a600a8dad2Gb98f18cefec4315a6c92777292”] 然后 回音“$line” fi fi 完成[$line==a*],bash,Bash,这就是我目前所学的课程。说明是编写一个简短的Bash脚本,逐行阅读单词列表,过滤掉任何不以字母“a”开头的单词,然后运行以查看任何给定单词的out是否与为图像whisky.jpg提供的所需摘要匹配,因为其中一个单词是它的关键 用于过滤以“a”开头的单词的比较语句可以正确地运行并打印出来,但是我过去从未使用过bash脚本,因此我不确定在尝试运行每一行/单词以找到匹配的输出时出错了什么。现在它似乎是无限期的,直到我退出它,没有可见的输出。这里有几个问题。按顺序,从第二行开始: #!/bin/bash
用于过滤以“a”开头的单词的比较语句可以正确地运行并打印出来,但是我过去从未使用过bash脚本,因此我不确定在尝试运行每一行/单词以找到匹配的输出时出错了什么。现在它似乎是无限期的,直到我退出它,没有可见的输出。这里有几个问题。按顺序,从第二行开始:
#!/bin/bash
input="usr/share/dict/words"
while IFS= read -r line
do
if [[ ${line:0:1} == "a" ]]
then
key="$(openssl dgst -sha1 -hmac '$line' whiskey.jpg)"
if [[ $key == "G11a600a8dad2Gb98f18cefec4315a6c92777292" ]]
then
echo "$line"
fi
fi
done < "$input"
由于此路径不以“/”开头,因此它将被视为相对于当前目录。在前面加一个“/”。下一步:
input="usr/share/dict/words"
在这里,“$line”
周围的单引号防止变量被扩展(它只是被视为一个文本字符串)。使用双引号代替。请注意,通常引号不会嵌套--也就是说,在另一个双引号字符串中没有双引号字符串--但在本例中,$()
创建了一个新的引号上下文,因此嵌套可以工作。下一步:
key="$(openssl dgst -sha1 -hmac '$line' whiskey.jpg)"
这里的shell语法很好,问题是$key
类似于“HMAC-SHA1(whisky.jpg)=G11a600a8dad2Gb98f18cefec4315a6c92777292”,并且比较字符串只匹配该字符串的结尾。但是在[[]]
内部,==
操作符可以进行通配符比较,因此如果[[$key==*“G11a600a8dad2Gb98f18cefec4315a6c92777292”],则添加一个通配符:
最后,脚本在找到匹配项后不会退出,它将搜索Word文件的其余部分以查找更多匹配项。因此,当找到匹配项时,在echo
之后添加exit
以下是这些修复的结果:
if [[ $key == "G11a600a8dad2Gb98f18cefec4315a6c92777292" ]]
引用/转义看起来有点奇怪,但是您可以看到,$line
没有得到扩展,并且$key
包含“HMAC-SHA1(whisky.jpg)=”以及散列。这里有几个问题。按顺序,从第二行开始:
#!/bin/bash
input="usr/share/dict/words"
while IFS= read -r line
do
if [[ ${line:0:1} == "a" ]]
then
key="$(openssl dgst -sha1 -hmac '$line' whiskey.jpg)"
if [[ $key == "G11a600a8dad2Gb98f18cefec4315a6c92777292" ]]
then
echo "$line"
fi
fi
done < "$input"
由于此路径不以“/”开头,因此它将被视为相对于当前目录。在前面加一个“/”。下一步:
input="usr/share/dict/words"
在这里,“$line”
周围的单引号防止变量被扩展(它只是被视为一个文本字符串)。使用双引号代替。请注意,通常引号不会嵌套--也就是说,在另一个双引号字符串中没有双引号字符串--但在本例中,$()
创建了一个新的引号上下文,因此嵌套可以工作。下一步:
key="$(openssl dgst -sha1 -hmac '$line' whiskey.jpg)"
这里的shell语法很好,问题是$key
类似于“HMAC-SHA1(whisky.jpg)=G11a600a8dad2Gb98f18cefec4315a6c92777292”,并且比较字符串只匹配该字符串的结尾。但是在[[]]
内部,==
操作符可以进行通配符比较,因此如果[[$key==*“G11a600a8dad2Gb98f18cefec4315a6c92777292”],则添加一个通配符:
最后,脚本在找到匹配项后不会退出,它将搜索Word文件的其余部分以查找更多匹配项。因此,当找到匹配项时,在echo
之后添加exit
以下是这些修复的结果:
if [[ $key == "G11a600a8dad2Gb98f18cefec4315a6c92777292" ]]
引用/转义看起来有点奇怪,但是您可以看到,$line
没有得到扩展,$key
包含“HMAC-SHA1(whisky.jpg)=”以及散列。如果告诉您使用shasum
命令,为什么要使用openssl
?我也不明白单词的shasum和图像文件的shasum有什么关系。你应该对文件名或文件内容进行求和吗?它实际上是永远运行,还是只是缓慢运行?特别是如果文件很大,则计算每个哈希值需要一点时间,因此重复多次可能需要一点时间。建议:在内部测试中添加else echo“Nope,$line不是吗”
,这样您就可以看到每个测试的发生。这与您的Bash问题没有直接关系,但是:您误用了术语“key”和“digest”。这里的“键”是字典中的单词(=行)G11a600a8dad2Gb98f18cefec4315a6c92777292是一个“HMAC”。错误的标题:Write me a bruteforce script
更合适……你可以简化[${line:0:1}==“a”]
[$line==a*]
如果你被告知要使用shasum
命令,为什么要使用openssl
?我也不明白单词的shasum和图像文件的shasum有什么关系。你应该对文件名或文件内容进行求和吗?它实际上是永远运行,还是只是缓慢运行?特别是如果文件很大,则计算每个哈希值需要一点时间,因此重复多次可能需要一点时间。建议:在内部测试中添加else echo“Nope,$line不是吗”
,这样您就可以看到每个测试的发生。这与您的Bash问题没有直接关系,但是:您误用了术语“key”和“digest”。这里的“键”是字典中的单词(=行)G11a600a8dad2Gb98f18cefec4315a6c92777292是一个“HMAC”。错误的标题:给我写一个暴力脚本更合适……你可以简化[${line:0:1}==“a”]]
->[$line==a*]