2010-07-13 16:59:57 +0000 2010-07-13 16:59:57 +0000
95
95

Al hacer ssh, ¿cómo puedo establecer una variable de entorno en el servidor que cambie de sesión a sesión?

Cuando hago ssh en un servidor, ¿cómo puedo pasar una variable de entorno del cliente al servidor? Esta variable de entorno cambia entre diferentes invocaciones de ssh, así que no quiero sobrescribir $HOME/.ssh2/environment cada vez que hago una llamada a ssh. ¿Cómo puedo hacer esto?

Respuestas (8)

116
116
116
2010-07-13 19:25:13 +0000

Por supuesto, puedes establecer la variable de entorno dentro del comando, sin embargo tendrás que tener cuidado con las comillas: recuerda que tu shell va a analizar tu línea de comandos local, y luego el shell remoto tendrá que ir a la cadena que recibe.

Si quieres que una variable tenga el mismo valor en el servidor que en el cliente, prueba con la opción SendEnv:

ssh -o SendEnv=MYVAR server.example.com mycommand

Esto requiere el apoyo del servidor, sin embargo. Con OpenSSH, el nombre de la variable tiene que estar autorizado en /etc/sshd_config.

Si el servidor sólo permite ciertos nombres de variable específicos, puedes trabajar alrededor de eso; por ejemplo una configuración común permite LC_* a través, y puedes hacer lo siguiente:

ssh -o SendEnv=LC\_MYVAR server.example.com 'MYVAR=$LC\_MYVAR; unset LC\_MYVAR; export MYVAR; mycommand'

Si incluso LC_* no es una opción, puede pasar la información en la variable de entorno TERM, que siempre se copia (aunque puede haber un límite de longitud). Aún así, tendrás que asegurarte de que el shell remoto no restringe la variable TERM para designar un tipo de terminal conocido. Pase la opción -t a ssh si no está iniciando un shell interactivo remoto.

env TERM="extra information:$TERM" ssh -t server.example.com 'MYVAR=${TERM%:\*}; TERM=${TERM##\*:}; export MYVAR; mycommand'

Otra posibilidad es definir la variable directamente en el comando:

ssh -t server.example.com 'export MYVAR="extra information"; mycommand'

Así, si se pasa una variable local:

ssh -t server.example.com 'export MYVAR='"'$LOCALVAR'"'; mycommand'

Sin embargo, hay que tener cuidado con los problemas de citación: el valor de la variable se interpolará directamente en el fragmento de shell ejecutado en el lado remoto. El último ejemplo anterior supone que $LOCALVAR no contiene ninguna comilla simple (').

12
12
12
2012-02-03 17:09:54 +0000

Si puede administrar el host de destino puede configurar sshd para permitir pasar sus variables de entorno locales al host de destino.

De la página man de sshd_config:

PermitUserEnvironment
     Specifies whether ~/.ssh/environment and environment= options in
     ~/.ssh/authorized_keys are processed by sshd. The default is
     "no". Enabling environment processing may enable users to bypass
     access restrictions in some configurations using mechanisms such
     as LD_PRELOAD.

La configuración de sshd suele estar en /etc/ssh/sshd_config

6
6
6
2010-07-13 17:52:27 +0000

Entonces, en tu cliente, tienes alguna variable de entorno, y quieres que esté disponible para el comando remoto? No creo que haya una forma de hacer que ssh la pase mágicamente, pero probablemente puedas hacer algo como esto. En lugar de usar, digamos:

ssh remote.host my_command

Puedes hacer esto:

ssh remote.host env ENV_VAR=$ENV_VAR my_command
4
4
4
2019-06-12 10:45:04 +0000

En su cliente local, en su ~/.ssh/config puede añadir SetEnv, por ejemplo

Host myhost
  SetEnv FOO=bar

Nota: Compruebe man ssh_config.

Luego, en el servidor, asegúrese de permitir que el cliente pase ciertas variables de entorno en su archivo de configuración /etc/ssh/sshd_config:

AcceptEnv LANG LC_* FOO BAR*

Nota: Compruebe man sshd_config.

3
3
3
2018-05-14 14:36:55 +0000

La respuesta de @emptyset (que no me funcionó) me llevó a esta respuesta:

Puedes añadir este comando a tu archivo ~/.ssh/authorized_keys:

command="/usr/bin/env VARIABLE=<something> $SHELL" ssh-rsa <key>

export VARIABLE=<something> salía inmediatamente, y la conexión SSH se cerraba (bloqueándome del servidor), mientras que /usr/bin/env ... $SHELL ejecutará su shell por defecto con un entorno modificado.

1
1
1
2010-07-13 17:15:31 +0000

Podrías intentar invocar un comando personalizado, asumiendo que tienes configurado el inicio de sesión ssh sin contraseña. En el servidor, edita tu entrada ~/.ssh/authorized_keys que corresponde a la clave de tu cliente:

command="export VARIABLE=<something>" ssh-rsa <key>

Mira en este enlace en la sección Comando forzado para un poco más de detalle.

1
1
1
2015-08-28 16:55:01 +0000

Estaba haciendo una construcción personalizada de OpenSSH para un dispositivo con un cramfs en el directorio de inicio y /etc (Cram FS es de sólo lectura) por lo que ~/.ssh/environment no funcionaría sin reconstruir todo el FS y estos eran dispositivos desplegados en el campo (Sistemas Embebidos de ahí el uso de CRAMFS). Puedes especificar en el sshd_config la ubicación del archivo authroizedkeys pero por alguna razón el environment= sólo funciona para las variables de entorno en el ~/.ssh/authroized_keys. Editar el /etc/profile no era una opción y tuve que cargar ssh en un directorio no estándar. En session.c despues de childset_env(… “MAIL”…) solo agrega las variables de entorno que necesites(Esto es un hack lo se…) pero solo en caso de que alguien necesite algunas envs hardcoded para una sesion si estas compilando desde la fuente puedes hacer esto. TGI-FLOSS

0
0
0
2019-04-11 17:12:11 +0000

un simple comando :

ssh -t your_host_or_ip 'export some_var_name=whatever_you_want; bash'