Determinar qué descargas necesitan reparación

ShellBeginner
Practicar Ahora

Introducción

Field Notes está preparando un fin de semana comunitario. Su paquete de recursos incluye una guía PDF, material para las actividades y un archivo opcional de agradecimientos que puede estar vacío. El nombre y un tamaño aparentemente razonable no bastan para demostrar que una descarga está completa. Antes de obtener nada, crearás un inventario que indique al organizador exactamente qué archivos requieren atención.

Debes conocer los argumentos, las condiciones y los bucles básicos de Bash de Shell for Beginners. Este laboratorio explica SHA256, la lectura de líneas completas y el análisis que se utiliza aquí. Las herramientas y los recursos sintéticos originales ya están preparados. Workspace y Download Desk comparten un contenedor; este laboratorio se inicializa de forma independiente. El tiempo estimado incluye la lectura y los errores de escritura habituales.

Crear un inventario fiable

En este paso, convertirás una lista de comprobación de confianza en un inventario del paquete local real, sin reparar ni reescribir ninguno de sus archivos.

Ver primero un archivo útil

Empieza en Workspace, preparado para texto UTF-8. Trabaja en /home/labex/project/download-desk. pwd muestra el directorio actual. Si falta una ruta relativa, compruébala con ls y vuelve aquí con el comando cd completo que se indica a continuación.

cd /home/labex/project/download-desk
ls pack

Cambia a Download Desk. Selecciona Open file junto a Welcome guide.pdf. La nueva página del navegador debe mostrar el programa de actividades y el punto de encuentro en la entrada este. Utiliza los controles de zoom del lector PDF si es necesario: un PDF tiene páginas fijas, no un diseño móvil que redistribuya el texto. Vuelve a la página Download Desk y selecciona Download junto al archivo para guardar esos mismos bytes locales. Después, vuelve a Workspace.

Download Desk con enlaces a los recursos locales reales

Utiliza Open file o Download junto a Welcome guide.pdf.

Este lector solo sirve los archivos que realmente existen en pack. No puede recuperar del origen un archivo ausente. Un recurso de texto puede abrirse como texto y el archivo vacío opcional puede mostrar una página en blanco. Estas observaciones, por sí solas, no demuestran que el contenido sea correcto.

Utilizar una referencia independiente

El organizador ha proporcionado /opt/labex/download-pack-state/expected.sha256 por separado del paquete que puedes modificar. Un resumen SHA256 es una huella de 64 caracteres de los bytes de un archivo. Compararlo con un valor independiente de confianza permite detectar bytes diferentes, incluso daños que no cambian el tamaño. No acredita la identidad de quien publica el archivo: si un atacante proporciona tanto el archivo como su suma de comprobación, que coincidan no hace fiable a ese publicador. No regeneres esta referencia a partir de los archivos que estás comprobando.

cat muestra un archivo sin modificarlo:

cat /opt/labex/download-pack-state/expected.sha256

Cada línea contiene un resumen hexadecimal de 64 caracteres en minúsculas, dos espacios y el nombre completo del archivo. Este curso utiliza un manifiesto proporcionado, legible, no vacío y terminado en un salto de línea, con ese formato exacto. Los nombres son de un solo nivel, usan ASCII imprimible y pueden incluir espacios. Las barras, las barras inversas, CR, LF, los tabuladores y los nombres . y .. quedan fuera del alcance. El paquete y su cadena de directorios son directorios reales; los miembros enumerados son archivos locales normales o están ausentes. No se admiten archivos enlazados, subdirectorios que ocupen el nombre de un miembro ni formatos arbitrarios de sumas con escapes. Conserva todos los miembros originales del paquete y notes.txt sin cambios durante este laboratorio de diagnóstico.

sha256sum imprime el resumen y el nombre de un archivo. Las comillas dobles mantienen un nombre con espacios como un solo argumento. -- indica el final de las opciones. El prefijo del directorio también evita que un nombre base que empieza por - se interprete como una opción.

sha256sum -- "pack/Workshop card.txt"

Compara ese resumen con su línea de referencia. Son diferentes. El archivo dañado tiene el mismo número de bytes que el material correcto, así que su tamaño no habría revelado el problema.

sha256sum --check lee el manifiesto y comprueba las rutas enumeradas con respecto al directorio actual. Los paréntesis ejecutan los comandos en una subshell: su cd no cambia el directorio de la terminal exterior.

(cd pack && sha256sum --check /opt/labex/download-pack-state/expected.sha256)

Aquí, && ejecuta la comprobación solo si se consigue entrar en pack. Debes ver Welcome guide.pdf: OK, Workshop card.txt: FAILED, Map notes.txt: FAILED open or read y Optional credits.txt: OK, además de advertencias. El archivo ausente y los bytes incorrectos hacen que este comando falle de forma intencionada. $? contiene el estado de salida nativo del comando anterior; léelo inmediatamente, antes de que otro comando lo sustituya. printf da formato al valor y \n termina la línea.

printf 'Check exit: %s\n' "$?"

Debes ver Check exit: 1. El archivo de agradecimientos de cero bytes es válido porque su resumen coincide. El requisito de «no vacío» se aplica al manifiesto, no a cada recurso. Ver una línea OK no significa que todo el paquete sea correcto.

Conservar los nombres al leer líneas

El organizador necesita un inventario compacto con un estado y un nombre completo por fila, en el orden del manifiesto. Crearás inventory.sh, que recibe el manifiesto como $1 y el directorio del paquete como $2. Es un programa autónomo que utiliza esos argumentos y los comandos instalados, sin archivos auxiliares vecinos.

Antes de escribirlo, revisa la sintaxis de shell que utiliza:

  • while IFS= read -r line lee una línea completa en cada iteración. Un IFS vacío evita recortar espacios; -r impide procesar las barras inversas. done < "$manifest" redirige el manifiesto al bucle, en lugar de pedir entrada a la terminal.
  • ${line:0:64} toma el resumen de las posiciones 0 a 63. ${line:66} toma todo lo que sigue a los dos espacios separadores. No divide el nombre en palabras.
  • [ -f "$target" ] comprueba si el destino admitido es un archivo normal. Los miembros ausentes se clasifican antes de ejecutar cualquier comando de suma.
  • actual=$(sha256sum -- "$target") captura la salida del comando. ${actual%% *} elimina el sufijo más largo que coincida con un espacio seguido de cualquier contenido y deja solo el resumen. Esto es seguro para el formato controlado de nombres descrito anteriormente.
  • printf '%s\t%s\n' escribe dos valores separados por un tabulador y termina con un salto de línea. Las comillas conservan cada nombre completo como un argumento.

El siguiente here-document guarda texto literal en un script. cat > inventory.sh sustituye ese archivo; <<'BASH' termina al encontrar una línea que contiene únicamente BASH. Entrecomillar el delimitador impide que la shell actual expanda las variables del script mientras lo guarda. La primera línea identifica Bash; aquí ejecutaremos el archivo explícitamente con bash.

cat > inventory.sh <<'BASH'
#!/usr/bin/env bash
manifest=$1
pack=$2
while IFS= read -r line; do
    expected=${line:0:64}
    name=${line:66}
    target=$pack/$name
    status=MISSING
    if [ -f "$target" ]; then
        actual=$(sha256sum -- "$target")
        actual=${actual%% *}
        status=MISMATCH
        if [ "$actual" = "$expected" ]; then
            status=MATCH
        fi
    fi
    printf '%s\t%s\n' "$status" "$name"
done < "$manifest"
BASH

Ejecuta el script con la referencia proporcionada y el paquete local. > redirige su salida estándar a inventory.tsv y sustituye ese informe en cada ejecución. TSV significa valores separados por tabuladores. Este informe es el resultado de diagnóstico para el organizador; no repara los recursos.

bash inventory.sh /opt/labex/download-pack-state/expected.sha256 pack > inventory.tsv
cat inventory.tsv

Debes obtener estas filas, con un tabulador entre cada estado y nombre:

MATCH Welcome guide.pdf
MISMATCH Workshop card.txt
MISSING Map notes.txt
MATCH Optional credits.txt

El script puede terminar con estado cero aunque el informe contenga MISSING: su trabajo es clasificar, no afirmar que el paquete está completo. La corrección del informe depende de su relación con los archivos reales y la referencia de confianza. La comprobación también ejecuta el script sobre otro paquete con nombres diferentes y un archivo vacío; no exige escribir exactamente este bucle.

Si escribes mal una línea, repite el here-document completo para sustituir solo inventory.sh y vuelve a generar el informe. Si ejecutas algo por error desde pack, regresa con el cd absoluto mostrado anteriormente. Deja pack, la referencia de confianza y notes.txt sin cambios. Repetir el comando de inventario debe producir el mismo informe, porque solo lee el paquete. En el siguiente laboratorio utilizarás estas clasificaciones para decidir qué descargar.

Resumen

Has abierto un recurso real, comparado su paquete con una referencia SHA256 independiente y creado un inventario Bash que conserva las líneas completas. Has distinguido archivos ausentes, bytes incorrectos y archivos vacíos válidos sin modificar el paquete original. El inventario proporciona ahora una razón para cada reparación posterior.