TP de terminal Linux pour Terminale NSI sur JSLinux Alpine. 15 missions indépendantes en 5 phases progressives. Les notions avancées (options, pipe) sont placées en fin de parcours — l'élève est d'abord à l'aise avec la navigation et la manipulation de fichiers avant de les aborder.
| Critère | Détail |
|---|---|
| Niveau | Terminale NSI |
| Durée | 1h30 – 2h |
| Environnement | JSLinux Alpine x86 — bellard.org/jslinux |
| Commandes élève | MISSION · Q1..Q15 · STATUT |
| Validation auto | Q5–Q10 via daemon filesystem (toutes les 3s) |
| Validation question | Q2, Q3, Q4, Q11–Q15 via input interactif |
| Persistance | Progression sauvegardée dans ~/.mirage_save/ |
1. Ouvrir bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192
2. Télécharger tp_infiltration.sh depuis GitHub sur la machine locale
3. Cliquer sur ↑ sous le terminal JSLinux pour importer
4. Lancer : . ~/tp_infiltration.sh (point, pas source)
⚠ Ctrl+V inopérant dans JSLinux — coller via clic droit → Paste.
- Tester le lancement complet sur un poste élève
- Le setup affiche "Daemon actif (PID: …)" — vérifier que ce PID est non vide
- La progression est conservée entre les relances dans
~/.mirage_save/
- History (Q1) — pattern grep sur les 60 dernières commandes. Utilisé uniquement quand la détection est fiable et non ambiguë.
- Question interactive (Q2–Q4, Q11–Q15) —
readdemande à l'élève de saisir le résultat observé. Valide que la commande a réellement été exécutée et lue. - Daemon filesystem (Q5–Q10) — script
/tmp/mirage_daemon.shindépendant, surveille toutes les 3s. Écrit dans.notifs, affiché à la prochaine commande.
Problème historique : les sous-shells lancés avec & depuis un script sourcé reçoivent SIGHUP à la fin du sourcing. Solutions appliquées :
trap '' HUPdans le daemon — ignore SIGHUP(sh "$DAEMON_SH" </dev/null >>"$NOTIFS" 2>&1 &)— sous-shell + redirections créent un nouveau groupe de processus- Le daemon écrit lui-même son PID via
echo $$— évite la race condition avec$! - Heredoc
<< 'DAEMONEOF'avec quotes — empêche l'interpolation qui corrompait les fonctionsawk
~/.mirage_save/.prog est mis à jour à chaque validation (manuelle ou daemon). Avant chaque rm -rf $TP_DIR, la progression est sauvegardée ; après le mkdir, elle est restaurée. L'élève peut relancer le TP sans perdre son score.
rm -rf ~/.mirage_save && . ~/tp_infiltration.sh # repartir de zéro
pwd
Afficher le répertoire courant. Validation : pattern pwd dans les 60 dernières lignes d'historique.
pwd
ls — question : quel fichier .txt ?
Lister serveur/. L'élève répond le nom du fichier visible. Réponse attendue : acces.txt ou acces.
ls ~/infiltration_mirage/serveur/ # ou ls depuis serveur/
ls accepte trop de formes pour être détecté dans l'history → question sur le résultat.
cd — validation par $PWD
Se déplacer dans serveur/. Validation : $PWD = $TP_DIR/serveur.
cd ~/infiltration_mirage/serveur/ # puis Q3
cat — question : mot de passe
Lire message_secret.txt. Réponse attendue : M1r4g3_2024.
cat ~/infiltration_mirage/message_secret.txt
touch — créer un fichier vide
touch ~/infiltration_mirage/serveur/agent.log
Daemon valide dès que serveur/agent.log existe.
cp — copier un fichier
Il faut d'abord créer exfiltration/ avec mkdir.
mkdir ~/infiltration_mirage/serveur/exfiltration cp ~/infiltration_mirage/serveur/confidentiel/rapport.txt \ ~/infiltration_mirage/serveur/exfiltration/
Daemon valide dès que exfiltration/rapport.txt existe.
mv — renommer un fichier
mv ~/infiltration_mirage/serveur/exfiltration/rapport.txt \ ~/infiltration_mirage/serveur/exfiltration/rapport_cache.txt
Daemon valide dès que rapport_cache.txt existe dans exfiltration/.
mkdir — créer un dossier
mkdir ~/infiltration_mirage/serveur/archive
Daemon valide dès que serveur/archive/ existe.
chmod 600 — droits restrictifs
chmod 600 ~/infiltration_mirage/serveur/exfiltration/rapport_cache.txt
# 600 = rw------- : User(6=rw) Group(0) Others(0)
Daemon vérifie via stat -c "%a". Nécessite Q7 accomplie.
chmod u+x — rendre exécutable
chmod u+x ~/infiltration_mirage/serveur/effacer_traces.sh
# u=user +=ajouter x=execution
Daemon vérifie via [ -x fichier ].
ps + kill — identifier et neutraliser
Q11 demande d'abord le PID affiché par ps. Si correct, invite à lancer kill. Retaper Q11 après le kill pour valider.
ps # repérer espion_mirage et son PID kill <PID> # kill -9 si résistance Q11 # retaper pour valider
Le daemon (Q11 auto) valide aussi si l'espion est mort — le badge apparaît à la prochaine commande.
ls --help — trouver l'option -a
Q12 demande quelle option affiche les fichiers cachés. Réponse : -a ou a ou --all.
ls --help
Sur JSLinux, man n'est pas installé — --help est l'alternative.
ls -la — voir les fichiers cachés
Q13 demande quel fichier caché l'élève trouve. Réponse : .fichier_cache.
ls -la ~/infiltration_mirage/serveur/
cat | grep — filtrer un journal
Q14 explique le principe du pipe puis demande combien de lignes contenant "Transfert" s'affichent. Réponse : 2.
cat ~/infiltration_mirage/serveur/logs/access.log | grep Transfert
Point pédagogique central : le pipe | chaîne deux commandes. L'élève l'a déjà utilisé sans le savoir en Q15 (history | grep).
history | grep — réutiliser le pipe
Q15 demande ce qu'on voit dans les résultats de history | grep Q. Réponse : toute chaîne commençant par Q suivi d'un chiffre (Q1, Q14…).
history | grep Q
- 5 min — introduction + rappel légal + distribution fiche élève
- 10 min — import JSLinux + lancement (Q1–Q4 se valident en quelques minutes)
- 65–75 min — travail autonome. Les badges Q5–Q10 s'affichent automatiquement
- 15 min — correction collective sur chmod (Q9), pipe (Q14), kill (Q11)
- Q6 cp : l'élève doit d'abord créer
exfiltration/avecmkdir. L'indice niveau 2 le guide. - Q7 mv : erreur classique — utiliser
cpau lieu demv. Le daemon attendrapport_cache.txt. - Q9 chmod : décomposer 600 = r(4)+w(2) | 0 | 0 si nécessaire.
- Q11 ps : la colonne PID est la première. Rappeler de lire la ligne
espion_mirage. - Q12 ls --help : man n'existe pas sur Alpine. --help est universel.
- Q14 pipe : expliquer la métaphore du tuyau — la sortie de gauche entre dans la droite.
. ~/tp_infiltration.shRepartir de zéro
rm -rf ~/.mirage_save && . ~/tp_infiltration.sh
~/infiltration_mirage/ ├── message_secret.txt # Q4 · cat (mot de passe : M1r4g3_2024) ├── .prog / .hints / .notifs # état interne (cachés) └── serveur/ ├── acces.txt # Q2 · ls (réponse : acces.txt) ├── effacer_traces.sh # Q10 · chmod u+x ├── .fichier_cache # Q13 · ls -la (réponse : .fichier_cache) ├── confidentiel/ │ └── rapport.txt # Q6 · cp (source) ├── public/index.html ├── logs/access.log # Q14 · cat | grep Transfert (2 lignes) ├── exfiltration/ # créé par l'élève (Q6) │ ├── rapport.txt # Q6 · cp │ └── rapport_cache.txt # Q7 · mv · Q9 · chmod 600 └── archive/ # Q8 · mkdir ~/.mirage_save/ # progression persistante /tmp/espion_mirage.sh # Q11 · ps + kill /tmp/mirage_daemon.sh # daemon auto