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.

  1. Creamos una carpeta en donde queramos que albergará nuestro script auto_ssh. Para este ejemplo, usaré la carpeta /home/esteban/my_scripts.
  2. En nuestro directorio raíz ubicamos el archivo .bashrc. Este archivo está oculto por defecto. Para revelarlo, presionamos ctrl+h en el explorador de archivos.
  3. Agregamos a este archivo la siguiente linea al final: export PATH=$PATH:~/my_scripts
  4. 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.