¿Cómo puedo ssh directamente a un directorio particular?

248

A menudo tengo que iniciar sesión en uno de varios servidores e ir a uno de varios directorios en esas máquinas. Actualmente hago algo de este tipo:

localhost ~] $ ssh somehost

¡Bienvenido a somehost!

somehost ~] $ cd / some / directory / somewhere / named / Foo
somehost Foo] $ 

Tengo scripts que pueden determinar en qué host y en qué directorio debo ingresar, pero no puedo encontrar una manera de hacerlo:

localhost ~] $ go_to_dir Foo

¡Bienvenido a somehost!

somehost Foo] $

¿Hay alguna manera fácil, inteligente o alguna de hacer esto?

Escarchado
fuente

Respuestas:

413

Puedes hacer lo siguiente:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash"

De esta manera, obtendrá un shell justo en el directorio deseado.


Explicación

-tForzar la asignación pseudo-terminal. Esto se puede usar para ejecutar programas arbitrarios basados ​​en pantalla en una máquina remota, lo que puede ser muy útil, por ejemplo, al implementar servicios de menú.

Múltiples -topciones fuerzan la asignación de tty, incluso si ssh no tiene tty local.

  • Si no lo usa -t, no aparecerá ningún mensaje.
  • Si no agrega ; bash, la conexión se cerrará y devolverá el control a su máquina local
rogeriopvl
fuente
21
en mi caso, la parte faltante
Mathieu
2
Cuando se utiliza este enfoque, el .bash_profile no se lee, ¿alguien sabe por qué?
Filipe
8
Tenía que hacer esto: ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
guptron
40
Por lo general, querrá un shell de inicio de sesión:ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
christianbundy
10
Solo quería vincular el directorio de cambio automáticamente al iniciar sesión ssh - Falla del servidor ; y desde allí pegue este comando (que es una versión del de @christianbundy):ssh server -t "cd /my/remote/directory; bash --login"
sdaau
53

Podrías agregar

cd /some/directory/somewhere/named/Foo

a su .bashrcarchivo (o .profilecomo lo llame) en el otro host. De esa manera, no importa lo que haga o de dónde provenga ssh, cada vez que inicie sesión en ese servidor, lo hará cden el directorio adecuado para usted, y todo lo que tiene que hacer es usarlo sshnormalmente.

Por supuesto, la solución de rogeriopvl también funciona, pero es un poco más detallada, y debes recordar hacerlo cada vez (a menos que hagas un alias), por lo que parece un poco menos "divertido".

Chris Lutz
fuente
1
+1, esto parece más adecuado si necesita un directorio constante en lugar de hacer que el comando ssh sea más largo recordando cada vez a qué directorio se moverá cuando se conecte a la máquina X
Tebe
No es correcto cuando se cambia de manera flexible
Lewis Chan
21

He creado una herramienta para SSH y CD en un servidor consecutivamente, acertadamente llamado sshcd . Para el ejemplo que ha dado, simplemente usaría:

sshcd somehost:/some/directory/somewhere/named/Foo

¡Avíseme si tiene alguna pregunta o problema!

christianbundy
fuente
1
Sería genial si pudieras definir una nueva configuración en ~ / .ssh / config y leerla desde allí;)
Alexar
21

Mi enfoque preferido es usar el archivo de configuración SSH (descrito a continuación), pero hay algunas posibles soluciones dependiendo de sus usos.

Argumentos de línea de comando

Creo que la mejor respuesta para este enfoque es la respuesta de christianbundy a la respuesta aceptada:

ssh -t example.com "cd /foo/bar; exec \$SHELL -l"

El uso de comillas dobles le permitirá usar variables de su máquina local, a menos que se escapen (como $SHELLaquí). Alternativamente, puede usar comillas simples, y todas las variables que use serán las de la máquina de destino:

ssh -t example.com 'cd /foo/bar; exec $SHELL -l'

Función bash

Puede simplificar el comando envolviéndolo en una función bash. Digamos que solo quieres escribir esto:

sshcd example.com /foo/bar

Puede hacer que esto funcione agregando esto a su ~/.bashrc:

sshcd () { ssh -t "$1" "cd \"$2\"; exec \$SHELL -l"; }

Si está utilizando una variable que existe en la máquina remota para el directorio, asegúrese de escapar de ella o ponerla entre comillas simples. Por ejemplo, esto hará un CD al directorio que está almacenado en la JBOSS_HOMEvariable en la máquina remota:

sshcd example.com \$JBOSS_HOME

SSH Config File

Si desea ver este comportamiento todo el tiempo para hosts específicos (o cualquiera) con el comando ssh normal sin tener que usar argumentos de línea de comando adicionales, puede establecer las opciones RequestTTYy RemoteCommanden su archivo de configuración ssh.

Por ejemplo, me gustaría escribir solo este comando:

ssh qaapps18

pero quiero que siempre se comporte como este comando:

ssh -t qaapps18 'cd $JBOSS_HOME; exec $SHELL'

Entonces agregué esto a mi ~/.ssh/configarchivo:

Host *apps*
    RequestTTY yes
    RemoteCommand cd $JBOSS_HOME; exec $SHELL

Ahora esta regla se aplica a cualquier host con "aplicaciones" en su nombre de host.

Para obtener más información, consulte http://man7.org/linux/man-pages/man5/ssh_config.5.html

Dibujó
fuente
13

Basado en las adiciones a la respuesta de @ rogeriopvl, sugiero lo siguiente:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && bash"

El encadenamiento de comandos por &&hará que el siguiente comando se ejecute solo cuando el anterior haya tenido éxito (en lugar de usarlo ;, que ejecuta comandos secuencialmente). Esto es particularmente útil cuando se necesita cdun directorio que ejecuta el comando.

Imagina hacer lo siguiente:

/home/me$ cd /usr/share/teminal; rm -R *

El directorio teminalno existe, lo que hace que permanezca en el directorio de inicio y elimine todos los archivos allí con el siguiente comando.

Si usas &&:

/home/me$ cd /usr/share/teminal && rm -R *

El comando fallará después de no encontrar el directorio.

Bas Peeters
fuente
1
Usé comillas simples y no comillas dobles con un comando sin && una vez y me mordió en el trasero, mal ... aprendí mi lección.
Gavin Pickin
4

En mi caso muy específico, solo quería ejecutar un comando en un host remoto, dentro de un directorio específico de una máquina esclava Jenkins:

ssh myuser@mydomain
cd /home/myuser/somedir 
./commandThatMustBeRunInside_somedir
exit

Pero mi máquina no pudo realizar el ssh (supongo que no pudo asignar un pseudo-tty) y me mantuvo dando el siguiente error:

Pseudo-terminal will not be allocated because stdin is not a terminal

Podría solucionar este problema pasando "cd a dir + mi comando" como parámetro del comando ssh (para no tener que asignar un Pseudo-terminal) y pasando la opción -T para decirle explícitamente al comando ssh que no hice No necesita asignación pseudo-terminal.

ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"
Mauricio Reis
fuente
3

Yo uso la variable de entorno CDPATH

Remolino
fuente
Útil solo si estaba interesado en un directorio por máquina. Necesito una forma de pasar información a la máquina remota. La solución de Roger hace exactamente eso.
Frosty
2

yendo un paso más allá con la -tidea. Mantengo un conjunto de scripts que llaman al siguiente para ir a lugares específicos en mis hosts visitados con frecuencia. Los guardo todos ~/biny mantengo ese directorio en mi camino.

#!/bin/bash

# does ssh session switching to particular directory
# $1, hostname from config file 
# $2, directory to move to after login
# can save this as say 'con' then
# make another script calling this one, e.g.
# con myhost repos/i2c

ssh -t $1 "cd $2; exec \$SHELL --login"
DKebler
fuente
1

Otra forma de ir directamente después de iniciar sesión es crear "Alias". Cuando inicie sesión en su sistema, simplemente escriba ese alias y estará en ese directorio.

Ejemplo: Alias ​​= myfolder '/ var / www / Folder'

Después de iniciar sesión en su sistema, escriba ese alias (esto funciona desde cualquier parte del sistema)
este comando, si no está en bashrc, funcionará para la sesión actual. Entonces también puede agregar este alias a bashrc para usarlo en el futuro

$ myfolder => te lleva a esa carpeta

insomia
fuente
-3

SSH en sí mismo proporciona un medio de comunicación, no sabe nada sobre directorios. Dado que puede especificar qué comando remoto ejecutar (este es, por defecto, su shell), comenzaría allí.

Jan Jungnickel
fuente
44
Esta es una respuesta parcial, no una solución.
AL
-7

simplemente modifique su hogar con el comando: usermod -d /newhome username

Borja Moll
fuente
1
No aconsejado Cambiar su directorio de inicio probablemente hará que otras cosas se rompan.
Bronson