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 | Quand l'élève tape Qn, une fois la tâche faite : rien ne valide en arrière-plan |
| Vérification | Historique : Q1 · état du système : Q3, Q5–Q10 · question : Q2, Q4, Q11–Q15 |
| Indices | 3 niveaux par mission, un de plus à chaque échec ; la solution au 3e |
| 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 : il se termine par « TP pret ! Tape MISSION pour commencer. »
- Taper
ps: la ligne deespion_miragedoit apparaître (c'est la cible de Q11) - La progression est conservée entre les relances dans
~/.mirage_save/
- Historique (Q1) — la commande est cherchée dans les 60 dernières lignes de
history. Il faut un shell interactif qui garde un historique (ashde JSLinux,bash) :dashn'en a pas. - État du système (Q3, Q5–Q10) — le dossier courant (
$PWD), la présence des fichiers et dossiers, les droits (stat -c "%a",[ -x … ]). - Question (Q2, Q4, Q11–Q15) —
readdemande ce que la commande a affiché, et la réponse est comparée à celle attendue. Valide que la commande a réellement été exécutée et lue. Q11 demande d'abord le PID de l'espion, puis se valide quand le processus a disparu deps.
Chaque échec fait monter le niveau d'indice de la mission (fichier .hints). Le message d'échec ne donne jamais la réponse.
- Niveau 1 — l'objectif et la commande
- Niveau 2 — la structure de la commande, avec des
???à compléter - Niveau 3 — la solution complète ; pour Q2, Q12 et Q14, la réponse attendue aussi. Au-delà, la solution reste affichée à chaque échec.
Au lancement, le script crée /tmp/espion_mirage.sh, une boucle qui ne fait qu'attendre, et le lance en arrière-plan. Il l'exécute directement pour qu'il garde son nom dans ps : sous Debian ou Ubuntu, ps n'affiche que le nom du programme, tronqué à 15 caractères (espion_mirage.s). Si /tmp interdit l'exécution, le script le lance avec sh. Relancer le TP arrête l'ancien espion et en lance un nouveau.
~/.mirage_save/.prog est mis à jour à chaque mission validée. Au lancement, avant le rm -rf $TP_DIR, la progression et les niveaux d'indice sont copiés dans ~/.mirage_save/ ; après le mkdir, ils sont restaurés. L'élève peut relancer le TP sans perdre son score. Si ~/.mirage_save/ a été effacé, rien n'est recopié : c'est la remise à zéro.
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. En cas d'erreur, les indices gradués ; la réponse n'apparaît qu'au 3e échec.
cd — validation par $PWD
Se déplacer dans serveur/. Validation : $PWD = $TP_DIR/serveur, au moment où l'élève tape Q3.
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
Q5 valide si 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/
Q6 valide si exfiltration/rapport.txt existe.
mv — renommer un fichier
mv ~/infiltration_mirage/serveur/exfiltration/rapport.txt \ ~/infiltration_mirage/serveur/exfiltration/rapport_cache.txt
Q7 valide si rapport_cache.txt existe dans exfiltration/.
mkdir — créer un dossier
mkdir ~/infiltration_mirage/serveur/archive
Q8 valide si 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)
Q9 vérifie avec stat -c "%a" et affiche les droits actuels en cas d'échec. Nécessite Q7 accomplie.
chmod u+x — rendre exécutable
chmod u+x ~/infiltration_mirage/serveur/effacer_traces.sh
# u=user +=ajouter x=execution
Q10 vérifie avec [ -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 besoin Q11 # retaper pour valider
Si l'espion n'est plus dans ps quand l'élève tape Q11 (déjà arrêté), la mission est validée directement. Au 3e échec, la solution affiche le vrai PID.
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é apparaît. Réponse : .fichier_cache ou 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 ou deux.
cat ~/infiltration_mirage/serveur/logs/access.log | grep Transfert
Point pédagogique central : le pipe | chaîne deux commandes. Q15 le réutilise sur l'historique (history | grep). En cas d'erreur, les indices gradués ; la réponse n'apparaît qu'au 3e échec.
history | grep — réutiliser le pipe
Q15 demande quelle commande apparaît en premier dans les résultats de history | grep Q. Réponse acceptée : toute réponse qui commence par Q suivi d'un chiffre (Q1, Q14…), espaces ignorés.
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. Chaque Qn réussie affiche un badge et le score
- 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 1 le dit. - Q7 mv : erreur classique — utiliser
cpau lieu demv. Q7 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 # progression et niveaux d'indice (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) ├── agent.log # créé par l'élève (Q5) ├── 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 (.prog, .hints) /tmp/espion_mirage.sh # Q11 · ps + kill