📚 Módulo 6: Conectando tu terminal al mundo real¶
Duración estimada: 3-4 horas según tu ritmo y experiencia.
Objetivo: Usar ssh para conexiones remotas, curl para interactuar con APIs y URLs, jq para procesar JSON, y herramientas de monitoreo del sistema como top y ps. 🎯
Prerrequisitos: Haber completado los Módulos 1-5. Si es posible, disponer de una máquina remota con SSH habilitado para los ejercicios de conexión.
Nota: Los conceptos de red y API son fundamentales en entornos DevOps y administración de sistemas. Practica los ejemplos con APIs públicas si no tienes servidor propio.
📖 Contenidos del Módulo¶
6.1. ssh: Conéctate a máquinas remotas 🌱¶
Teoría:
SSH (Secure Shell) es un protocolo que permite conectarse de forma cifrada a servidores remotos. La sintaxis básica es ssh usuario@host. Puedes ejecutar comandos directamente sin abrir una sesión interactiva añadiéndolos al final: ssh usuario@host "comando". Las claves SSH (ssh-keygen) son la alternativa más segura a las contraseñas.
Práctica:
- Genera un par de claves SSH (si aún no tienes una):
ssh-keygen -t ed25519 -C "tu_email@ejemplo.com"
Acepta la ruta por defecto (~/.ssh/id_ed25519). Añade una passphrase para mayor seguridad.
- Muestra tu clave pública:
cat ~/.ssh/id_ed25519.pub
Esta es la clave que copiarás al servidor remoto para autenticarte sin contraseña.
- Copia la clave pública al servidor remoto:
ssh-copy-id usuario@servidor_remoto
Esto añade tu clave al archivo ~/.ssh/authorized_keys del servidor.
- Conéctate al servidor remoto:
ssh usuario@servidor_remoto
Una vez dentro, prueba algunos comandos (ls, pwd) y sal con exit.
- Ejecuta un comando remoto sin abrir sesión interactiva:
ssh usuario@servidor_remoto "uptime && df -h"
Muy útil para scripts de monitoreo que comprueban el estado de un servidor remoto sin necesidad de una sesión completa.
Consejo: Configura
~/.ssh/configpara guardar hosts frecuentes con alias. Asíssh mi_servidorsustituye assh usuario@192.168.1.100 -p 2222. 💡
6.2. curl: Interactúa con la web y APIs 🖌️¶
Teoría:
curl transfiere datos desde y hacia URLs. Es la herramienta estándar para interactuar con APIs REST desde la terminal. Las opciones más usadas son:
-s— modo silencioso (sin barra de progreso).-o archivo— guarda la respuesta en un archivo.-H "Cabecera: valor"— añade una cabecera HTTP.-X MÉTODO— especifica el método HTTP (GET, POST, PUT, DELETE).-d "datos"— envía datos en el cuerpo de la petición (útil con POST).
Práctica:
- Descarga el contenido de una URL:
curl https://example.com
- Obtén datos de una API pública (sin necesidad de clave):
curl -s "https://api.github.com/users/github"
- Guarda la respuesta en un archivo:
curl -s "https://api.github.com/users/github" -o github_info.txt
cat github_info.txt
- Envía una petición POST con datos JSON:
curl -s -X POST "https://httpbin.org/post" \
-H "Content-Type: application/json" \
-d '{"nombre": "Bash", "version": "5.1"}'
httpbin.org es un servicio público que devuelve exactamente lo que le envías, ideal para pruebas.
- Comprueba solo el código de estado HTTP de una URL:
curl -s -o /dev/null -w "%{http_code}" https://example.com
-w "%{http_code}" imprime solo el código de respuesta (200, 404, 500, etc.).
Advertencia: Nunca incluyas contraseñas o tokens de API directamente en un script. Guárdalos en variables de entorno o en un archivo de configuración con permisos
600. 🛑
6.3. jq: Procesa JSON desde la terminal ⚙️¶
Teoría:
jq es un procesador de JSON por línea de comandos. Permite extraer campos, filtrar y transformar estructuras JSON de forma concisa. La expresión más básica es .campo para acceder a una propiedad, y .campo[] para iterar sobre un array.
Instálalo si no está disponible:
sudo apt install jq # Debian/Ubuntu
sudo dnf install jq # Fedora/RHEL
brew install jq # macOS
Práctica:
- Procesa JSON básico:
echo '{"nombre": "Bash", "version": 5}' | jq '.'
. con jq formatea el JSON con indentación y colores.
- Extrae un campo específico:
echo '{"nombre": "Bash", "version": 5}' | jq '.nombre'
- Combina con
curlpara extraer datos de una API:
curl -s "https://api.github.com/users/github" | jq '.name, .public_repos'
- Itera sobre un array JSON:
echo '[{"id":1,"item":"a"},{"id":2,"item":"b"}]' | jq '.[].item'
- Filtra elementos de un array según una condición:
echo '[{"nombre":"Ana","edad":30},{"nombre":"Luis","edad":22}]' \
| jq '[.[] | select(.edad > 25)] | .[].nombre'
Consejo: Prueba tus expresiones
jqen jqplay.org antes de usarlas en un script. Ahorra mucho tiempo de depuración. 💡
6.4. Monitoreo del sistema: top, ps y df 📊¶
Teoría:
Linux incluye herramientas nativas para monitorear el estado del sistema:
top— muestra procesos en tiempo real con uso de CPU y memoria.ps aux— lista todos los procesos en ejecución en un momento dado.df -h— muestra el espacio en disco de cada partición montada.free -h— muestra el uso de memoria RAM y swap.
Práctica:
- Observa los procesos en tiempo real:
top
Pulsa q para salir. Observa las columnas %CPU y %MEM.
- Lista todos los procesos con
ps:
ps aux | head -20
- Busca un proceso concreto:
ps aux | grep "bash"
- Comprueba el espacio en disco:
df -h
- Crea un script de informe del sistema:
nano informe_sistema.sh
#!/bin/bash
echo "=== Informe del sistema: $(date) ==="
echo ""
echo "--- Uso de disco ---"
df -h
echo ""
echo "--- Memoria ---"
free -h
echo ""
echo "--- Procesos con mayor uso de CPU (top 5) ---"
ps aux --sort=-%cpu | head -6
Guarda, dale permisos y ejecútalo.
Consejo: Usa
htop(si está instalado) como alternativa visual e interactiva atop. Es mucho más cómodo para explorar procesos. 💡
6.5. Scripts remotos y automatización de red 🚀¶
Teoría:
Combinando ssh, curl y las herramientas de monitoreo puedes construir scripts que gestionan sistemas remotos, comprueban el estado de servicios o envían alertas automáticas. La clave es usar autenticación con claves SSH (sin contraseña) para que los scripts no necesiten interacción humana.
Práctica:
- Crea un script que compruebe si un host responde:
nano ping_check.sh
#!/bin/bash
HOST="8.8.8.8"
if ping -c 1 -W 2 "$HOST" &>/dev/null; then
echo "$HOST está accesible"
else
echo "$HOST NO responde"
fi
- Amplía el script para comprobar varios hosts:
nano ping_multi.sh
#!/bin/bash
hosts=("8.8.8.8" "1.1.1.1" "192.168.1.1")
for host in "${hosts[@]}"; do
if ping -c 1 -W 2 "$host" &>/dev/null; then
echo "$host: OK"
else
echo "$host: SIN RESPUESTA"
fi
done
- Crea un script que verifique si un servicio web devuelve código 200:
nano check_web.sh
#!/bin/bash
URL="https://example.com"
codigo=$(curl -s -o /dev/null -w "%{http_code}" "$URL")
if [ "$codigo" -eq 200 ]; then
echo "$URL responde correctamente (HTTP $codigo)"
else
echo "AVISO: $URL devuelve HTTP $codigo"
fi
- Ejecuta un comando en un servidor remoto desde un script:
nano remoto.sh
#!/bin/bash
SERVIDOR="usuario@servidor_remoto"
echo "Espacio en disco del servidor remoto:"
ssh "$SERVIDOR" "df -h /"
- Guarda el informe remoto en un archivo local:
ssh "$SERVIDOR" "df -h" > informe_remoto.txt
echo "Informe guardado en informe_remoto.txt"
Consejo: Centraliza los datos de conexión (usuario, host, puerto) en variables al principio del script para que sea fácil adaptarlo a distintos entornos. 💡
🛠️ Ejercicios prácticos¶
- SSH: Genera claves SSH y documenta los pasos para conectarte a un servidor sin contraseña.
- curl: Descarga los datos públicos de tu usuario de GitHub con
curly guárdalos en un archivo JSON. - jq: Extrae tu número de repositorios públicos del JSON descargado en el ejercicio anterior.
- Monitoreo: Crea un script que muestre el top 3 de procesos por uso de memoria y lo guarde en
top_procesos.txt. - Desafío: Crea un script que compruebe cada minuto (con
sleep 60) si una URL responde con HTTP 200, y escriba una línea en un log si falla.
📝 Evaluación¶
Cuestionario (5 preguntas):
- ¿Qué ventaja tienen las claves SSH sobre las contraseñas?
- ¿Cómo obtienes solo el código de estado HTTP con
curl? - ¿Para qué sirve
jq '.'? - ¿Qué diferencia hay entre
topyps aux? - ¿Por qué es importante no incluir contraseñas directamente en los scripts?
Tarea práctica:
Crea un script monitor_web.sh que:
- Compruebe el estado HTTP de tres URLs definidas en un array.
- Registre en monitor.log la fecha, la URL y el código de respuesta de cada comprobación.
- Muestre un resumen al final indicando cuántas URLs respondieron correctamente.
Entrega: El script y el archivo monitor.log generado.
🎬 Vídeo con la solución de la evaluación: Próximamente.
🎉 Recursos adicionales¶
- Documentación:
man ssh,man curl,man jq. - Manual de jq: jq Manual (stedolan.github.io) — referencia completa de filtros y expresiones.
- Práctica de jq: jqplay.org — editor interactivo en el navegador.
- Referencia de curl: curl.se/docs — documentación oficial.
Tip: Practica
curlyjqjuntos usando APIs públicas como la de GitHub, OpenWeatherMap o JSONPlaceholder. 💡
🚀 Siguientes pasos¶
¡Felicidades por completar el Módulo 6! En el Módulo 7 construirás un proyecto final completo: un sistema de backups con monitoreo, manejo avanzado de errores y optimización. ¡El gran proyecto te espera! ✍️