SSHD で受け入れられる環境変数のリストには、デフォルトで LC_*
が含まれます .したがって:
LC_MY_BUILDN="1.2.3" ssh -o "SendEnv LC_MY_BUILDN" ssh-host 'echo $LC_MY_BUILDN'
1.2.3
単一引用符で囲まれた変数は評価されません。二重引用符を使用:
ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"
シェルは変数を二重引用符で展開しますが、単一引用符では展開しません。これは、 ssh
に渡される前に、目的の文字列に変更されます コマンド。
使用する場合
ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"
の代わりに
ssh [email protected] '~/tools/run_pvt.pl $BUILD_NUMBER'
シェルは $BUILD_NUMBER
を補間します コマンド文字列をリモート ホストに送信する前に
(この答えは不必要に複雑に思えるかもしれませんが、私の知る限り、空白や特殊文字に関して簡単に拡張でき、堅牢です。)
ssh
の標準入力から直接データをフィードできます コマンドと read
次の例では、
<オール>ssh
に与えます 変数の名前と値を示す null で終わる行。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 [email protected] '
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
の代わりに .
非常に単純化されたバージョン (拡張性が必要ない場合、処理する変数が 1 つしかない場合など) は次のようになります:
$ ssh [email protected] 'read foo' <<< "$foo"