bash - saber - ¿Cómo puedo ssh directamente a un directorio en particular?
manejo de cadenas en shell script (10)
Basado en las adiciones a la respuesta de @ rogeriopvl, sugiero lo siguiente:
ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && bash"
Encadenar comandos por &&
hará que el siguiente comando se ejecute solo cuando el anterior fue exitoso (en oposición a usar ;
que ejecuta comandos secuencialmente). Esto es particularmente útil cuando se necesita realizar un cd
a un directorio que realiza el comando.
Imagina hacer lo siguiente:
/home/me$ cd /usr/share/teminal; rm -R *
El directorio teminal
no existe, lo que hace que permanezca en el directorio de inicio y elimine todos los archivos con el siguiente comando.
Si usas &&
:
/home/me$ cd /usr/share/teminal && rm -R *
El comando fallará después de no encontrar el directorio.
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 qué host y en qué directorio necesito ingresar, pero no puedo encontrar la forma de hacerlo:
localhost ~]$ go_to_dir Foo Welcome to somehost! somehost Foo]$
¿Hay una manera fácil, inteligente o de hacer esto?
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 (no podría asignar un pseudo-tty, supongo) y me mantuvo con 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 lo hice no necesita asignación pseudo-terminal.
ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"
He creado una herramienta para SSH y CD en un servidor de forma consecutiva, acertadamente llamada sshcd . Para el ejemplo que has dado, simplemente usarías:
sshcd somehost:/some/directory/somewhere/named/Foo
¡Avíseme si tiene alguna pregunta o problema!
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 / 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 puedes agregar este alias a bashrc para usarlo en el futuro
$ myfolder => lo lleva a esa carpeta
Puedes hacer lo siguiente:
ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash"
De esta manera, obtendrás un shell directamente en el directorio deseado.
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 usa
-t
entonces no aparecerá un mensaje. - Si no agregas
; bash
; bash
entonces la conexión se cerrará y devolverá el control a su máquina local
SSH 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í.
Uso la variable de entorno CDPATH
Usted podría agregar
cd /some/directory/somewhere/named/Foo
a su archivo .bashrc
(o .profile
o como se llame) en el otro host. De esa forma, no importa lo que hagas o de dónde ssh
, cada vez que inicies sesión en ese servidor, se cd
al directorio adecuado para ti, y todo lo que tienes que hacer es usar ssh
como siempre.
De la maldición, la solución de rogeriopvl también funciona, pero es un poco más prolija, y tienes que acordarte de hacerlo todo el tiempo (a menos que hagas un alias), por lo que parece un poco menos "divertido".
simplemente modifique su casa con el comando: usermod -d /newhome username
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"