Supongamos que trabajamos en un proyecto de computación científica y el código lo hemos desarrollado en nuestro computador personal. Al momento de hacer la prueba definitiva de aquel código encontramos que nuestro computador se ha congelado.

Para determinadas situaciones, la complejidad de los cálculos que necesitamos puede incrementar las exigencias en memoria RAM y de uso de los procesadores. No es extraño que en este escenario, nuestro computador personal no sea capaz de efectuar la operación, o ni siquiera ser capaz de iniciarla.

Los grupos de investigación o de análisis de datos que requieren esfuerzo computacional exigente suelen tener acceso a máquinas poderosas dedicadas solamente a esta tarea. Llamaremos a estos computadores servidor o cluster. Típicamente el flujo de trabajo consiste en escribir el código que efectuará nuestro trabajo en el computador cotidiano, y luego de probarlo, enviarlo al servidor para ejecutarlo remotamente. De esa forma, logramos calcular con la complejidad que sea necesaria.

1. SSH, en pocas palabras

La sigla significa Security Shell. No estamos interesados en los detalles técnicos qué significa esto, si no más bien en su uso. En la práctica ofrece:

  • Acceso desde tu computador local a un servidor mediante un usuario y clave. Cada vez que necesites interactuar con el servidor debes presentar estas credenciales.
  • La comunicación entre el servidor y tu computador está encriptada, lo que hace que la comunicación sea difícil de vulnerar externamente.

En general, Linux y MacOS tienen integrados una versión de SSH llamada OpenSSH. No debería ser necesario instalar programas adicionales (con toda seguridad esto vale para cualquier distribución basada en Ubuntu/Debian).

Observación: En esta guía estamos suponiendo que ya tienes un acceso a un servidor. Estas credenciales deben ser obtenidas con el administrador.

El comando que inicia la sesión SSH es simplemente ssh. Para acceder a tu cuenta en el servidor escribimos directamente en la terminal

ssh nombre_de_usuario@direccion_ip_servidor

en este comando, las variables son

  • nombre_de_usuario: es el nombre de la cuenta de usuario en el servidor.
  • direccion_ip_servidor: la dirección IP o URL de servidor al cual queremos acceder.

La primera vez que accedan a un servidor externo, se solicitará conformación dado que esta conexión es desconocida. La terminal emitirá el siguiente mensaje:

The authenticity of host ‘nombre_usuario (direccion_ip)’ can’t be established.
RSA key fingerprint is ‘muchos_numeros’
Are you sure you want to continue connecting? (yes/no)

Simplemente escribir y o yes y pulsar enter. Como ejemplo, ingresaré desde mi computador esteban-ThinkPad-T490 mediante SSH a mi cuenta en otro computador, esteban-Inspiron-N5050.

Aquí

  • esteban: es mi nombre de usuario.
  • 192.168.1.10: es la dirección del computador al que quiero ingresar. La dirección puede tener formato de página web también.

El servidor pedirá ingresar la clave: es normal que no se escriba nada en pantalla. Pulsar enter . Ya estoy en mi cuenta en esteban en el computador esteban-Inspiron-N5050.

Ahora puedo lanzar mis códigos sin problema.

2. Copiando archivos y carpetas

Para efectuar cualquier tarea, debemos transferir nuestro código al servidor. Para ello ocuparemos scp. La sintaxis es bastante sencilla, como veremos a continuación.

Comando útil: reiteradamente necesitaremos saber el directorio en que estamos trabajando. Para ello podemos usar el comando pwd.

2.1 Copiando archivos individuales al servidor

Para un archivo individual hacemos

scp nombre_del_archivo nombre_de_usuario@direccion_ip_servidor:directorio_remoto

Luego de ejecutar este comando, se solicitarán las credenciales ssh para permitir la operación. Describo cada uno de los términos

  • nombre_del_archivo: aquí estamos asumiendo que la terminal ha sido lanzada en donde está tu archivo. En caso que no, debes declarar la ruta al directorio actual y al final el nombre del archivo.
  • directorio_remoto: la carpeta en el servidor remoto en donde se alojará el archivo.

Vamos a copiar el archivo hello.py al directorio Documents en esteban-Inspiron-N5050. Para hacer el ejercicio completo, abriré un software que permite crear dos terminales en uno, llamado Terminator

2.2 Copiando carpetas al servidor

A veces queremos copiar carpetas enteras con múltiples archivos. La sintaxis es muy similar, pero esta vez anteponemos el flag -r que denota recursividad (es decir, copiar todos los archivos). Igualmente, estamos asumiendo que el directorio actual es en donde está ubicada la carpeta a mover. En caso opuesto, hay que declarar su ruta completa.

scp -r carpeta nombre_usuario@direccion_servidor:directorio_remoto

Ejemplo: voy a copiar la carpeta parity_code con todo su contenido al escritorio del esteban-Inspiron-N5050:

Si por alguna razón es conveniente comprimir la carpeta en un archivo .zip, podemos copiar este fichero como si fuera un archivo individual

zip -r archivo_final.zip carpeta_a_comprimir_1 ... carpeta_a_comprimir_n

2.3 Copiando archivos o carpetas desde el servidor

Suponiendo que hemos logrado la ejecución de nuestro código de manera satisfactoria. Ahora necesitamos extraer la información desde el servidor. Abriendo una terminal en nuestro computador local, escribimos ahora

scp nombre_de_usuario@direccion_ip_servidor:directorio_remoto directorio_local

Si se trata de una carpeta añadimos el flag -r tal cual en la sección anterior. Aquí estamos suponiendo que sabemos la ruta del archivo o carpeta que queremos copiar. Si este no es el caso, hacemos ssh y al encontrarlo, copiamos la dirección que arroje pwd.

Alternativa: Existen programas que facilitan esta tarea. Un ejemplo tradicional es FileZilla. Recomiendo de todas maneras usar scp puesto que si se requieren más capas de ssh (por ejemplo, entrar a un computador para entrar a otro) FileZilla servirá una sola vez.

3. Cerrar la terminal y no matar el proceso

Habitualmente las operaciones que debemos ejecutar toman un tiempo largo. En la práctica, el proceso se ejecutará mientras la terminal que lo albergue se mantenga abierta. Para evitar esta dependencia en la terminal, cualquier proceso que queramos ejecutar se debe lanzar como

nohup el_comando &

Cualquier output que el código lance será escrito en un archivo llamado nohup.out. La terminal ya se puede cerrar y el código seguirá adelante de manera normal.


En la segunda parte de este guía mostraré algunos pequeños trucos que pueden hacer la experiencia más inteligente: automatizar algunos comandos usando Bash, generar un programa que de notificaciones sobre la condición de tus trabajos mediante Telegram entre otras ideas divertidas.