Apuntes DAM
Volver al inicio

Ejercicios de Bash para practicar

45 ejercicios de Bash de los módulos de Sistemas Informáticos, Despliegue de Aplicaciones Web. Scripts de shell de administración de sistemas: variables, condiciones, bucles, lectura de datos, ficheros, permisos y procesos.

Cada ejercicio trae enunciado, pistas y pruebas automáticas: escribes el código aquí mismo, lo ejecutas y ves al momento si es correcto. Tu progreso se guarda en el tema del que sale cada ejercicio.

Sistemas · Administración de Sistemas Operativos ver el tema

  • Saludo con validación

    Fácil

    Lee un nombre por teclado. Si está vacío, muestra «Error: nombre vacío»; si no, muestra «Hola, NOMBRE» y en otra línea «Tu nombre tiene N letras».

  • Tabla de multiplicar con bucle

    Fácil

    Lee un número. Si no es un entero positivo, muestra «Error: número no válido». Si lo es, muestra su tabla del 1 al 10 con el formato «N x i = resultado».

  • Encuentra el fallo: el saludo que no se guarda

    Fácil

    El script lee un nombre y debería mostrar «Hola, NOMBRE». En su lugar muestra un error y una línea vacía. Corrígelo.

  • Analizar un fichero de log

    Medio

    Por la entrada llega un log con líneas «FECHA HORA NIVEL IP mensaje». Muestra: • «Errores: N» (líneas con nivel ERROR) • «Avisos: N» (nivel WARN) • «IP con más errores: IP (N)» con la IP que más aparece en las líneas ERROR.

  • Usuarios del sistema desde /etc/passwd

    Medio

    Por la entrada llega el contenido de un /etc/passwd (campos separados por «:» — usuario:x:UID:GID:comentario:home:shell). Muestra, ordenados por UID, los usuarios «reales» (UID ≥ 1000 y distinto de 65534) con el formato «usuario (UID) -> home [shell]», y al fi…

  • Crear ficheros y asignar permisos

    Medio

    Por la entrada llega una lista de nombres de fichero (uno por línea). En un directorio temporal (mktemp -d), crea cada fichero y asígnale permisos: 750 si termina en .sh, 600 si termina en .key y 644 en cualquier otro caso. Después muestra, ordenados por nombr…

  • Encuentra el fallo: la alerta que salta siempre

    Medio

    El script lee el porcentaje de uso del disco y debería mostrar «ALERTA: disco al N %» si pasa de 80, u «OK» si no. Con un uso del 9 % también da la alerta. Corrígelo.

  • Encuentra el fallo: el mayor que no lo es

    Medio

    El script lee dos números en la misma línea y muestra el mayor. Con «7 3» funciona, pero con «10 9» dice que el mayor es 9. Corrígelo.

  • Encuentra el fallo: el nombre con espacio

    Medio

    El script da la bienvenida a Ana López y a cualquier otra persona le dice «No te conozco». Cuando escribe ella su nombre completo, también le dice que no la conoce y aparece un error. Corrígelo.

  • Alerta de espacio en disco

    Difícil

    Por la entrada llega la salida de «df -h» (con su cabecera). Muestra «ALERTA: PUNTO_DE_MONTAJE al N%» para cada sistema de ficheros con un uso igual o superior al umbral que se pasa en la primera línea de la entrada, y «Todo correcto» si no hay ninguno.

  • ¿Quién intenta entrar por SSH?

    Difícil

    La entrada es un fragmento de /var/log/auth.log. Las líneas de contraseñas fallidas tienen la forma «… sshd[PID]: Failed password for USUARIO from IP port N ssh2» o «… Failed password for invalid user USUARIO from IP port N ssh2». Cuenta los intentos fallidos …

  • Encuentra el fallo: el total que se queda en cero

    Difícil

    El script suma los números que recibe por la entrada, uno por línea, y muestra «Total: N». Siempre muestra «Total: 0». Corrígelo.

  • Encuentra el fallo: las 08:09 que rompen la cuenta

    Difícil

    El script lee una hora con el formato HH:MM y muestra los minutos que han pasado desde medianoche. Con 10:30 funciona (630), pero con 08:09 da un error. Corrígelo.

  • Permisos: de letras a octal y al revés

    Muy difícil

    Cada línea es un permiso en notación simbólica de 9 caracteres (rwxr-x---) o en octal de 3 o 4 cifras (750, 4755). Convierte cada uno a la otra notación: «rwxr-x--- = 750» y «0644 = rw-r--r--». Ten en cuenta los bits especiales: setuid (4), setgid (2) y sticky…

Sistemas · Ejercicios de Sistemas Informáticos ver el tema

  • Contar ficheros por extensión

    Medio

    Por la entrada llega una lista de nombres de fichero (uno por línea). Muestra cuántos hay de cada extensión, en minúsculas y ordenadas alfabéticamente, con el formato «ext: N». Los ficheros sin extensión cuentan como «(sin extensión)» y se muestran al final.

  • Validar direcciones IPv4

    Difícil

    Por la entrada llega una dirección por línea. Para cada una muestra «IP válida» o «IP no válida». Es válida si tiene cuatro números separados por puntos, cada uno entre 0 y 255 y sin ceros a la izquierda (salvo el propio 0).

  • Red y broadcast con aritmética de bits

    Difícil

    Por la entrada llega una dirección con prefijo, por ejemplo 192.168.1.130/26. Calcula con bash (sin herramientas externas) y muestra: Red: 192.168.1.128 Broadcast: 192.168.1.191 Hosts: 62

Despliegue · Arquitecturas de Despliegue y la Nube ver el tema

  • ¿Cuántos nueves tiene tu arquitectura?

    Medio

    La primera línea es «objetivo X» (la disponibilidad que exige el cliente, en %). Después, una línea por capa de la arquitectura: «capa nombre disponibilidad réplicas». Las réplicas de una capa están en paralelo (la capa solo cae si caen todas: 1 − (1 − a)^n) y…

  • Un balanceador ponderado con caídas

    Difícil

    Nginx reparte las peticiones entre servidores con pesos distintos usando el algoritmo round robin ponderado «suave». Cada servidor tiene un peso w y un contador cw que empieza en 0. En cada petición: a todos los servidores en servicio se les suma su peso a cw;…

  • Auditoría de un servidor recién instalado

    Muy difícil

    Antes de publicar una aplicación hay que bastionar el servidor. La entrada tiene tres bloques separados por «---»: el fichero sshd_config, la lista de puertos en escucha («protocolo dirección:puerto programa», como la resume ss -tlnp) y una línea «permitidos 2…

Despliegue · Servidores Web: Apache y Nginx ver el tema

  • Generar un virtual host de Nginx

    Fácil

    La entrada es una línea «dominio raíz [puerto]». Genera el bloque server de Nginx con este formato exacto (4 espacios de sangría): «server {», « listen 80;», « server_name dominio www.dominio;» y, si no hay puerto, « root raíz;» y « index index.html;»; si hay …

  • Estadísticas de un access.log

    Medio

    La entrada es un fichero de registro de Nginx en formato combinado. Muestra «Peticiones: N», «Errores 4xx: N», «Errores 5xx: N» y «IP con más peticiones: IP (N)». Si hay empate, gana la IP menor alfabéticamente.

  • Vigilar la caducidad de los certificados

    Medio

    Certbot renueva solo, hasta que un día no lo hace (un cambio de DNS, un puerto cerrado) y la web muestra un aviso de seguridad a todos los visitantes. La primera línea es «hoy AAAA-MM-DD» y las siguientes, «dominio fecha-de-caducidad». Escribe los dominios ord…

  • Cadenas y bucles de redirecciones

    Difícil

    Tras varias migraciones de una web, las redirecciones 301 se acumulan: /antiguo → /intermedio → /nuevo obliga al navegador (y a Google) a dar varios saltos, y un error puede crear un bucle infinito. La entrada tiene reglas «origen destino» (una por línea), una…

  • ¿Qué location atiende la petición?

    Muy difícil

    Entender cómo elige Nginx el bloque location evita horas de depuración. La entrada tiene bloques location («= /ruta», «^~ /prefijo», «~ expresión», «~* expresión» o solo «/prefijo»), una línea «---» y URIs. Aplica el algoritmo de Nginx: 1) si una location exac…

Despliegue · Servidores de Aplicaciones ver el tema

  • Estado de los servicios

    Medio

    Cada línea es el resultado de comprobar un servicio: «nombre código_http milisegundos». Clasifica cada uno como «OK» (200 y menos de 500 ms), «LENTO» (200 y 500 ms o más) o «CAÍDO» (cualquier otro código), con el formato «nombre: ESTADO». Al final, «Estado gen…

  • Revisar el server.xml de Tomcat

    Medio

    La entrada es un fichero server.xml (cada elemento en una línea). Muestra, en el orden en que aparecen: «Apagado: puerto P, orden O» (elemento Server), «Conector P PROTOCOLO» con « (TLS)» si tiene SSLEnabled="true" (si no hay protocol, es HTTP/1.1) y «Host nom…

  • Despliegue atómico con releases y vuelta atrás

    Difícil

    Cada versión se copia en su propia carpeta releases/VERSIÓN y la web apunta a un enlace simbólico current: cambiarlo es instantáneo y volver atrás es apuntarlo a la anterior. Usa carpetas y enlaces reales dentro de /tmp/app. Cada línea es una orden: «desplegar…

  • Despliegue canary: ¿promocionar o revertir?

    Muy difícil

    En un despliegue canary, la versión nueva recibe primero un 5 % del tráfico, luego un 25 %, un 50 % y por fin el 100 %, y solo avanza si se comporta al menos tan bien como la estable. Cada línea es una evaluación con las métricas de ambas versiones: «peticione…

Despliegue · Contenedores con Docker ver el tema

  • Revisar un Dockerfile

    Medio

    La entrada es un Dockerfile. Escribe un aviso por línea, en este orden, cuando corresponda: «Imagen base sin versión concreta» (algún FROM sin etiqueta o con :latest), «apt-get install sin limpiar la caché» (un RUN con apt-get install sin rm -rf /var/lib/apt/l…

  • Puertos de un docker compose

    Medio

    Cada línea describe los puertos de un servicio: «servicio: p1 p2 …», donde cada puerto es «anfitrión:contenedor» (se publica) o solo «contenedor» (queda en la red interna). Para cada puerto, en orden: si es solo interno, «servicio: P solo interno (no se public…

  • Orden de arranque según depends_on

    Difícil

    Docker Compose arranca primero los servicios de los que dependen otros. Cada línea es «servicio: dep1 dep2 …» (puede no tener dependencias). Calcula el arranque por rondas: en cada ronda arrancan a la vez, en orden alfabético, todos los servicios cuyas depende…

  • ¿Qué capas se reconstruyen?

    Muy difícil

    Docker reutiliza cada capa de la construcción anterior si la instrucción es idéntica, si en las instrucciones COPY o ADD no ha cambiado ninguno de los ficheros que copian y si ninguna capa anterior se ha reconstruido (en cuanto una se reconstruye, todas las si…

Despliegue · FTP, DNS y Servicios de Directorio ver el tema

  • Leer una zona DNS

    Medio

    La entrada es un fichero de zona de BIND con una directiva $ORIGIN. Muestra los registros A, AAAA, CNAME y MX, en su orden, con el nombre completo: «www.tienda.com. CNAME tienda.com.». «@» es el propio origen; un nombre que no termina en punto es relativo y se…

  • Revisar una zona DNS antes de publicarla

    Medio

    Un error en la zona puede dejar sin web o sin correo a toda una empresa. La entrada es un fichero de zona con $ORIGIN (ignora comentarios, líneas vacías y otras directivas; cada registro es «nombre IN tipo datos…»; @ es el origen y los nombres sin punto final …

  • Un resolvedor DNS iterativo con caché

    Difícil

    Así trabaja el DNS de tu operadora. La entrada tiene líneas «servidor nombre tipo valor ttl» con lo que sabe cada servidor (el servidor raíz se llama raiz; los demás, por su nombre), una línea «---» y consultas «segundo nombre». Para resolver un nombre: si su …

  • Evaluar filtros de búsqueda LDAP

    Muy difícil

    Las aplicaciones buscan en el directorio de la empresa con filtros LDAP en notación prefija: (uid=ana), (&(objectClass=person)(ou=ventas)), (|(ou=ventas)(ou=soporte)), (!(uid=admin)), (mail=*) (el atributo existe) y comodines como (cn=Ana*) o (mail=*@tienda.es…

Despliegue · Git, Documentación y CI/CD ver el tema

  • La siguiente versión semántica

    Fácil

    Cada línea es «versión tipo», donde la versión es MAYOR.MENOR.PARCHE y el tipo es major, minor o patch. Escribe la siguiente versión: major sube el primero y pone los otros a 0; minor sube el segundo y pone a 0 el parche; patch sube el último. Si la versión no…

  • Una fusión a tres bandas

    Medio

    Así fusiona Git dos ramas: compara cada línea de la versión común (base) con la nuestra y la suya. La entrada son tres versiones del mismo fichero con el mismo número de líneas, separadas por «---»: base, nuestra y suya. Para cada línea: si nuestra y suya coin…

  • Changelog a partir de los commits

    Difícil

    La entrada son mensajes de commit con el formato de Conventional Commits («tipo(ámbito)!: descripción», con ámbito y ! opcionales). Genera un changelog con las secciones «## Cambios incompatibles» (commits con !), «## Novedades» (feat) y «## Correcciones» (fix…

  • Las métricas DORA de un equipo

    Difícil

    Las cuatro métricas DORA miden lo bien que un equipo entrega software. La entrada es un registro con líneas «despliegue FECHA HORA commit FECHA HORA resultado» (resultado ok o fallo; la fecha del commit es cuándo se escribió el cambio desplegado) y «restaurado…

  • ¿Qué jobs ejecuta el pipeline?

    Muy difícil

    Las plataformas de CI deciden qué trabajos (jobs) lanzar según sus dependencias, la rama y los ficheros cambiados. La entrada tiene una línea por job, en un orden en el que las dependencias aparecen antes: «nombre [needs=a,b] [ramas=main,release/*] [rutas=src/…

Despliegue · Ejercicios de Despliegue de Aplicaciones Web ver el tema

  • Conflictos de puertos en Docker Compose

    Medio

    Cada línea describe una publicación de puertos de un servicio: «servicio puerto_host:puerto_contenedor». Escribe «CONFLICTO puerto: servicio1, servicio2» por cada puerto del host usado por más de un servicio (en orden numérico de puerto y con los servicios en …

  • Informe de un pipeline de CI

    Medio

    Cada línea es un paso de un pipeline: «paso estado segundos», con estado ok, error o omitido. Escribe «Pasos: N (ok: X, error: Y, omitido: Z)», «Duración total: M min S s» (sumando solo los pasos no omitidos), «Paso más lento: nombre (N s)» entre los ejecutado…

  • Rotación de copias de seguridad

    Difícil

    La primera línea es la fecha de hoy y las siguientes, nombres de copias «backup-AAAA-MM-DD.tar.gz» (desordenados). Aplica esta política: se conservan todas las copias de los últimos 7 días (hoy incluido, es decir, con 0 a 6 días de antigüedad); de las que tien…