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


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

Welcome to somehost!

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

Tengo scripts que pueden determinar en qué host y en qué directorio necesito entrar, pero no puedo encontrar una manera de hacer esto:

localhost ~]$ go_to_dir Foo

Welcome to somehost!

somehost Foo]$

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

Author: Ólafur Waage, 2009-03-09

10 answers

Puedes hacer lo siguiente:

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

De esta manera, obtendrás un shell directamente en directory_wanted.


Explicación

  -t      Force pseudo-terminal allocation.  This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services.
          Multiple -t options force tty allocation, even if ssh has no local tty.
  • Si no usas -t entonces no aparecerá ningún mensaje.
  • Si no agrega ; bash entonces la conexión se cerrará y devolverá el control a su máquina local
 316
Author: rogeriopvl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-13 17:25:57

Podrías añadir

cd /some/directory/somewhere/named/Foo

A tu archivo .bashrc (o .profile o como lo llames) en el otro host. De esa manera, no importa lo que hagas o desde dónde ssh, cada vez que inicies sesión en ese servidor, cd irá al directorio adecuado para ti, y todo lo que tienes que hacer es usar ssh como de costumbre.

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

 43
Author: Chris Lutz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-09 15:22:48

He creado una herramienta para SSH y CD en un servidor consecutivamente – apropiadamente llamado sshcd. Para el ejemplo que has dado, simplemente usarías:

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

¡Avísame si tienes alguna pregunta o problema!

 17
Author: christianbundy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-12 11:33:32

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

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

Encadenar comandos mediante && hará que el siguiente comando se ejecute solo cuando el anterior haya tenido éxito (en lugar de usar ;, que ejecuta comandos secuencialmente). Esto es particularmente útil cuando se necesita cd a un directorio que realiza el comando.

Imagine hacer lo siguiente:

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

El directorio teminal no existe, lo que hace que permanezca en el directorio home y quitar todos los archivos con el siguiente comando.

Si usa &&:

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

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

 3
Author: Maneating Koala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-14 09:20:13

Utilizo la variable de entorno CDPATH

 2
Author: Eddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-09 15:05:52

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

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

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

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

Podría evitar este problema pasando "cd a dir + mi comando" como un parámetro del comando ssh (para no tener que asignar un Pseudo-terminal) y pasando la opción-T para indicar explícitamente a el comando ssh que no necesitaba asignación de pseudo-terminal.

ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"
 2
Author: Mauricio Reis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-13 15:45:01

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. Así que también puede agregar este alias a bashrc para usarlo en el futuro

My myfolder = > te lleva a esa carpeta

 1
Author: insomiac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-18 21:30:37

Yendo un paso más allá con la idea -t. Guardo un conjunto de scripts que llaman al siguiente para ir a lugares específicos en mis anfitriones visitados con frecuencia. Los guardo todos en ~/bin y guardo 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"
 0
Author: DKebler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-25 04:11:37

SSH 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í.

 -1
Author: Jan Jungnickel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-16 14:09:37

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

 -5
Author: Borja Moll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-11 04:13:33