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?
ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
ssh server -t "cd /my/remote/directory; bash --login"
Podrías agregar
a su
.bashrc
archivo (o.profile
como lo llame) en el otro host. De esa manera, no importa lo que haga o de dónde provengassh
, cada vez que inicie sesión en ese servidor, lo harácd
en el directorio adecuado para usted, y todo lo que tiene que hacer es usarlossh
normalmente.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".
fuente
He creado una herramienta para SSH y CD en un servidor consecutivamente, acertadamente llamado sshcd . Para el ejemplo que ha dado, simplemente usaría:
¡Avíseme si tiene alguna pregunta o problema!
fuente
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:
El uso de comillas dobles le permitirá usar variables de su máquina local, a menos que se escapen (como
$SHELL
aquí). Alternativamente, puede usar comillas simples, y todas las variables que use serán las de la máquina de destino:Función bash
Puede simplificar el comando envolviéndolo en una función bash. Digamos que solo quieres escribir esto:
Puede hacer que esto funcione agregando esto a su
~/.bashrc
: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_HOME
variable en la máquina remota: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
RequestTTY
yRemoteCommand
en su archivo de configuración ssh.Por ejemplo, me gustaría escribir solo este comando:
pero quiero que siempre se comporte como este comando:
Entonces agregué esto a mi
~/.ssh/config
archivo: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
fuente
Basado en las adiciones a la respuesta de @ rogeriopvl, sugiero lo siguiente:
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 necesitacd
un directorio que ejecuta el comando.Imagina hacer lo siguiente:
El directorio
teminal
no existe, lo que hace que permanezca en el directorio de inicio y elimine todos los archivos allí con el siguiente comando.Si usas
&&
:El comando fallará después de no encontrar el directorio.
fuente
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:
Pero mi máquina no pudo realizar el ssh (supongo que no pudo asignar un pseudo-tty) y me mantuvo dando el siguiente error:
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.
fuente
Yo uso la variable de entorno CDPATH
fuente
yendo un paso más allá con la
-t
idea. Mantengo un conjunto de scripts que llaman al siguiente para ir a lugares específicos en mis hosts visitados con frecuencia. Los guardo todos~/bin
y mantengo ese directorio en mi camino.fuente
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
fuente
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í.
fuente
simplemente modifique su hogar con el comando:
usermod -d /newhome username
fuente