SSHを介してリモートホストでスクリプトを実行しようとしています。このスクリプトは以下で使用されます。地元のシェル。スクリプトの変数は拡張されません。
ssh user@host 'bash -s' < script.sh
コンテンツscript.sh
:
#!/bin/bash
docker pull "$IMAGE"
リモートホストで次のように実行します。
docker pull ""
エラー出力に示すように:
参照の解決中にエラーが発生しました。 ""は有効なストレージ/タグではありません。ストレージ名には少なくとも1つのコンポーネントが必要です。
コマンド置換を試してみました。
ssh user@host < $(cat script.sh)
その結果は次のとおりです。
bash:95行:$(cat script.sh):あいまいなリダイレクト
script.sh
SSHを介してコマンドを渡す前に変数をどのように拡張しますか?
答え1
原則として、SSHを介してリモートで環境変数を送信できますが、少なくともOpenSSHはサーバーでこれを許可せず、クライアントから環境変数を送信しようとしません。関連設定オプションは(サーバー)と(クライアント)AcceptEnv
にあります。sshd_config
SendEnv
ssh_config
ここで設定を変更できない、または変更したくないと仮定すると、とにかくスクリプト全体がリモートstdinに送信されるため、スクリプトの前に変数割り当てを貼り付けることもできます。
export -p
リモートシェルがそれを割り当てるために使用できる形式を使用して、現在のシェルからエクスポートされたすべての変数を印刷できます。その後、リモコンはスクリプトを処理し、通常どおりに変数を設定できます。
だからscript.sh
含める
echo "$FOO" "$HOSTNAME"
その後、FOO
ローカルシェルにエクスポートし、エクスポートしたすべての変数の定義とスクリプト自体をリモートで渡します。結果の出力には、FOO
設定したばかりの値が含まれます。
$ export FOO=abc123
$ (export -p; cat script.sh) | ssh user@remotehost 'bash -s'
FOO: abc123 HOSTNAME: remotehost
(Bashにはここに小さな問題があります。通常モードでは標準コマンドではなくコマンドをexport -p
印刷します。これは他のシェルではサポートされていない可能性があります。ローカルシェルがBashで標準コマンドをリモートで実行するとエラーになります。)declare
export
sh