SSH経由で環境変数を渡す

SSH経由で環境変数を渡す

以下のコードを使用して、環境変数をリモート ホストに paas しようとしています。

ssh username@ip "env current_quarter=$current_quarter" sh -s << 'EOF' 
pwd 
echo "${current_quarter}" 
EOF

pwdリモート ホスト上の正しい場所を出力しますが、echo "${current_quarter}"current_quarter は出力しません。

答え1

引用符で囲むことで、EOFローカルシェルにヒアドキュメントを展開せずにsshに渡すように指示します。bash ドキュメントこれはパラメータ展開、コマンド置換、算術展開に適用されます。

最初にこの回答を書いたときに私が考えていたのとは反対に、リモート シェルはこれによって影響を受けず、リモート シェルで直接書き込んだかのようにヒア ドキュメントを実行します (引用符で囲むことでローカル シェルでスキップされたすべての種類の展開と置換を含むEOF)。

ローカル変数だけを使用する場合は、testEOF から引用符を削除します。

ssh user@host sh -s <<EOF
pwd
echo $test
EOF

fish ユーザーの場合は次のようになります。

ssh user@host "\
pwd
echo $test
"

testローカル変数をリモート変数として渡しremote_test、ローカルに展開しない場合は、変数をバックスラッシュでエスケープするだけです。

ssh user@host sh -s <<EOF
export remote_test=$test
pwd
echo "\${remote_test}"
EOF

編集:

ランニング:

ssh user@host "env remote_test=$test" sh -s <<'EOF'
pwd
echo "${remote_test}"
EOF

envシェルの一部ではなく、非 Bourne シェルでも使用できるという点を除けば、3 番目のコード例と同等です。

(ただし、これは OP が示したコード例と同一ですが、OP がこの回答を正解としてマークしたため、特定の文字シーケンスに遭遇したときに env と export の動作が異なるのではないかと疑っていますが、この仮説を裏付ける決定的な証拠は見つかっていません。)

関連情報