Prey项目中的Bash脚本格式不正确?嵌套的反引号问题?

时间:2010-12-22 02:28:08

标签: bash scripting

我是一个糟糕的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`

3 个答案:

答案 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将完全基于它,过度的反引号将被$()取代,以便每个人都能更容易阅读。