web-dev-qa-db-ja.com

リモートsshコマンドで変数を渡す

Sshを使用してマシンからコマンドを実行し、環境変数$BUILD_NUMBERを渡すことができるようにしたい

私がしようとしているものは次のとおりです。

ssh [email protected] '~/tools/myScript.pl $BUILD_NUMBER'

$BUILD_NUMBERはssh呼び出しを行うマシンで設定され、変数はリモートホスト上に存在しないため、取得されません。

$BUILD_NUMBERの値を渡すにはどうすればよいですか?

81
Fergal

使用する場合

ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"

の代わりに

ssh [email protected] '~/tools/run_pvt.pl $BUILD_NUMBER'

シェルは、コマンド文字列をリモートホストに送信する前に$BUILD_NUMBERを補間します。

156
sarnold

単一引用符で囲まれた変数は評価されません。二重引用符を使用します。

ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"

シェルは変数を二重引用符で展開しますが、単一引用符では展開しません。これは、sshコマンドに渡される前に、目的の文字列に変更されます。

26
Stephen

(この答えは不必要に複雑に見えるかもしれませんが、私が知っている限り、空白や特殊文字に関しては容易に拡張可能で堅牢です。)

sshコマンドの標準入力と、リモートロケーションからのreadを介してデータを直接フィードできます。

次の例では、

  1. インデックス付き配列には、リモート側で値を取得する変数の名前が(便宜上)入力されます。
  2. これらの変数ごとに、sshに、変数の名前と値を示すヌル終了行を与えます。
  3. 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"
1
Alice M.

前述のように、リモートホストで環境変数を設定する必要はありません。代わりに、ローカルホストでメタ拡張を実行し、リモートホストに値を渡すことができます。

ssh [email protected] '~/tools/run_pvt.pl $BUILD_NUMBER'

本当にリモートホストで環境変数を設定して使用したい場合は、envプログラムを使用できます。

ssh [email protected] "env BUILD_NUMBER=$BUILD_NUMBER ~/tools/run_pvt.pl \$BUILD_NUMBER"

この場合、これは少しやり過ぎです。

  • env BUILD_NUMBER=$BUILD_NUMBERはローカルホストでメタ拡張を行います
  • リモート BUILD_NUMBER環境変数は
    リモートシェル
0