2010-12-22 47 views
0

我是一個可怕的初學者bash腳本,並希望有人能幫助我解決這個問題。Prey項目中的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是一個別名布蘭登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

等待,您正嘗試使用*命令替換*調用*函數*? – 2010-12-22 02:30:55

+0

@Ignacio:爲什麼它不工作?分叉子shell具有相同的可用功能。從經驗上講,它是有效的 - 但是由於反引號,我將它用於評論的示例腳本將會非常糟糕! – 2010-12-22 05:16:07

回答

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")") 
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 
$ 
0

我其中一個來自Prey。這個錯誤昨天被確認,並且已經提交了一個修復程序。

我確實認爲$()比反語更容易閱讀 - 特別是反支持 - 並且實際上這是我們正在處理的事情之一(大代碼重構)。

最近我一直在研究一個名爲Skull的Bash框架,它爲編寫shell腳本提供了一個更好的接口。希望獵物0.6將完全基於它,並且過多的反作用將被替換爲$(),以使大家更容易閱讀。