2010-12-22 7 views
0

私はbashスクリプトではひどい初心者です。誰かがこの問題で私を助けてくれることを願っています。PreyプロジェクトのBashスクリプトが正しくフォーマットされていませんか?ネストされたバックティックの問題?

Preyプロジェクトのスタンドアロンスクリプトに問題があります。電子メールを送信する行があり、正しくフォーマットされていないようです。 MailSenderのはブランドンZehmのPERLのsendEmailスクリプトへのエイリアスがある

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\"\`` 

は、$ smtp_passwordはパスワードの無意味なbase64エンコーディングで、復号化され:

decrypt() { 
    echo "$1" | openssl enc -base64 -d 
} 

だから、誰もが持つ間違っているものを私に伝えることができますスクリプト?参考までに、私が暗号解読部分全体を平文のパスワードで置き換えるだけでうまくいきます。

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

お待ちください。*コマンド置換*で*関数*を呼び出そうとしていますか? –

+0

@イグナシオ:なぜそれは動作しないのですか?分岐した子シェルには、同じ機能があります。経験的に、それは動作します - しかし、バックティックのために私がコメントに使用したサンプルスクリプトを得るのは地獄です! –

+0

@イグナシオ:私はいつもそれをする。 –

答えて

2

最も簡単な方法は、バッククォートを避け、代わりに$()を使用しています

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コマンドラインには2つの引数があり、目的は1つだけで、引数には最初の二重引用符が含まれ、2番目の引数の最後には二重引用符が含まれます。

あなたのスクリプトでは、decryptに渡された引数には、二重引用符が含まれています。これはおそらくあなたが望むものではありません。

我々ははるかにきれいにネスト「$(...)」表記を使用して、スクリプトを書き換えた場合、我々が得る:私は

$ 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

+1:この代替表記法は、問題を処理する最良の方法です。 –

0

私は、このスクリプトがあなたと同型だと思う:: - :つまり、彼らは特別な必要なエスケープで、きれいに巣

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

decrypt() 
{ 
    echo "$1" | tr 'a-z' 'A-Z' 
} 

yyy=$(echo zzz=yyy pass=$(decrypt "xyz abc")) 
echo "$yyy" 

トレースこれからは次のようになりますプレイからの人の一人。この脆弱性は昨日確認され、修正は既にコミットされています。

私は、$()がバックティッキング(特にバックバックティッキング)よりも読みやすく、実際にはそれが私たちが取り組んでいることの一つです(大きなコードリファクタリング)。

最近私はSkullと呼ばれるBashフレームワークに取り組んでいます。このフレームワークはシェルスクリプトの作成にもっと良いインターフェースを提供しています。うまくいけば、Prey 0.6は完全にそれに基づいており、余分なバックティッカーは誰でも簡単に読むために$()に置き換えられます。

関連する問題