Tengo un usuario que no ha realizado modificaciones en $ PATH en ningún archivo de puntos: es exactamente la configuración predeterminada del sistema. Desde un shell de inicio de sesión:
$ ssh example.com
user@example.com:~$ cat /tmp/hello.hs
#!/bin/bash
echo "$SHELL"
echo "$PATH"
user@example.com:~$ /tmp/hello.hs
/bin/bash
/usr/local/bin:/usr/bin:/bin
Exactamente como se especifica en /etc/profile
. Esto me parece bastante inesperado:
$ ssh example.com '/tmp/hello.sh'
/bin/bash
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
Como dije, no hay modificación de $ PATH en ~/.bashrc
, ni en /etc/bash.bashrc
. No ~/.ssh/environment
tampoco El ssh(1)
declara que la variable de entorno PATH
es
Establezca la RUTA predeterminada, como se especifica al compilar ssh.
pero este hilo de StackOverflow y este artículo de la lista de correo sugieren que debería poder influir en $ PATH para un comando dado simplemente modificando / etc / profile, uno de los archivos de inicio de shell, etc.
¿Que está pasando aqui?
.bashrc
podría funcionar, pero en general lo solucionaría si PATH es importante. ¿O por qué no simplemente especificar nombres de ruta completos si necesita la forma 'comando' de ejecutar ssh? :)bash(1)
INVOCACIÓN sugiere que no se leen archivos de inicio de esta manera, pero no puedo encontrar documentación sobre cómo ssh invoca el shell. Esto parece contrario a las fuentes vinculadas anteriores, a menos que otros tengan un archivo de inicio / etc / ssh / sshrc que yo no tenga. (Existen soluciones alternativas, por supuesto, pero el punto es comprender exactamente cómo Debian SSHD maneja las rutas por defecto)/etc/profile
las actualizaciones de ruta de mi cuadro remoto para mí, entoncesssh user@remotebox 'env'
me muestra el PATH actualizado. Lo mismo ocurre si agregoexport PATH=$PATH:/my/testpath
a .bashrc (pero en mi caso en la parte superior del archivo antes de comprobar si hay shells interactivos (-z "$PS1"
).Pude hacer que ssh ejecutara comandos usando la ruta remota ejecutando:
Aquí env puede ser reemplazado con cualquier comando que desee.
Tengo claves autorizadas, así que no necesitaba una contraseña para ejecutar el comando o ssh.
fuente
Se me ocurrió una solución diferente para solucionar el problema. Mi preferencia personal es crear nuevos archivos de configuración en lugar de alterar los existentes. De esta manera, puedo facilitar el cambio de la configuración predeterminada.
Aquí están los contenidos de
/etc/profile.d/ssh_login.sh
:Utilizando
dropbear
en lugar deopenssh-server
(esto también debería funcionar con openssh), la variable SSH_CONNECTION se configura automáticamente cuando inicio sesión de forma remota. Creé una nueva configuración de perfil de shell para detectar inicios de sesión SSH, mostrar cierta información en la pantalla y, lo más importante, cargar la configuración del entorno global/etc/environment
para reemplazar los valores compilados. Tenga en cuenta que esto solo afecta a los shells interactivos SSH, no a la ejecución remota de comandos.Alternativamente , si usa openssh y siempre desea cargar el entorno global, independientemente de si se trata de un shell interactivo, puede colocar un enlace simbólico de
~/.ssh/
esta manera:Entonces debe habilitar la
PermitUserEnvironment
opción en/etc/sshd/sshd_config
. Sin embargo, solo haga esto para usuarios confiables, ya que esto podría permitirles eludir las restricciones de acceso en algunas configuraciones utilizando mecanismos como LD_PRELOAD. Consulteman sshd_config
para obtener más información, específicamente cómo usarMatch
bloques para restringir las opciones a usuarios / grupos específicos.fuente
Si desea que se cargue la ruta del perfil, intente:
en la parte superior del guión. De esta forma, el shell está en modo interactivo cuando ejecuta el script.
http://linux.die.net/man/1/bash
fuente