2016-10-06 11 views
3

私はbashスクリプトを書いています。これは、ssh経由でリモートサーバ上のコマンドのいくつかを実行する必要があります。このスクリプトは、2つの主要な部分がありますローカル変数をbashスクリプトのsshスコープに渡すには?

ssh -T [email protected] << 'EOF' ... Using local variables $A and $B ... EOF

問題を次のように は、リモートサーバー上でコマンドを実行します。

パート1:ローカル変数$ Aと$ B

パート2を使用して リモートサーバ上のsshコマンドの範囲内でローカル変数$ Aと$ Bを使用できないということです。私が理解する限り、変数$ Aと$ Bは、sshスコープの外側と内側で同じではありません。

私の質問は、bashスクリプトのローカル変数をsshスコープに渡す方法です。 もう1つ注意してください。パート2はかなり大きいので、sshの後に "1つのライナー"を使用することはできません。

おかげ

+0

私はFreeBSDのボックスの上に再現することはできません。この単純なbashスクリプトの出力:./tst.sh ABCと呼ば '$ 1 << $ 2 のssh -TのlocalhostとエコーEOF エコーのfoo エコー$ 1 は$ 2 エコーバー をエコーエコーEOF' デフとして期待されています 'ABC デフ fooの ABC デフ bar'(フォーマットコメントによって除去改行が、答えは間違いではありません)あなたはこの問題を再現することはできませんなぜハード –

+0

が言うこと。私はCentOS OSボックスを使用しています。ローカルホストではなく、実際のリモートサーバーを使用してみてください。 – Steeve007

+0

ローカルホストとリモートサーバで自分のスクリプトを使用するとどうなりますか? –

答えて

0

この問題はsshとは関係ありませんが、ここにはという文書がbashやその他のPosixシェルにのみ関連しています。

区切りの単語
ヒアドキュメント
- []

< <:ヒアドキュメントの形式がある

:bashのための

マンページはこちら段落を文書で述べています

wordのパラメータ展開、コマンド置換、算術展開、パス名展開は実行されません。 単語内の文字がと引用符で囲まれている場合、区切り記号は単語の引用符の削除の結果であり、ここの文書の行は展開されません。 wordが引用されていない場合、here-documentのすべての行は、パラメータ展開、コマンド置換、および算術展開の対象となります。後者の場合は、文字列\<newline>は無視され、\,$、および `の文字を引用するには\を使用する必要があります。

あなたがEOFを引用すると、あなたは明示的に$1$2変数を置き換えないシェルをお願いします。

最も堅牢な方法は、EOFを引用せず、ここの文書内の他のすべての特殊文字を一貫して引用することです。例えば

、ここにあなたののようなものに含まれる文書場合:

ssh -T [email protected] << EOF 
for f in /var/log/messages* 
do echo "Filename: " \$f 
done 
EOF 

方法すべて引用符で囲まれていない:あなたはEOFの周りが、$内側に1と引用符なしでそれを書き換えることができ

ssh -T [email protected] << 'EOF' 
for f in /var/log/messages* 
do echo "Filename: " $f 
done 
EOF 

を変数は補間される。


また、サーバーで許可されている場合は、2つのパラメータを環境変数として渡すこともできます。

PARAM1PARAM2という名前を使用するとします。サーバー上のsshd_configファイルには、デフォルトでは、セキュリティ上の理由から、環境変数が受け入れられないため、AcceptEnv PARAM1 PARAM2という行が含まれている必要があります。

その後、使用することができます。

export PARAM1=$1 
export PARAM2=$2 
ssh -T -o SendEnv=PARAM1 -o SenEnv=PARAM2 [email protected] << 'EOF' 
... 
Using variables $PARAM1 and $PARAM2 
... 
EOF 
+0

私はあなたの意見を見ます。説明をありがとう。 私が引用されたEOFを使用していた理由は、とりわけ内部の「ヒア・ドキュメント」私はコード持っているということです。 ' のssh -Tユーザー@サーバー名<<「EOF」/ var/log/messagesにfに対する を*; は エコー「ファイル名:」を行うこのコードを印刷に引用符で囲まれていないEOFと空の文字列を$ F を行ってEOF ' をし、期待通りに動作しますSteeve007 @引用されたEOF – Steeve007

+0

で(ファイル名を出力します):私の編集を参照してください... –

0

あり、直接ローカル変数を使用するようにsshを伝えるための方法かもしれないが、私はすぐに答えると、あなたはどこになりますリモートで変数を挿入コードでのsshをラップするスクリプトを使用することができることを言及しますコマンドプロンプトの制御権を得ると、それらにアクセスできます。

関連する問題