2016-06-20 16 views
0

複数の変数を遠隔bashスクリプトに送信する際に、不具合が発生することはありません。ローカルbashからリモートbashスクリプトに複数の変数を渡すことなく、

この質問のために変数$ timestampは12-12-15 19:45:21

ssh [email protected] "/usr/path/to/script.sh http://www.web.com/$1 http://web.com/$2 $timestamp"; 

が含まれている私は、上の変数の形で修正されたファイル名で

2つのURLをscript.shする3つの変数を送っています最後に$ timestamp変数

myscript.shでは、$ timestampをmysqlデータベースに挿入しようとすると、空白の前の日付の最初の部分だけが表示されます。

12-12-15 

私の引用符で囲まれているので、ゴブリングが防止されていません。各変数を個別に引用する必要がありますか?

+1

おそらくタイムスタンプのスペースが問題です。 '$ timestamp'を一重引用符で囲み、それが修正されているかどうか確認してください。 – xxfelixxx

+0

まだ、最初の部分だけを受け取っていませんか? – Grant

答えて

1
ssh [email protected] "/usr/path/to/script.sh http://www.web.com/$1 http://web.com/$2 $timestamp"; 

これは、局所的に、個々の引数は

ssh [email protected] "/usr/path/to/script.sh 'http://www.web.com/$1' 'http://web.com/$2' '$timestamp'"; 

を通過します。また、渡されていますかを見るために、スクリプト内の各引数を印刷することができます引用してみます

/usr/path/to/script.sh http://www.web.com/$1 http://web.com/$2 $timestamp 

を呼び出し、これに相当します。 ..例えばecho $1など

+0

ピーター、ありがとう、これは私が必要としたものです。以前はすべてを引用してみましたが、一重引用符と二重引用符を混ぜることはありませんでした。ありがとう! – Grant

+1

両方の引用符が必要な理由は、シェルが外側のレベル(二重引用符)を解析して適用してから削除し、その結果を 'ssh'に渡し、それをリモートシェルに渡し、* *内部レベル(この例では一重引用符)を解析(および削除)し、リモートシェルはその結果を 'script.sh'に渡します。 1つのレベルの引用だけで、リモートシェルがそれを解析して分割された時点で引用符で囲まれていませんでした。 –

+0

詳細な説明をありがとうゴードン! – Grant

0

あなたは、リモートホストの値をエスケープする必要が

ssh localhost "printf \"%s %s %s\n\" a b \"last parameter\"" 
0

ような何かを試すことができます。これを行う正しい方法は、printf %qです。

ssh [email protected] "/usr/path/to/script.sh \ 
    $(printf "%q " "http://www.web.com/$1" "http://web.com/$2" "$timestamp")" 

これはすべての可変値に対して機能します。単一引用符でそれらをラップすると、変数自体に単一引用符が含まれていると構文エラーとコマンド挿入が発生します。

関連する問題