我是一个糟糕的bash脚本初学者,我希望有人可以帮我解决这个问题。
Prey项目独立脚本出现问题。有一条线应该发送一封电子邮件,显然它没有正确格式化。
response=`mailsender -f "$mail_from" -t "$mail_to" -u "$complete_subject" \
-s $smtp_server -a $file_list -o message-file="$trace_file.msg" \
tls=auto username=$smtp_username \
password=\`decrypt \"$smtp_password\"\``
如果mailsender是Brandon Zehm的PERL sendEmail脚本的别名,$ smtp_password是密码的无意义base64编码,解密为:
decrypt() {
echo "$1" | openssl enc -base64 -d
}
所以有人能告诉我脚本有什么问题吗?作为参考,如果我只用明文密码替换整个解密部分,它可以正常工作。即:
response=`mailsender -f "$mail_from" -t "$mail_to" -u "$complete_subject" \
-s $smtp_server -a $file_list -o message-file="$trace_file.msg" \
tls=auto username=$smtp_username password=actual_password`
答案 0 :(得分:2)
最简单的做法是避免反引号,而是使用$()
- 它们干净地嵌套,不需要特殊的转义:
response=$(Documents/Projects/Shell\ Scripting/printargs -f "$mail_from" \
-t "$mail_to" -u "$complete_subject" -s $smtp_server -a $file_list \
-o message-file="$trace_file.msg" tls=auto username=$smtp_username \
password="$(decrypt "$smtp_password")")
答案 1 :(得分:0)
我认为这个剧本与你同构:
decrypt()
{
echo "$1" | tr 'a-z' 'A-Z'
}
xxx=`echo xxx=yyy pass=\`decrypt \"xyz abc\"\``
echo "$xxx"
使用'sh -x xxx
'运行时(其中'sh'伪装成'bash'):
$ sh -x xxx
+++ decrypt '"xyz' 'abc"'
+++ echo '"xyz'
+++ tr a-z A-Z
++ echo xxx=yyy 'pass="XYZ'
+ xxx='xxx=yyy pass="XYZ'
+ echo 'xxx=yyy pass="XYZ'
xxx=yyy pass="XYZ
$
如果你知道如何看,你可以看到哪里有问题。 decrypt
命令行有两个参数,其意图只有一个,参数包括第一个之前的双引号和第二个结尾的另一个引号。
因此,在您的脚本中,传递给decrypt
的参数包含一对双引号,这可能不是您想要的。
如果我们使用“$(...)
”符号重写脚本,它更整齐地嵌套,那么我们得到:
decrypt()
{
echo "$1" | tr 'a-z' 'A-Z'
}
yyy=$(echo zzz=yyy pass=$(decrypt "xyz abc"))
echo "$yyy"
这样的痕迹如下:
$ sh -x xxx
+++ decrypt 'xyz abc'
+++ echo 'xyz abc'
+++ tr a-z A-Z
++ echo zzz=yyy pass=XYZ ABC
+ yyy='zzz=yyy pass=XYZ ABC'
+ echo 'zzz=yyy pass=XYZ ABC'
zzz=yyy pass=XYZ ABC
$
答案 2 :(得分:0)
我是Prey的其中一个人。昨天已经确认了这个错误,并且已经提交了一个修复程序。
我同意$()
比反对更容易阅读 - 特别是反向反击 - 实际上这是我们正在努力的事情之一(大代码重构)。
最近我一直在研究一个名为Skull的Bash框架,它为编写shell脚本提供了更好的界面。希望Prey 0.6将完全基于它,过度的反引号将被$()
取代,以便每个人都能更容易阅读。