La lista de variables de entorno aceptadas en SSHD por defecto incluye LC_*
. Así:
LC_MY_BUILDN="1.2.3" ssh -o "SendEnv LC_MY_BUILDN" ssh-host 'echo $LC_MY_BUILDN'
1.2.3
Las variables entre comillas simples no se evalúan. Utilice comillas dobles:
ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"
El shell expandirá las variables entre comillas dobles, pero no entre comillas simples. Esto cambiará a la cadena deseada antes de pasar al ssh
comando.
Si usas
ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"
en lugar de
ssh [email protected] '~/tools/run_pvt.pl $BUILD_NUMBER'
su shell interpolará el $BUILD_NUMBER
antes de enviar la cadena de comando al host remoto.
(Esta respuesta puede parecer innecesariamente complicada, pero es fácilmente extensible y robusta con respecto a los espacios en blanco y los caracteres especiales, hasta donde yo sé).
Puede alimentar datos directamente a través de la entrada estándar del ssh
comando y read
eso desde la ubicación remota.
En el siguiente ejemplo,
- una matriz indexada se llena (por conveniencia) con los nombres de las variables cuyos valores desea recuperar en el lado remoto.
- Para cada una de esas variables, le damos a
ssh
una línea terminada en nulo que proporciona el nombre y el valor de la variable. - En el
shh
comando en sí mismo, recorremos estas líneas para inicializar las variables requeridas.
# 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"
'
Salida:
FOO = [$'apjlljs ailsi \n ajlls\t éjij']; BAR = [ygnàgyààynygbjrbjrb]
Si no necesita export
esos, deberías poder usar declare
en lugar de export
.
Una versión realmente simplificada (si no necesita la extensibilidad, tiene una sola variable para procesar, etc.) se vería así:
$ ssh [email protected] 'read foo' <<< "$foo"