Pregunta:
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, por lo que no quiero sobrescribir $HOME/.ssh2/environment
cada vez que hago una llamada ssh. ¿Cómo puedo hacer esto?
Respuesta:
Por supuesto, puede configurar la variable de entorno dentro del comando, sin embargo, tendrá que tener cuidado con las comillas: recuerde que su shell analizará su línea de comando local, y luego el shell remoto probará la cadena. recibe.
Si desea que una variable obtenga el mismo valor en el servidor que tiene en el cliente, pruebe la opción SendEnv
:
ssh -o SendEnv=MYVAR server.example.com mycommand
Sin embargo, esto requiere el apoyo del servidor. Con OpenSSH, el nombre de la variable debe estar autorizado en /etc/sshd_config
.
Si el servidor solo permite ciertos nombres de variables específicos, puede solucionarlo; por ejemplo, una configuración común permite LC_*
través, y puede 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 información en la variable de entorno TERM
, que siempre se copia (sin embargo, puede haber un límite de longitud). Aún tendrá que asegurarse de que el shell remoto no restrinja 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'
Por lo tanto, si pasa una variable local:
ssh -t server.example.com 'export MYVAR='"'$LOCALVAR'"'; mycommand'
Sin embargo, tenga cuidado con los problemas de citas: el valor de la variable se interpolará directamente en el fragmento de shell ejecutado en el lado remoto. El último ejemplo anterior asume que $LOCALVAR
no contiene comillas simples ( '
).