下面是一个简单的bash脚本,用于测试rar文件中的少量密码。 当密码包含特殊字符(!)时,我看到选项(-p)完全用quote(')解析。
#!/bin/bash -x
pwd=`echo Sei{0..9}{0..9}b{0..9}axq!zx`
#pwd=Sei03b4axq!zx
file="test.rar"
for eachpwd in $pwd
do
eval unrar x "$file" -p"$eachpwd" id 2>/dev/null 1>/dev/null
c=$?
if [ $c = 0 ]
then echo "Success"
exit
fi
echo $eachpwd $c
done
输出
+ for eachpwd in '$pwd'
+ eval unrar x test.rar '-pSei49b4axq!zx' id
+ c=10
+ '[' 10 = 0 ']'
+ echo 'Sei49b4axq!zx' 10
问题
如何进行编码,在eval期间,我没有得到unrar x test.rar '-pSei49b4axq!zx' id
而是将unrar x test.rar -pSei49b4axq!zx id
作为评估表达式
更新1
尝试下面的代码,但仍然在-p选项上的引号(!)拒绝让步。
passwords=( Sei{0..9}{0..9}b{0..9}axq!zx )
file=test.rar
for password in "${passwords[@]}"; do
if unrar x "$file" -p"$password" id 2>/dev/null 1>/dev/null; then
echo "Success"
exit
else
echo $password failed.
fi
done
结果
+ for password in '"${passwords[@]}"'
+ unrar x test.rar '-pSei21b0axq!zx' id
+ echo 'Sei21b0axq!zx' failed.
Sei21b0axq!zx failed.
+ for password in '"${passwords[@]}"'
+ unrar x test.rar '-pSei21b1axq!zx' id
请注意我正在使用bash shell执行。
答案 0 :(得分:2)
对于正在发生的事情,有几种可能的解释,其中没有一个值得探索,因为您不需要使用eval
。此外,最好使用数组来保存密码,或者直接将大括号表达式放在for
循环中,而不是创建单个字符串。
# I use single quotes on the very small chance history expansion
# is enabled, to protect the !. You almost certainly can drop them.
passwords=( Sei{0..9}{0..9}b{0..9}'axq!zx' )
for password in "${passwords[@]}"; do
if unrar x "$file" -p "$eachpwd" id 2>/dev/null 1>/dev/null; then
echo "Success"
exit
fi
done
答案 1 :(得分:1)
您所看到的只是set -x
导致Bash执行的输出的常规消歧。 (请注意密码在echo
的{{1}}输出中也是单引号。)问题(如果有的话)与调试输出中的单引号无关。
一般来说,你应该引用更多,而不是更少。除非您特别要求Bash对值执行通配符扩展和字拆分,否则请在变量周围使用双引号。
set -x
此外,反引号中的echo "$password failed"
为useless。已注释掉的作业更好,但确实如此;使用单引号来确保你得到一个文字字符串而不是别的。
echo
并且,正如其他人已经指出的那样,pwd='Sei49b4axq!zx'
不仅是多余的,而且可能是你遇到问题的原因(如果你确实是这样;你的问题实际上并没有解释你试图解决的问题)解决!)