2009-03-09 9 views
149

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:¿Cómo puedo ssh directamente a un directorio en particular?

 
localhost ~]$ ssh somehost 

Welcome to somehost! 

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

Tengo secuencias de comandos que permiten determinar qué host y el directorio que tengo que entrar pero no puedo encontrar una manera de hacer esto:

 
localhost ~]$ go_to_dir Foo 

Welcome to somehost! 

somehost Foo]$ 

Es Hay una manera fácil, inteligente o de cualquier manera para hacer esto?

Respuesta

271

Usted puede hacer lo siguiente:

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

esta manera, se conseguirá una cáscara de la derecha en la 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 se utiliza -t entonces aparecerá ningún mensaje.
  • Si no se agrega ; bash entonces la conexión se cierran y el control regresa a su máquina local
+0

Ejecutar el caparazón al final fue la última pieza del rompecabezas. Gracias. – Frosty

+18

en mi caso -la parte faltante – Mathieu

+2

Utilicé "csh" en lugar de "bash" al final porque mi caparazón era csh. ¡Solo una nota! – quantum

-1

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

+3

Esto es una respuesta parcial, no una solución. –

2

utilizo la variable de entorno CDPATH

+0

Útil solo si estoy 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 justamente eso. – Frosty

40

Se podría añadir

cd /some/directory/somewhere/named/Foo 

a su archivo .bashrc (o .profile o como se llame) en el otro host. De esta forma, no importa lo que haga o dónde ssh, cada vez que inicie sesión en ese servidor, encontrará cd en el directorio adecuado para usted, y todo lo que tiene que hacer es usar ssh como lo hace normalmente.

De la maldición, la solución de rogeriopvl funciona también, pero es un poco más detallada, y tienes que acordarte de hacerlo todo el tiempo (a menos que hagas un alias) para que parezca menos "divertido".

+1

+1, esto parece más adecuado si necesita un directorio constante en lugar de hacer que el comando ssh recuerde cada vez más a qué directorio se va a mover cuando se conecta al equipo X – Tebe

1

Otra forma de acceder 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/carpeta'

Después de iniciar sesión en el sistema escriba ese alias (esto funciona desde cualquier parte del sistema)
este comando si no en bashrc se trabajar para la sesión actual. Así también se puede añadir a este alias bashrc de usar que en el futuro

$ myfolder => te lleva a esa carpeta

14

He creado una herramienta para SSH y CD en un servidor de forma consecutiva - bien llamado sshcd.Para el ejemplo que has dado, simplemente usarás:

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

¡Avísame si tienes alguna pregunta o problema!

+0

Sería genial si pudiera definir una nueva configuración en ~ /. ssh/config y léelo desde allí;) – Alexar

+0

@Alexar https://github.com/fraction/sshcd/issues :) – christianbundy

-5

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

+0

No se recomienda. Cambiar el directorio de inicio probablemente hará que se rompan otras cosas. – bronson

0

En mi caso muy específico, sólo quería para ejecutar un comando en un host remoto, dentro de un directorio específico de una máquina de esclavos Jenkins:

ssh [email protected] 
cd /home/myuser/somedir 
./commandThatMustBeRunInside_somedir 
exit 

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

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

Pude solucionar este problema pasando "cd to dir + my command" 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 al comando ssh que no necesitó una asignación pseudo-terminal.

ssh -T [email protected] "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir" 
0

Sobre la base de adiciones a la respuesta de @ rogeriopvl, propongo lo siguiente:

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

Encadenamiento de comandos por && hará que la próxima ejecución de comandos sólo cuando la anterior se ha realizado correctamente (en lugar de utilizar ; , que ejecuta comandos secuencialmente). Esto es particularmente útil cuando se necesita cd en un directorio que realiza el comando.

imaginar haciendo lo siguiente:

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

El directorio teminal no existe, lo que provoca que se quede en el directorio principal y eliminar todos los archivos de allí con el siguiente comando.

Si utiliza &&:

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

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

0

yendo un paso más allá con la idea -t. Mantengo un conjunto de scripts llamando al siguiente para ir a lugares específicos en mis hosts visitados con frecuencia. Los guardo todos en ~/bin y 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" 
Cuestiones relacionadas