ローカルbashスクリプトをSSHに渡す前に変数を拡張する

ローカルbashスクリプトをSSHに渡す前に変数を拡張する

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.shSSHを介してコマンドを渡す前に変数をどのように拡張しますか?

答え1

原則として、SSHを介してリモートで環境変数を送信できますが、少なくともOpenSSHはサーバーでこれを許可せず、クライアントから環境変数を送信しようとしません。関連設定オプションは(サーバー)と(クライアント)AcceptEnvにあります。sshd_configSendEnvssh_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で標準コマンドをリモートで実行するとエラーになります。)declareexportsh

関連情報