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 example@unixlinux.online "~/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 example@unixlinux.online "~/tools/run_pvt.pl $BUILD_NUMBER"
invece di
ssh example@unixlinux.online '~/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,
- un array indicizzato viene riempito (per comodità) con i nomi delle variabili i cui valori si desidera recuperare sul lato remoto.
- Per ciascuna di queste variabili, diamo a
sshuna riga con terminazione nulla che fornisce il nome e il valore della variabile. - Nel
shhcomando 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 example@unixlinux.online '
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 example@unixlinux.online 'read foo' <<< "$foo"