GNU/Linux >> Tutoriales Linux >  >> Linux

Pasar variables en el comando ssh remoto

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,

  1. una matriz indexada se llena (por conveniencia) con los nombres de las variables cuyos valores desea recuperar en el lado remoto.
  2. 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.
  3. 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"

Linux
  1. ¿Ejecutar comando en terminal activo remoto?

  2. Ssh – ¿Pasar contraseñas a un script?

  3. bash no carga el nodo en el comando ssh remoto

  4. Cómo ejecutar remotamente el comando ssh un comando sudo sin contraseña

  5. SSH:cómo incluir el comando -t en el archivo ~/.ssh/config

Comando SSH

¿Qué es el comando SSH y cómo usar SSH para conectarse a un servidor remoto?

Cómo pasar la contraseña al comando SSH en Linux

Cómo usar SSH para conectarse a un servidor remoto

Uso del comando SSH en sistemas Linux/Unix

Cómo:Administración remota de FreeBSD