回答:
使用する場合
ssh pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"
の代わりに
ssh pvt@192.168.1.133 '~/tools/run_pvt.pl $BUILD_NUMBER'
シェルは$BUILD_NUMBER
、コマンド文字列をリモートホストに送信する前にを補間します。
(この答えは不必要に複雑に見えるかもしれませんが、私が知る限り、それは空白と特殊文字に関して簡単に拡張可能で堅牢です。)
ssh
コマンドの標準入力とread
リモートの場所から直接データをフィードできます。
次の例では、
ssh
の名前と値を示すヌル終了行を指定します。shh
コマンド自体、私たちは、これらの線をループに必要な変数を初期化します。# Initialize examples of variables.
# The first one even contains whitespace and a newline.
readonly FOO=$'apjlljs ailsi \n ajlls\t éjij'
readonly BAR=ygnàgyààynygbjrbjrb
# Make a list of what you want to pass through SSH.
# (The “unset” is just in case someone exported
# an associative array with this name.)
unset -v VAR_NAMES
readonly VAR_NAMES=(
FOO
BAR
)
for name in "${VAR_NAMES[@]}"
do
printf '%s %s\0' "$name" "${!name}"
done | ssh user@somehost.com '
while read -rd '"''"' name value
do
export "$name"="$value"
done
# Check
printf "FOO = [%q]; BAR = [%q]\n" "$FOO" "$BAR"
'
出力:
FOO = [$'apjlljs ailsi \n ajlls\t éjij']; BAR = [ygnàgyààynygbjrbjrb]
export
それらが必要ない場合は、のdeclare
代わりに使用できるはずですexport
。
本当に簡易版(あなたがなど、プロセスに単一の変数を持って、拡張性を必要としない場合)のようになります。
$ ssh user@somehost.com 'read foo' <<< "$foo"
デフォルトでSSHDで受け入れられる環境変数のリストには、が含まれますLC_*
。したがって:
LC_MY_BUILDN="1.2.3" ssh -o "SendEnv LC_MY_BUILDN" ssh-host 'echo $LC_MY_BUILDN'
1.2.3
以前に回答したように、リモートホストで環境変数を設定する必要はありません。代わりに、ローカルホストでメタ拡張を実行し、値をリモートホストに渡すだけです。
ssh pvt@192.168.1.133 '~/tools/run_pvt.pl $BUILD_NUMBER'
リモートホストで環境変数を設定して使用する場合は、env
プログラムを使用できます。
ssh pvt@192.168.1.133 "env BUILD_NUMBER=$BUILD_NUMBER ~/tools/run_pvt.pl \$BUILD_NUMBER"
この場合、これは少しやりすぎです。
env BUILD_NUMBER=$BUILD_NUMBER
ローカルホストでメタ拡張を行いますBUILD_NUMBER
環境変数はsshを介して環境変数を明示的に渡すことも可能です。サーバー側の設定が必要なので、これは普遍的な答えではありません。
私の場合、バックアップリポジトリの暗号化キーをそこに保存せずにバックアップストレージサーバーのコマンドに渡したかったのですが、環境変数はps
!stdinでキーを渡すという解決策も機能しますが、面倒すぎます。いずれにせよ、sshを介して環境変数を渡す方法は次のとおりです。
サーバーでsshd_config
、通常はファイルを編集し、渡す変数に一致/etc/ssh/sshd_config
するAcceptEnv
ディレクティブを追加します。を参照してくださいman sshd_config
。私の場合、変数をボーグバックアップに渡したいので、次のように選択しました。
AcceptEnv BORG_*
ここで、クライアントで-o SendEnv
オプションを使用して環境変数を送信します。次のコマンドラインは、環境変数BORG_SECRET
を設定してから、クライアントマシン(と呼ばれるbackup
)に送信されるようにフラグを立てます。次に、printenv
そこで実行され、BORG変数の出力をフィルタリングします。
$ BORG_SECRET=magic-happens ssh -o SendEnv=BORG_SECRET backup printenv | egrep BORG
BORG_SECRET=magic-happens
LC_*
送信可能な変数が含まれているため$LC_TvE_foo
、またはを使用する$LC_BORG_SECRET
だけで、組み込み変数と「衝突」しないようにしてください。
sshセッションの外で変数にアクセスするために変数をエスケープします:ssh pvt@192.168.1.133 "〜/ tools / myScript.pl \ $ BUILD_NUMBER"
'$FOO'
と同等"\$FOO"
です。問題は、「SSHでシェル変数を渡す方法」でした。@PatrickTrentinですでに述べたように、BUILD_NUMBER
環境変数がリモートで設定されていないため、これは正しい答えではありません。