Tengo un comando que funciona bien si ssh a una máquina y lo ejecuto, pero falla cuando intento ejecutarlo usando un comando ssh remoto como:
ssh user@IP <command>
La comparación de la salida de "env" usando ambos métodos resulta en diferentes entornos. Cuando inicio sesión manualmente en la máquina y ejecuto env, obtengo muchas más variables de entorno que cuando ejecuto:
ssh user@IP "env"
¿Alguna idea de por qué?
ssh
environment-variables
Tom Feiner
fuente
fuente
bash
no es un lenguaje de script?Respuestas:
Hay diferentes tipos de conchas. El shell de ejecución del comando SSH es un shell no interactivo, mientras que su shell normal es un shell de inicio de sesión o un shell interactivo. La descripción sigue, de man bash:
fuente
ssh user@host "bash --login -c 'command arg1 ...'"
hará que el shell remoto configure el entorno de inicio de sesión. La sección que citó menciona--login
pero sería fácil pasar por alto esto.ssh <ssh options> <IP> bash --login my_script.sh
ejecutar un script en la máquina remota, funcionaba bien y me permitía usar con éxito losJAVA_HOME
¿Qué hay de obtener el perfil antes de ejecutar el comando?
ssh user@host "source /etc/profile; /path/script.sh"
Puede que le resulte mejor para cambiar eso a
~/.bash_profile
,~/.bashrc
o lo que sea.(Como aquí (linuxquestions.org) )
fuente
El entorno de Shell no se carga cuando se ejecuta el comando ssh remoto. Puede editar el archivo de entorno ssh:
Su formato es:
Además, verifique la
sshd
configuración para laPermitUserEnvironment=yes
opción.fuente
Tuve un problema similar, pero al final descubrí que ~ / .bashrc era todo lo que necesitaba.
Sin embargo, en Ubuntu, tuve que comentar la línea que deja de procesar ~ / .bashrc:
fuente
/etc/bash.bashrc
.Encontré que una solución fácil para este problema era agregar la fuente / etc / profile a la parte superior del archivo script.sh que estaba tratando de ejecutar en el sistema de destino. En los sistemas aquí, esto provocó que las variables de entorno que script.sh necesitaba configurar como si se ejecutaran desde un shell de inicio de sesión.
En una de las respuestas anteriores se sugirió que se utilizara ~ / .bashr_profile, etc. No pasé mucho tiempo en esto, pero el problema con esto es que si envía un mensaje a un usuario diferente en el sistema de destino que el shell en el sistema fuente desde el que inicia sesión, me pareció que esto causa que el usuario del sistema fuente nombre que se utilizará para el ~.
fuente
Simplemente exporte las variables de entorno que desee sobre la comprobación de un shell no interactivo en ~ / .bashrc.
fuente