Comment lire cette note
Le contenu du cours original est conservé tel quel. Tout ce que j'ai ajouté est dans des encadrés : compléments, précisions et mises en garde. Tu peux ainsi distinguer ce qui vient de ton prof de ce qui vient d'ailleurs — c'est important quand tu réviseras pour un partiel.
1Entrée standard et sortie standard
On appelle entrée standard le flux d'entrée par lequel du texte ou toute autre donnée peut être entré dans un programme, et sortie standard le flux de sortie dans lequel les données sont écrites par le programme.
Dans le terminal, le flux d'entrée (les commandes) est saisi au clavier dans l'invite de commande. Le flux en sortie s'affiche sur l'écran dans la fenêtre du terminal. C'est le cas par exemple du résultat de la commande ls.
Pour plus de commodité dans le traitement du résultat d'une commande, il est possible de rediriger le flux de sortie vers un fichier : au lieu de s'afficher sur l'écran, le résultat de la commande sera écrit dans un fichier.
Il est aussi possible de rediriger le flux de sortie vers une autre commande pour enchaîner les commandes progressivement.
Les opérateurs suivants permettent de rediriger la sortie standard vers :
- un fichier en écrasant son contenu : opérateur
> - un fichier en concaténant la sortie au contenu existant : double chevron droit
>> - une nouvelle commande avec l'opérateur pipe :
|
Complément : les trois flux, pas deux
Complément - il y a un troisième flux que le cours ne mentionne pas
Ton prof parle de deux flux. En réalité tout programme Unix naît avec trois tuyaux branchés dessus. On les appelle des descripteurs de fichier (file descriptors, souvent abrégés fd) et ils sont numérotés.
| Numéro | Nom court | Nom français | Par défaut connecté à | Sert à |
|---|---|---|---|---|
0 | stdin | entrée standard | ton clavier | recevoir des données |
1 | stdout | sortie standard | ton écran | le résultat normal |
2 | stderr | sortie d'erreur standard | ton écran | les messages d'erreur |
Pourquoi séparer 1 et 2 alors que les deux s'affichent au même endroit ?
Analogie : imagine une usine. Le tapis roulant qui sort les produits finis, c'est stdout. La sonnerie d'alarme quand une machine casse, c'est stderr. Les deux "sortent" de l'usine et arrivent dans le même hangar, donc de loin tu ne vois pas la différence. Mais le jour où tu veux emballer les produits finis dans des cartons, tu ne veux surtout pas emballer la sonnerie avec.
Concrètement :
ls dossier_qui_existe dossier_bidon > resultat.txtLe contenu du dossier qui existe part dans resultat.txt (c'est stdout, donc c'est lui qui est redirigé). Le message d'erreur, lui, s'affiche quand même à l'écran : il est passé par stderr, que tu n'as pas redirigé.
Pour rediriger les erreurs, on préfixe l'opérateur par le numéro du flux :
commande 2> erreurs.txt # les erreurs dans un fichier
commande 2> /dev/null # les erreurs à la poubelle
commande > tout.txt 2>&1 # les erreurs rejoignent la sortie normale
commande &> tout.txt # raccourci bash du précédent/dev/null est un fichier spécial : tout ce qu'on y écrit disparaît. C'est le trou noir du système. On l'appelle parfois "le puits sans fond".
Subtilité qui piège tout le monde : l'ordre compte
Ces deux lignes ne font pas la même chose :
commande > fichier.txt 2>&1 # correct : tout finit dans fichier.txt
commande 2>&1 > fichier.txt # piège : les erreurs restent à l'écranLe shell lit de gauche à droite. 2>&1 veut dire "envoie le flux 2 là où pointe actuellement le flux 1". Dans le second cas, au moment où il lit 2>&1, le flux 1 pointe encore vers l'écran. Il copie donc cette destination-là. La redirection vers le fichier arrive après, et ne concerne plus que le flux 1.
Analogie : c'est comme dire à quelqu'un "suis la même voiture que Paul" avant que Paul ait changé de voiture. Il suivra l'ancienne.
Complément : > contre >>, et pourquoi c'est dangereux
Attention - > détruit sans prévenir
> ne fait pas qu'écrire dans le fichier : il le vide d'abord, intégralement, avant même que la commande ne s'exécute. Il n'y a ni confirmation, ni corbeille, ni annulation.
Le classique qui détruit un fichier :
cat mon_fichier.txt > mon_fichier.txt # mon_fichier.txt est maintenant videLe shell vide le fichier avant de lancer cat, qui lit donc... un fichier vide.
Filet de sécurité : tu peux demander à bash de refuser d'écraser un fichier existant.
set -o noclobber # active la protection
echo test > existant.txt # bash refuse : "cannot overwrite existing file"
echo test >| existant.txt # >| force l'écrasement quand tu le veux vraimentPour rendre ça permanent, on ajoute set -o noclobber dans ~/.bashrc. À toi de voir : certains trouvent ça pénible, mais quand tu travailleras sur des fichiers de config ou des captures réseau, tu seras content de l'avoir.
Complément : le pipe |, l'invention la plus importante d'Unix
Complément - la philosophie derrière le pipe
Le pipe (en français on dit tube) branche la sortie standard d'une commande directement sur l'entrée standard de la suivante. Rien ne passe par le disque, tout transite en mémoire.
ls -l | grep ".txt" | wc -lTraduction ligne à ligne :
ls -lproduit la liste détaillée des fichiersgrep ".txt"reçoit cette liste et ne garde que les lignes contenant.txtwc -lreçoit ces lignes et les compte (wc= word count,-l= lines)
Résultat : le nombre de fichiers .txt du dossier.
L'analogie de la chaîne de montage. Chaque commande Unix est un ouvrier spécialisé qui sait faire une seule chose, mais parfaitement. grep filtre. sort trie. wc compte. cut découpe des colonnes. Aucun ne sait tout faire, et c'est volontaire. Le pipe, c'est le tapis roulant qui les relie. La puissance ne vient pas des ouvriers, elle vient du fait qu'on peut les assembler dans n'importe quel ordre.
C'est la philosophie Unix, formulée par Doug McIlroy en 1978 : écris des programmes qui font une chose et la font bien ; écris des programmes qui travaillent ensemble ; écris des programmes qui manipulent du texte, parce que le texte est une interface universelle.
Retiens bien ce dernier point. Si toutes les commandes échangent du texte brut, alors n'importe laquelle peut parler à n'importe quelle autre. C'est exactement pour ça que le terminal reste plus puissant qu'une interface graphique quarante ans après : dans une interface graphique, tu ne peux faire que ce que le développeur a prévu comme bouton.
La commande qui manque au cours : tee
Problème : commande > fichier.txt écrit dans le fichier, mais tu ne vois plus rien à l'écran. Parfois tu veux les deux. tee fait exactement ça — son nom vient du raccord de plomberie en T qui sépare un tuyau en deux.
ls -l | tee liste.txt # affiche ET enregistre
ls -l | tee -a liste.txt # -a pour append (concaténer), comme >>2Créer un fichier vide
2.1 Sans l'ouvrir
À faire
- Ouvre le manuel de la commande
touch, et utilise-la pour créer un fichier vide appeléfichier_touch.txt. - Vérifie que le fichier a bien été créé avec la commande
ls.
Ma réponse
man touch # q pour quitter le manuel, / pour chercher dedans
touch fichier_touch.txt
lsComplément - man, le réflexe à installer maintenant
man = manual. C'est la documentation officielle, installée sur ta machine, qui fonctionne sans internet. Dans un manuel :
| Touche | Effet |
|---|---|
Espace | page suivante |
flèches | ligne par ligne |
/mot | chercher "mot" dans la page |
n | occurrence suivante de la recherche |
q | quitter |
Les manuels sont découpés en sections numérotées. man 1 printf te donne la commande shell, man 3 printf la fonction du langage C. D'où les notations que tu croiseras dans la doc, du type open(2).
Si le manuel est trop dense, commande --help donne souvent un résumé d'une page. Et apropos redirection cherche par mot-clé quand tu ne connais pas le nom de la commande.
Prends l'habitude de lire man avant de chercher sur internet. Ça te paraîtra lent au début, puis ça deviendra plus rapide qu'ouvrir un navigateur. Et le jour où tu seras sur une machine distante sans interface graphique, tu n'auras que ça.
2.2 Avec un éditeur de texte
Il existe de nombreux éditeurs de texte, avec ou sans interface graphique.
- Sans interface graphique :
vim,nano,emacs, etc. - Avec interface graphique :
gedit,kate,vscode,emacs GUI, etc.
Question du cours
Que veut dire « GUI » ?
Ma réponse
GUI = Graphical User Interface, en français interface graphique utilisateur. C'est tout ce qui se manipule à la souris : fenêtres, boutons, menus, icônes.
Son opposé est la CLI = Command Line Interface, interface en ligne de commande : on tape du texte, la machine répond du texte.
On croise aussi TUI = Text User Interface : une interface qui dessine des menus et des cadres, mais uniquement avec des caractères, dans le terminal. htop ou nano en sont des exemples.
Ces logiciels peuvent tous être utilisés pour ouvrir ou créer un fichier avec la commande :
[text-editor] [path-to-file]La commande editor ouvre un éditeur de texte par défaut.
À faire
- Trouve l'éditeur de texte par défaut installé sur ta machine.
- Crée un nouveau fichier
fichier_editeur.txt, ajoute une ligne dedans, sauvegarde-le et ferme-le.
Ma réponse
which editor # /usr/bin/editor
ls -l /usr/bin/editor # montre que c'est un lien symbolique
update-alternatives --display editor # montre vers quoi il pointe vraiment
echo $EDITOR # la variable d'environnement (souvent vide au début)Spécifique à ta machine (Debian 13, bureau KDE)
Le cours a été écrit pour les machines de la fac, qui tournent sous Ubuntu 24.04 avec GNOME. Ton portable est sous Debian 13 avec KDE. Deux conséquences concrètes :
geditn'est probablement pas installé chez toi. C'est l'éditeur graphique historique de GNOME. Sous KDE, l'équivalent estkate(complet) oukwrite(allégé). Vérifie avant de t'énerver sur uncommand not found:which gedit kate kwriteTu peux installer gedit si tu veux suivre le TP à la lettre (
sudo apt install gedit), mais ce n'est pas nécessaire : remplace simplementgeditparkatedans toutes les commandes du TP.
- Sur Debian,
editorest un lien symbolique, c'est-à-dire un raccourci qui pointe vers un autre fichier. Il est géré par un système appelé update-alternatives, et il pointe par défaut versnano. Pour changer :sudo update-alternatives --config editorC'est ce mécanisme qui fait que
sudo crontab -eougit commit(sans-m) ouvrent nano et pas autre chose.
Conseil pour la suite de ta licence
Apprends nano cette semaine (30 minutes suffisent, les raccourcis sont affichés en bas de l'écran, ^X signifie Ctrl+X). Puis, sans te presser, commence vim : tape vimtutor dans un terminal, c'est un tutoriel interactif de 25 minutes livré avec vim.
Pourquoi vim alors que tu as VS Code ? Parce que le jour où tu es connecté en SSH sur un serveur distant ou dans un conteneur Docker minimal, il n'y a pas de VS Code. Il y a vim, ou parfois rien d'autre. Ce n'est pas une question de goût, c'est une question de savoir travailler partout. Tu n'as pas besoin d'être bon, tu as besoin de savoir ouvrir, modifier, sauver, quitter.
2.3 Programmes graphiques et l'opérateur &
Attention : programme GUI et utilisation de &
Lorsque tu utilises une commande qui ouvre un programme muni d'une interface graphique, tu dois utiliser l'opérateur & qui permet de lancer le programme en arrière-plan.
Explication du cours : lorsque tu lances une commande, tu ne peux récupérer l'accès à ton prompt qu'une fois celle-ci terminée. Or, si tu lances un programme avec interface graphique, la commande ne sera considérée comme terminée que lorsque tu auras fermé le programme. Entre-temps, ton terminal sera inutilisable car tu n'as plus accès au prompt.
À faire
Exécute la commande suivante :
while true; do echo "coucou" ; sleep 2 ; doneQue se passe-t-il ? Exécute Ctrl-C dans le terminal : tu viens d'interrompre la commande.
Essaie ensuite d'ouvrir un éditeur de texte graphique :
geditMa réponse
La boucle affiche coucou toutes les 2 secondes, indéfiniment. Le prompt ne revient jamais : le shell attend la fin de la commande, et cette commande n'a pas de fin. Ctrl-C l'interrompt et rend le prompt.
(Sous KDE, remplacer gedit par kate.)
Complément - décortiquer while true; do ... done
C'est ta première boucle shell. Mot à mot :
| Élément | Rôle |
|---|---|
while | tant que (la condition est vraie) |
true | une commande qui ne fait rien à part réussir, toujours |
; | séparateur : équivaut à passer à la ligne |
do | début du bloc à répéter |
echo "coucou" | affiche coucou |
sleep 2 | attend 2 secondes |
done | fin du bloc |
while true est donc une boucle dont la condition est vraie par construction : une boucle infinie. En Python, tu écrirais exactement la même chose :
import time
while True:
print("coucou")
time.sleep(2)Note la différence de syntaxe : le shell délimite ses blocs par des mots-clés (do / done), Python par l'indentation. Même logique, deux habillages.
L'éditeur s'ouvre, mais si tu reviens sur le terminal, tu n'as plus accès au prompt.
Pour conserver l'accès à ton terminal, tu dois utiliser l'opérateur &.
gedit fichier_gedit.txt &Précision - ce que fait vraiment &
1. & ne lance pas la commande dans un autre shell. Il la lance comme un job en arrière-plan (background job) du shell courant : le shell la démarre, puis n'attend pas sa fin et te rend immédiatement le prompt. Le processus reste rattaché à ton shell, ce qui a une conséquence pratique importante : si tu fermes le terminal, le programme meurt avec lui (il reçoit un signal SIGHUP, hang up). Pour qu'il survive, il faut nohup commande & ou disown après coup.
2. Après un &, Ctrl-C ne ferme pas la fenêtre. Ctrl-C envoie le signal d'interruption au processus au premier plan (foreground) uniquement. Un job lancé avec & est justement en arrière-plan, donc il n'est pas concerné : ta fenêtre kate restera ouverte. C'est sans & que Ctrl-C ferme la fenêtre.
Teste toi-même, c'est en deux commandes.
Complément - gérer les jobs, et les trois raccourcis à ne pas confondre
Commandes de gestion des jobs :
jobs # liste les jobs du shell courant
fg %1 # ramène le job 1 au premier plan (foreground)
bg %1 # relance le job 1 en arrière-plan (background)
kill %1 # termine le job 1
nohup cmd & # lance en arrière-plan ET survit à la fermeture du terminalEt surtout, trois raccourcis que tout le monde confond au début :
| Raccourci | Nom technique | Ce que ça fait réellement |
|---|---|---|
Ctrl+C | signal SIGINT | demande poliment au programme de s'arrêter. Le programme peut refuser ou faire du ménage avant. |
Ctrl+Z | signal SIGTSTP | met en pause (suspend). Le programme est gelé, pas tué. fg le réveille. |
Ctrl+D | pas un signal | envoie une fin de fichier (EOF, end of file) sur l'entrée standard. |
La troisième ligne mérite un développement, parce qu'on lit souvent que Ctrl+D « arrête le processus en cours », ce qui est trompeur.
Ctrl+D ne tue rien. Il dit au programme : "l'entrée standard est terminée, il n'y aura plus rien à lire". Si le programme en question est ton shell, un shell qui n'a plus rien à lire n'a plus de raison d'exister, donc il se ferme — d'où l'impression qu'il "ferme le terminal". Mais la cause est différente.
Vérifie la différence en deux essais :
cat # sans argument : cat lit ton clavier et le recopie
# tape du texte, puis Entrée : il te le répète
# Ctrl+D : cat se termine proprement, tu as "fermé le robinet"
cat
# Ctrl+C : cat est interrompu de forceMême résultat apparent, deux mécanismes opposés. Cette distinction te servira beaucoup plus tard que tu ne le crois : elle est au cœur de la façon dont les programmes s'enchaînent dans un pipe.
2.4 Avec la redirection en sortie
La redirection de sortie permet également de créer un fichier.
À faire
Teste les commandes suivantes et explique ce qui se passe. À quoi sert la commande cat ?
echo "ligne 1"
echo "ligne 1" > sortie.txt
cat sortie.txt
echo "ligne 1" >> sortie.txt
cat sortie.txt
echo "ligne 2" >> sortie.txt
cat sortie.txt
echo "ligne 3" > sortie.txt
cat sortie.txtMa réponse - déroulé complet
| # | Commande | Effet sur sortie.txt | Affichage écran |
|---|---|---|---|
| 1 | echo "ligne 1" | aucun (pas de redirection) | ligne 1 |
| 2 | echo "ligne 1" > sortie.txt | crée le fichier, contenu : ligne 1 | rien |
| 3 | cat sortie.txt | — | ligne 1 |
| 4 | echo "ligne 1" >> sortie.txt | ajoute à la fin | rien |
| 5 | cat sortie.txt | — | ligne 1 / ligne 1 |
| 6 | echo "ligne 2" >> sortie.txt | ajoute à la fin | rien |
| 7 | cat sortie.txt | — | ligne 1 / ligne 1 / ligne 2 |
| 8 | echo "ligne 3" > sortie.txt | vide tout, écrit ligne 3 | rien |
| 9 | cat sortie.txt | — | ligne 3 |
La leçon est à l'étape 8 : trois lignes de travail effacées par un seul chevron, sans avertissement. C'est exactement l'intérêt pédagogique de cet exercice.
Complément - à quoi sert vraiment cat
cat vient de concatenate, concaténer : mettre bout à bout. Sa fonction première n'est pas d'afficher un fichier, c'est de coller plusieurs fichiers en un seul flux :
cat partie1.txt partie2.txt partie3.txt > complet.txtL'affichage à l'écran n'est qu'un effet de bord : quand tu écris cat fichier.txt, tu concatènes un seul fichier et le résultat part sur la sortie standard, qui est ton écran par défaut.
Trois choses à savoir en plus :
catsans argument lit ton clavier. Il attend sur l'entrée standard. D'où l'astuce pour écrire un fichier sans éditeur :cat > note.txt je tape mon texte et une deuxième ligne # puis Ctrl+D pour terminer- Ne pas utiliser
catsur un fichier long. Tout défile et tu ne peux pas remonter. Utiliseless fichier.txt(navigation avec les flèches,/pour chercher,qpour quitter), ouhead -n 20/tail -n 20pour les premières ou dernières lignes.tail -f journal.logsuit un fichier en direct pendant qu'il se remplit — indispensable quand tu surveilleras des logs. - Ne jamais faire
catsur un fichier binaire (une image, un exécutable). Ton terminal interprétera des octets aléatoires comme des codes de contrôle et deviendra illisible. Si ça t'arrive : taperesetà l'aveugle, puis Entrée.
3Le lien avec ce qui t'intéresse (sécurité)
Ajout personnel - pourquoi ce cours banal est en fait central
Tu apprends à rediriger des flux dans un TP d'introduction. Voici où tu retrouveras exactement la même chose :
- Masquer le bruit pendant une reconnaissance.
nmap -p- cible 2>/dev/nullenvoie les erreurs à la poubelle pour ne garder que les résultats exploitables. Un pipe derrière (| grep open) et tu as une liste de ports ouverts propre. - Effacer ses traces. Un attaquant qui obtient les droits root fait
> /var/log/auth.log: un seul caractère et le journal d'authentification est vide. C'est précisément pour ça qu'en défense on envoie les logs en temps réel vers une autre machine (un serveur SIEM). Un journal stocké uniquement sur la machine compromise ne vaut rien. - Construire des outils en une ligne.
cat rockyou.txt | grep -E '^.{12,}$' | sort -u > longs.txtfiltre une liste de mots de passe. Tu auras besoin d'exactement ça pour la V2 de ton Password Checker. - Le danger de
curl | bash. Beaucoup de tutoriels te disent d'installer un outil aveccurl https://site.tld/install.sh | bash. Tu comprends maintenant ce que ça fait : télécharger du code et l'exécuter immédiatement, sans jamais le lire. Si le site est compromis, tu exécutes le code de l'attaquant avec tes droits. Le réflexe correct :curl -o install.sh https://..., puisless install.sh, puis exécuter si le contenu te convient.
C'est le genre de détail qui sépare quelqu'un qui récite des commandes de quelqu'un qui comprend ce qu'il fait.
4Récapitulatif des opérateurs
| Opérateur | Nom | Effet |
|---|---|---|
> | redirection en écrasement | écrit stdout dans un fichier, en le vidant d'abord |
>> | redirection en concaténation | ajoute stdout à la fin d'un fichier |
< | redirection d'entrée | lit stdin depuis un fichier au lieu du clavier |
2> | redirection d'erreur | écrit stderr dans un fichier |
2>&1 | fusion de flux | envoie stderr là où pointe stdout |
&> | redirection totale (bash) | raccourci de > fichier 2>&1 |
| | pipe / tube | branche stdout d'une commande sur stdin de la suivante |
& | arrière-plan | lance la commande en job d'arrière-plan, rend le prompt |
; | séparateur | enchaîne deux commandes, quoi qu'il arrive |
&& | et logique | n'exécute la seconde que si la première a réussi |
|| | ou logique | n'exécute la seconde que si la première a échoué |
Les trois dernières lignes ne sont pas au programme du TP
Mais tu les croiseras partout. mkdir projet && cd projet : entre dans le dossier seulement s'il a bien été créé. C'est une sécurité élémentaire — avec ;, le cd s'exécuterait même si le mkdir a échoué, et tu travaillerais au mauvais endroit sans t'en rendre compte.
5Auto-test
Réponds à voix haute, sans regarder. Si tu hésites, retourne à la section concernée.
- Quels sont les trois flux standard, leurs numéros, et à quoi chacun est connecté par défaut ?
- Quelle différence entre
commande > f.txt 2>&1etcommande 2>&1 > f.txt? - Pourquoi
cat fichier.txt > fichier.txtdétruit le fichier ? - Que fait
ls -l | grep txt | wc -l? Décris ce qui circule dans chaque tuyau. - Ton terminal est bloqué après avoir lancé un programme graphique. Qu'est-ce que tu as oublié, et quelles sont tes deux options pour t'en sortir sans fermer le programme ?
- Quelle est la différence exacte entre
Ctrl+C,Ctrl+ZetCtrl+D? - Un job lancé avec
&survit-il à la fermeture du terminal ? Pourquoi, et comment changer ça ? - D'où vient le nom
catet quelle est sa fonction première ? - Pourquoi
/dev/nullexiste-t-il, et dans quel cas l'utiliserais-tu ? - Sous KDE, pourquoi la commande
geditdu TP risque-t-elle d'échouer, et par quoi la remplacer ?