GNU/Linux >> Linux Esercitazione >  >> Linux

Passaggio di variabili nel comando ssh remoto

L'elenco delle variabili di ambiente accettate su SSHD per impostazione predefinita include LC_* . Così:

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

Le variabili tra virgolette singole non vengono valutate. Usa le virgolette:

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

La shell espanderà le variabili tra virgolette, ma non tra virgolette singole. Questo cambierà nella stringa desiderata prima di essere passato al ssh comando.


Se usi

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

invece di

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

la tua shell interpolerà il $BUILD_NUMBER prima di inviare la stringa di comando all'host remoto.


(Questa risposta potrebbe sembrare inutilmente complicata, ma è facilmente estendibile e robusta per quanto riguarda gli spazi bianchi e i caratteri speciali, per quanto ne so.)

Puoi inserire i dati direttamente attraverso l'input standard del ssh comando e read che dalla postazione remota.

Nell'esempio seguente,

  1. un array indicizzato viene riempito (per comodità) con i nomi delle variabili i cui valori si desidera recuperare sul lato remoto.
  2. Per ciascuna di queste variabili, diamo a ssh una riga con terminazione nulla che fornisce il nome e il valore della variabile.
  3. Nel shh comando stesso, eseguiamo un ciclo di queste righe per inizializzare le variabili richieste.
# 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"
'

Uscita:

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

Se non hai bisogno di export quelli, dovresti essere in grado di usare declare invece di export .

Una versione davvero semplificata (se non hai bisogno dell'estensibilità, hai una singola variabile da elaborare, ecc.) sarebbe simile a:

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

Linux
  1. Comando SCP Linux – Come trasferire file SSH da remoto a locale

  2. Ssh:passare le password a uno script?

  3. Come vengono analizzati gli argomenti della riga di comando remota Ssh?

  4. Consenti accesso Ssh remoto?

  5. Come connettere l'host remoto usando il comando ssh

Comando SSH

Che cos'è il comando SSH e come utilizzare SSH per connettersi al server remoto

Come passare la password al comando SSH in Linux

Come utilizzare SSH per connettersi a un server remoto

Utilizzo del comando SSH nei sistemi Linux/Unix

Procedura:Amministrazione remota di FreeBSD