Pregunta ¿Cómo puedo cambiar automáticamente el directorio en ssh login?


Estoy tratando de conseguir ssh para cambiar automáticamente a un directorio en particular cuando inicio sesión. Intenté que ese comportamiento funcione usando las siguientes directivas en ~/.ssh/config:

Host example.net
LocalCommand "cd web"

pero cada vez que inicio sesión, veo lo siguiente:

/bin/bash: cd web: No such file or directory

aunque aunque definitivamente hay una web carpeta en mi directorio personal. Incluso utilizando una ruta absoluta da el mismo mensaje. Que quede claro, si escribo cd web Después de iniciar sesión llego a la carpeta correcta.

¿Que me estoy perdiendo aqui?

EDITAR:

Diferentes combinaciones de comillas / rutas absolutas dan diferentes mensajes de error:

LocalCommand "cd web"
/bin/bash: cd web: No such file or directory

LocalCommand cd web
/bin/bash: line 0: cd: web: No such file or directory

LocalCommand cd /home/gareth/web
/bin/bash: line 0: cd: /home/gareth/web: Input/output error

Esto me hace pensar que las citas no deberían estar allí, y que está ocurriendo otro error.


77
2017-08-05 14:40


origen


LocalCommand se ejecuta en su sistema local, no en el sistema remoto. - Steve Kehlet
Mira aquí superusuario.com/a/124110/47962 - Nakilon


Respuestas:


cd es un shell incorporado. LocalCommand se ejecuta como:

/bin/sh -c <localcommand>

Lo que estás buscando hacer no se puede lograr realmente a través de SSH; necesita modificar el shell de alguna manera, por ejemplo, a través de bashrc / bash_profile.


18
2017-08-05 15:52



Sí, sólo quería mencionar a los mismos. Puedes poner el cd comando en ~/.bashrc en el servidor remoto en su lugar. - vdboor
Eso es molesto. Como mencioné en otro comentario, el servidor tiene varios nombres de host y quería tener un comportamiento diferente según cuál se usó. Supongo que no es posible determinar cuál fue usado desde .bashrc? - Gareth
Es posible, pero probablemente no aconsejable. Algo así como reemplazar ssh con un script de shell pequeño o un alias que pase el nombre de host como una variable que se va a exportar (a la "ssh -t usuario @ host 'export connhostname = host; bash --login'"). Pero estás empezando a entrar en un territorio muy extraño, de hecho. Quizás una mejor pregunta es, ¿POR QUÉ quieres este comportamiento? - BMDan
Realmente no es tan importante ser honesto. Estoy en la situación en la que la mayoría de las veces que inicio sesión en este servidor me dirijo directamente a uno de los dos directorios (según el host que esté usando) - Gareth


Esto funciona:

ssh server -t "cd /my/remote/directory; bash --login"

Para crear un directorio si no existe:

ssh server -t "mkdir -p newfolder; cd ~/newfolder; pwd; bash --login"

Si no añades bash hasta el final del camino y luego salir después de la cd comand corre Y si no añades --login entonces tu ~/.profile no es de origen


76
2017-12-21 21:29



Esto me termina en la ubicación correcta, con un indicador de bash. ¡Perfecto! - Peter Ehrlich
Esto también funciona para mí, pero si trato de usarlo con ssh jump-host no funciona. Recibo un mensaje de conexión cerrada. - Riccardo


  1. Ingresa a tu caja
  2. Editar ~/.bash_profile 
  3. Al final del archivo añadir cd /path/to/your/destination
  4. Guárdalo y sal de tu editor
  5. Cerrar sesión de la caja
  6. Vuelve a iniciar sesión y deberías aterrizarlo. /path/to/your/destination

39
2018-02-27 11:04



En algunas máquinas es posible que tenga que adjuntar cd /path/to/your/destination a ~/.bashrc en lugar de a ~/.bash_profile. El resultado debe ser el mismo. - Matthias
Esto funciona perfectamente gracias. ¿Está restringido solo a mi ID de usuario o afectará también a los inicios de sesión de otros usuarios? - barry_allen
@BabyGroot si modificas ~/.bash_profile o ~/.bashrc Sólo afectará al usuario actual. - rubenvarela


Una solución más robusta para el caso cuando necesita ssh y anular el archivo .bashrc predeterminado. Esto es útil en los casos en los que el entorno de servidor remoto tiene varios documentos y los utilizan varios usuarios.

alias ssh_myserver='ssh server_name -t "echo cd /path/to/desired/dir>/tmp/.bashrc_tmp; bash --rcfile /tmp/.bashrc_tmp"'

Más detallado:

  1. Primer comando crea .bashrc_tmp presentar en /tmp Directorio en el servidor remoto con un contenido cd /path/to/dir
  2. El siguiente comando se ejecuta bash con el archivo de configuración especificado en el paso 1. Esto permite cambiar al directorio deseado y suprimir el valor predeterminado .bashrc.
  3. Todo este comando está envuelto como un alias, así que en el indicador de comandos del cliente ssh se puede llamar como ssh_myserver

5
2017-08-21 11:53



Creativo ... siempre que tenga permisos de escritura en / tmp - smci


¿Has habilitado esta directiva en tu configuración ssh?

PermitLocalCommand yes

El valor predeterminado para eso es no, en cuyo caso tu LocalCommand Directiva sería ignorada.

Alternativamente, ¿ha intentado agregar el comando a su .bashrc ¿expediente?


4
2017-08-05 14:47



Esa directiva está establecida, sí (y supongo que no vería el mensaje de error si no lo fuera). El problema con el uso de .bashrc es que el servidor tiene diferentes nombres de host, y me gustaría que diferentes nombres de host se traduzcan en diferentes directorios de inicio - Gareth
A menos que cada nombre de host tenga una dirección IP diferente, no habría manera de que el servidor sepa qué nombre de host ha solicitado. Mientras que las solicitudes HTTP proporcionan un encabezado Host: amigable para identificar el nombre de host solicitado, las conexiones SSH no lo hacen. - Fosco


Así que he buscado en muchos sitios web (stackoverflow, este) pero no encontré lo que quería. Terminé creando mi propio script de shell. Lo estoy pegando aquí. También puedes copiarlo en un directorio en el $ PATH.

#!/bin/bash
ssh -t <username@hostname> "cd ~/$1; exec \$SHELL --login"

Así que después de esto. Hago:

connect <foldername>

Nota: es posible que deba cerrar sesión e iniciar sesión nuevamente después de cambiar la variable de ruta


4
2017-11-25 03:10



Prefiero esto a la sugerencia anterior porque '$ SHELL' siempre es válido, mientras que 'bash' no lo es. También el uso de 'exec' es un buen toque. - Dave
Un nuevo refinamiento sería asegurar que 'cd' sea exitoso - "cd ~ / $ 1 && exec ... ' - Dave


En tus ~/.ssh/config:

LocalCommand echo '/home/%r/some/subdir' > /home/%r/.ssh/ssh_cd

Al final de tu ~/.bashrc:

if [[ -f $HOME/.ssh/ssh_cd ]]
then
    cd $(<$HOME/.ssh/ssh_cd)
    # uncomment the line below and the file will be removed so the cd won't work
    # unless the file is regenerated since you may not want this to operate for
    # non-ssh logins or for ssh logins that you want to function differently
    # rm $HOME/.ssh/ssh_cd
fi

Intenté hacer esto utilizando el paso de variables, incluso con una variable exportada, pero estos comandos se ejecutan en diferentes shells.

Por cierto, cuando probé lo que intentabas hacer, no obtuve ningún error cuando utilicé la ruta absoluta sin comillas. yo añadí ; pwd al final del comando y se muestra el directorio correcto, sin embargo, el directorio en el que termino es ~. No existen cd comandos en mis archivos de inicio de shell. Traté de poner una diferente cd somedir; pwden ~/.ssh/rc (con el otro todavía en su lugar). los config comando se ejecuta antes de que se emita el motd y el rc el comando se emite después, pero antes de que se obtengan los archivos de inicio del shell. Así que de nuevo, está sucediendo en una cáscara diferente.

Pruebe la técnica de paso por archivo y hágame saber si funciona para usted.


3
2017-08-05 18:21





¿Lo has probado sin las citas a su alrededor? Los únicos ejemplos que he visto no los tienen, así que con ellos podría estar intentando ejecutar cd \ web como un comando.


2
2017-08-05 15:03



Ok, eliminar comillas parece ayudar, pero todavía tengo errores (ver publicación editada) - Gareth