Introduction
Field Notes prépare un week-end communautaire. Son paquet de ressources contient un guide PDF, des documents pour les activités et un fichier facultatif de remerciements qui peut être vide. Un nom de fichier et une taille plausible ne suffisent pas à prouver qu'un téléchargement est complet. Avant de récupérer quoi que ce soit, vous produirez un inventaire indiquant précisément à l'organisateur quels fichiers nécessitent une intervention.
Vous devez connaître les arguments, les conditions et les boucles Bash de base présentés dans Shell for Beginners. Ce laboratoire explique SHA256, la lecture de lignes entières et l'analyse utilisée ici. Les outils et les ressources synthétiques originales sont prêts. Workspace et Download Desk partagent un conteneur ; ce laboratoire démarre indépendamment. La durée estimée comprend la lecture et les erreurs de saisie courantes.
Créer un inventaire fiable
Dans cette étape, vous transformerez une liste de contrôle de confiance en inventaire du véritable paquet local, sans réparer ni réécrire aucun de ses fichiers.
Commencer par un fichier utile
Commencez dans Workspace, préparé pour le texte UTF-8. Votre travail doit rester dans /home/labex/project/download-desk. pwd affiche le répertoire courant. Si un chemin relatif est introuvable, vérifiez-le avec ls et revenez ici avec la commande cd complète ci-dessous.
cd /home/labex/project/download-desk
ls pack
Passez à Download Desk. Sélectionnez Open file à côté de Welcome guide.pdf. La nouvelle page du navigateur doit afficher le programme communautaire et le point de rendez-vous à l'entrée est. Utilisez au besoin les commandes de zoom du lecteur PDF : un PDF possède des pages fixes, pas une mise en page mobile qui redistribue le texte. Revenez à la page Download Desk et sélectionnez Download à côté de ce fichier pour enregistrer les mêmes octets locaux. Revenez ensuite dans Workspace.

Utilisez Open file ou Download à côté de Welcome guide.pdf.
Ce lecteur ne sert que les fichiers réellement présents dans pack. Il ne peut pas récupérer un fichier manquant depuis la source. Une ressource textuelle peut s'ouvrir comme du texte et le fichier vide facultatif peut afficher une page blanche. Ces seules observations ne prouvent pas que le contenu est correct.
Utiliser une référence indépendante
L'organisateur a fourni /opt/labex/download-pack-state/expected.sha256 séparément du paquet modifiable. Une empreinte SHA256 est une représentation de 64 caractères des octets d'un fichier. La comparer à une valeur indépendante de confiance permet de détecter des octets différents, même si le fichier endommagé conserve la même taille. Cela ne prouve pas l'identité de son éditeur : si un attaquant fournit à la fois un fichier et sa somme de contrôle, leur concordance ne rend pas cet éditeur digne de confiance. Ne régénérez pas cette référence à partir des fichiers à vérifier.
cat affiche un fichier sans le modifier :
cat /opt/labex/download-pack-state/expected.sha256
Chaque ligne contient une empreinte hexadécimale de 64 caractères en minuscules, deux espaces, puis le nom complet du fichier. Ce cours utilise un manifeste fourni, lisible, non vide et terminé par un saut de ligne, dans ce format exact. Les noms sont sur un seul niveau, utilisent des caractères ASCII imprimables et peuvent contenir des espaces. Les barres obliques, les barres obliques inverses, CR, LF, les tabulations et les noms . et .. sont hors du périmètre. Le paquet et sa chaîne de répertoires sont de véritables répertoires ; les éléments listés sont des fichiers locaux ordinaires ou sont absents. Les liens, les sous-répertoires occupant le nom d'un élément et les formats arbitraires de sommes avec échappement ne sont pas pris en charge. Conservez tous les éléments d'origine du paquet et notes.txt sans modification dans ce laboratoire de diagnostic.
sha256sum affiche l'empreinte et le nom d'un fichier. Les guillemets doubles maintiennent un nom contenant des espaces dans un seul argument. -- marque la fin des options. Le préfixe de répertoire empêche également qu'un nom de base commençant par - soit interprété comme une option.
sha256sum -- "pack/Workshop card.txt"
Comparez cette empreinte à sa ligne de référence. Elles diffèrent. Le fichier endommagé contient autant d'octets que le document correct ; sa taille n'aurait donc pas révélé l'erreur.
sha256sum --check lit le manifeste et vérifie les chemins listés par rapport au répertoire courant. Les parenthèses exécutent les commandes dans un sous-shell : son cd ne change pas le répertoire du terminal extérieur.
(cd pack && sha256sum --check /opt/labex/download-pack-state/expected.sha256)
Ici, && ne lance la vérification que si l'entrée dans pack réussit. Vous devez voir Welcome guide.pdf: OK, Workshop card.txt: FAILED, Map notes.txt: FAILED open or read et Optional credits.txt: OK, ainsi que des avertissements. Le fichier manquant et les octets incorrects font volontairement échouer cette commande. $? contient le code de sortie natif de la commande précédente ; lisez-le immédiatement, avant qu'une autre commande ne le remplace. printf formate la valeur et \n termine la ligne.
printf 'Check exit: %s\n' "$?"
Vous devez voir Check exit: 1. Le fichier de remerciements de zéro octet est valide, car son empreinte correspond. L'exigence « non vide » concerne le manifeste, pas chaque ressource. Une seule ligne OK ne signifie pas que tout le paquet est correct.
Préserver les noms lors de la lecture des lignes
L'organisateur souhaite un inventaire compact avec un état et un nom complet par ligne, dans l'ordre du manifeste. Vous créerez inventory.sh, qui reçoit le manifeste dans $1 et le répertoire du paquet dans $2. C'est un programme autonome qui utilise ces arguments et les commandes installées, sans fichiers auxiliaires voisins.
Avant de l'écrire, examinez la syntaxe shell utilisée :
while IFS= read -r linelit une ligne entière à chaque itération. UnIFSvide empêche de supprimer les espaces ;-rdésactive le traitement des barres obliques inverses.done < "$manifest"redirige le manifeste vers la boucle au lieu de demander une entrée au terminal.${line:0:64}prend l'empreinte aux positions 0 à 63.${line:66}prend tout ce qui suit les deux espaces séparateurs. Le nom n'est pas découpé en mots.[ -f "$target" ]vérifie si la cible prise en charge est un fichier ordinaire. Un élément absent est classé avant l'exécution d'une commande de somme.actual=$(sha256sum -- "$target")capture la sortie de la commande.${actual%% *}supprime le suffixe le plus long correspondant à un espace suivi de n'importe quel contenu, pour ne garder que l'empreinte. Ce traitement convient au format contrôlé des noms décrit plus haut.printf '%s\t%s\n'écrit deux valeurs séparées par une tabulation et suivies d'un saut de ligne. Les guillemets conservent chaque nom complet dans un seul argument.
Le here-document suivant enregistre du texte littéral dans un script. cat > inventory.sh remplace ce fichier ; <<'BASH' se termine sur une ligne contenant seulement BASH. Les guillemets autour du délimiteur empêchent le shell courant de développer les variables du script pendant l'enregistrement. La première ligne indique Bash ; nous lancerons explicitement le fichier avec 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
Exécutez le script avec la référence fournie et le paquet local. > redirige sa sortie standard vers inventory.tsv et remplace ce rapport à chaque exécution. TSV désigne des valeurs séparées par des tabulations. Ce rapport constitue le résultat du diagnostic pour l'organisateur ; il ne répare pas les ressources.
bash inventory.sh /opt/labex/download-pack-state/expected.sha256 pack > inventory.tsv
cat inventory.tsv
Vous devez obtenir ces lignes, avec une tabulation entre chaque état et nom :
MATCH Welcome guide.pdf
MISMATCH Workshop card.txt
MISSING Map notes.txt
MATCH Optional credits.txt
Le script peut terminer avec un code zéro même si le rapport contient MISSING : il doit classer les fichiers, pas affirmer que le paquet est complet. La justesse du rapport dépend de sa relation avec les fichiers réels et la référence de confiance. La vérification exécute aussi votre script sur un autre paquet avec des noms différents, dont un fichier vide ; elle n'impose pas cette écriture exacte de la boucle.
Si vous saisissez mal une ligne, répétez le here-document complet pour remplacer uniquement inventory.sh, puis régénérez le rapport. Si vous exécutez une commande par erreur depuis pack, revenez avec le cd absolu montré plus haut. Laissez pack, la référence de confiance et notes.txt inchangés. Réexécuter l'inventaire doit produire le même rapport, puisqu'il ne fait que lire le paquet. Dans le laboratoire suivant, ces catégories serviront à décider quoi télécharger.
Résumé
Vous avez ouvert une véritable ressource, comparé son paquet à une référence SHA256 indépendante et créé un inventaire Bash qui préserve les lignes entières. Vous avez distingué les fichiers absents, les octets incorrects et les fichiers vides valides, tout en conservant le paquet d'origine. L'inventaire justifie désormais chaque réparation ultérieure.



