Usando SSH - Parte 2 (ESP)
Este post es la continuación del post, por lo que es recomendado visitarlo primero.
En la parte 1 del tutorial de SSH, nos familiarizamos con las funcionalidades básicas que permitirían hacer trabajo real. Sin embargo, ejecutar múltiples veces estos comandos de manera reiterativa puede resultar agotador y repetitivo.
A continuación presento algunas ideas de scripts para automatizar procesos que ejecutamos varias veces o para revisar nuestros resultados más rápido.
1. Automatizando iniciar sesión
1.1 Implementación básica
Hemos visto que para ingresar mediante SSH a otro computador hacemos
ssh usuario@direccion_del_servidor
Después de ingresar múltiples veces este comando decidí automatizarlo. Para hacerlo utilizaremos except
: un pequeño programa que podemos usar para autenticar nuestra credencial ssh
de manera automática.
Observación En el script que haremos, almacenaremos la contraseña de nuestra cuenta explícitamente en el script. Si esto te parece peligroso, más adelante mostraré como usar una forma más segura. Si solo tú tienes acceso a este script, esto no debería comprometer la seguridad en ningún grado.
Para comenzar, tenemos que instalar expect
. Para distribuciones basadas en Ubuntu, ejecutamos
sudo apt-get update -y
sudo apt-get install -y expect
Como el propósito de este blog es mostrar códigos funcionales y no enseñar Bash
, presentaré el código que ejecuta la tarea explicando brevemente su funcionalidad. Aquí el código
set host "direcion_del_servidor"
set user "usuario"
set password "clave"
spawn ssh $user@$host -p 22
expect {
"yes/no*" {
send "yes\n"
exp_continue
}
"?assword*" {
send "$password\n"
interact
exit 0;
}
}
exit 1
En la línea número 4, notar que ejecutamos el comando ssh
que es el que introdujimos en la primera parte del tutorial. Se especifica el puerto número 22 para efectuar la conexión, que es la opción por defecto de ssh
. Desde la línea 5 en adelante, expect
nos ayudará a interactuar con la terminal cuando esta solicite información.
Guardamos el archivo, con un nombre digamos auto_ssh
. Para hacer nuestro script ejecutable, en la misma carpeta hacemos
chmod +rx auto_ssh
Y ejecutamos simplemente haciendo auto_ssh
.
1.2 Generando un comando ejecutable desde cualquier carpeta
Podrán notar que nuestro script anterior tiene una limitación: debe ejecutarse solamente si la terminal es lanzada en la carpeta en donde está el script. Sería deseable que podamos ejecutar este script desde cualquier carpeta en donde estemos para realizar una conexión rápida.
- Creamos una carpeta en donde queramos que albergará nuestro script
auto_ssh
. Para este ejemplo, usaré la carpeta/home/esteban/my_scripts
. - En nuestro directorio raíz ubicamos el archivo
.bashrc
. Este archivo está oculto por defecto. Para revelarlo, presionamosctrl+h
en el explorador de archivos. - Agregamos a este archivo la siguiente linea al final:
export PATH=$PATH:~/my_scripts
- Ahora podemos ejecutar
auto_ssh
desde cualquier carpeta de nuestro computador.
2. Automatizar el copiado
Podemos usar la misma idea para automatizar el copiado de archivos desde nuestro computador local al servidor. Una diferencia importante, es que el comando para copiar archivos o carpetas es levemente diferente, así que tenemos que hacernos cargo de esos casos.
#!/usr/bin/expect -f
set user "usuario"
set password "clave"
set host "direccion_servidor:directorio_en_servidor"
lassign $argv file
if {[file isfile $file]} {
spawn scp $file $user@$host
expect {
"yes/no*" {
send "yes\n"
exp_continue
}
"?assword*" {
send "$password\n"
interact
exit 0;
}
}
exit 1
}
if {[file isdirectory $file]} {
spawn scp -r $file $user@$host
expect {
"yes/no*" {
send "yes\n"
exp_continue
}
"?assword*" {
send "$password\n"
interact
exit 0;
}
}
exit 1
}
Como se puede ver, el script es conceptualmente idéntico al caso anterior.