GNU/Linux >> Znalost Linux >  >> Linux

Předávání proměnných ve vzdáleném příkazu ssh

Seznam akceptovaných proměnných prostředí na SSHD ve výchozím nastavení obsahuje LC_* . Tedy:

LC_MY_BUILDN="1.2.3" ssh -o "SendEnv LC_MY_BUILDN" ssh-host 'echo $LC_MY_BUILDN'
1.2.3

Proměnné v jednoduchých uvozovkách se nevyhodnocují. Použijte dvojité uvozovky:

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

Shell rozbalí proměnné ve dvojitých uvozovkách, ale ne v jednoduchých uvozovkách. Ten se před předáním do ssh změní na požadovaný řetězec příkaz.


Pokud použijete

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

místo

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

váš shell bude interpolovat $BUILD_NUMBER před odesláním příkazového řetězce vzdálenému hostiteli.


(Tato odpověď se může zdát zbytečně komplikovaná, ale pokud vím, je snadno rozšiřitelná a robustní, pokud jde o mezery a speciální znaky.)

Data můžete vkládat přímo přes standardní vstup ssh příkaz a read ze vzdáleného umístění.

V následujícím příkladu

  1. indexované pole je vyplněno (pro usnadnění) názvy proměnných, jejichž hodnoty chcete na vzdálené straně načíst.
  2. Pro každou z těchto proměnných dáváme ssh řádek ukončený nulou s názvem a hodnotou proměnné.
  3. V shh samotný příkaz, procházíme tyto řádky, abychom inicializovali požadované proměnné.
# 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"
'

Výstup:

FOO = [$'apjlljs ailsi \n ajlls\t éjij']; BAR = [ygnàgyààynygbjrbjrb]

Pokud nepotřebujete export ty, měli byste být schopni použít declare místo export .

Opravdu zjednodušená verze (pokud nepotřebujete rozšiřitelnost, máte jednu proměnnou ke zpracování atd.) bude vypadat takto:

$ ssh [email protected] 'read foo' <<< "$foo"

Linux
  1. Provést příkaz ve vzdáleném aktivním terminálu?

  2. Ssh – předávání hesel do skriptu?

  3. Jak se analyzují argumenty vzdáleného příkazového řádku Ssh?

  1. Jak připojit vzdálený hostitel pomocí příkazu ssh

  2. envsubst:příkaz nenalezen

  3. bash nenačte uzel při vzdáleném příkazu ssh

  1. Provedení vzdáleného příkazu při připojení Ssh, před přihlášením?

  2. SSH - Jak zahrnout příkaz -t do souboru ~/.ssh/config

  3. Provádění dlouhotrvajícího příkazu na ssh