注 - 昨日、同様の質問を投稿し、@casから追加情報を取得しましたが、まだ問題があります。質問をまとめてもう一度質問します。
スクリプトテキストをsshコマンドに渡します(下記参照)。拡張する必要があるスクリプトテキスト内にいくつかの変数があります。 $ 1、$ 2、$ logfilepatternはスクリプト文字列内でうまく拡張されているようです。しかし、$ fはそうではありません。私は考えることができる二重引用符と一重引用符とエスケープのすべての組み合わせを試しましたが、まだ動作しません。助けてくれてありがとう。
ありがとう、マックス
#!/bin/bash
logfilepattern="drupal-watchdog.log-201510*.gz"
function getlogcounts {
echo in getlogcounts
echo arg1: "$1"
echo arg2: "$2"
ssh $1 "cd "$2"; pwd; echo "$logfilepattern" ; for f in "$logfilepattern"; do echo "$f"; done"
}
server="[email protected] "
logdir="/var/log/mylogs"
getlogcounts $server $logdir
答え1
二重引用符の中に二重引用符を入れるには、次の手順を実行する必要があります。
- 現在の二重引用符で囲まれた文字列を終了します。
"
- 二重引用符をエスケープします。
\"
- 二重引用符で囲まれた文字列を再起動します。
"
言い換えれば: "\""
一重引用符の中に一重引用符を含める場合も同様です。'\''
また、引用符付きの文字列スクリプトにのみ存在するため、$f
withにエスケープする必要があります。\$f
ssh $1 "cd "\""$2"\""; pwd; echo "\""$logfilepattern"\"" ; for f in "\""$logfilepattern"\""; do echo "\""\$f"\""; done"
非常に見苦しく、読み取りおよび/またはデバッグが困難です。
この特別なケースでは、関数への入力を制御し、関数に疑わしい値(スペースを含むファイル名を含む)を提供しないことを合理的に確認するときは、必要に応じて二重引用符を削除できます。 "$f" を除いて、$logfilepattern と一致するファイルにスペースやその他の問題のある文字が含まれないと絶対に確信しない限り。
ssh $1 "cd $2; pwd; echo $logfilepattern ; for f in $logfilepattern; do echo "\""\$f"\""; done"
入力がコマンドラインまたは環境変数(特にCGI環境変数を含む)と同じ方法でユーザーから来る場合は、すべての変数を引用する防御スタイルに戻す必要があります。
答え2
次のコードを試してみてください。
#!/bin/bash
logfilepattern="drupal-watchdog.log-201510*.gz"
function getlogcounts {
echo in getlogcounts
echo arg1: "$1"
echo arg2: "$2"
ssh $1 "/bin/bash -c ' cd "$2"; pwd; echo "$logfilepattern" ; for f in "$logfilepattern"; do echo \"\$f\"; done'"
}
server="[email protected] "
logdir="/var/log/mylogs"
getlogcounts $server $logdir