GNU/Linux >> Linux の 問題 >  >> Linux

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

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"
    

    Linux
    1. リモートアクティブターミナルでコマンドを実行しますか?

    2. Ssh –スクリプトにパスワードを渡す?

    3. Sshリモートコマンドライン引数はどのように解析されますか?

    1. ログイン前にSsh接続でリモートコマンドを実行しますか?

    2. リモートSSHアクセスを許可しますか?

    3. envsubst:コマンドが見つかりません

    1. SCP Linuxコマンド–リモートからローカルへのSSHファイル転送方法

    2. パスワードなしでsshコマンドをsudoコマンドをリモートで実行する方法

    3. ssh で長時間実行されるコマンドを実行する