Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

Chapitre 316 minIntermédiaire

Le terminal et les commandes Linux de base

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • lire la forme d'une commande et trouver de l'aide avec man et --help ;
  • te déplacer avec des chemins absolus et relatifs ;
  • créer, copier, déplacer, lire et chercher des fichiers ;
  • enchaîner des commandes avec les redirections et les tubes ;
  • traduire une commande PowerShell en Bash.

4 exercices corrigés

Le terminal est la fenêtre texte dans laquelle tu tapes des commandes ; le shell, Bash sur Debian, les lit, les exécute et affiche leur résultat. Ce chapitre présente la forme d'une commande, l'aide intégrée, les commandes de base pour se déplacer, manipuler et lire des fichiers, chercher, et enchaîner les commandes avec les redirections et les tubes. C'est le socle de tous les chapitres suivants : sur un serveur sans interface graphique, tout passe par là.

Terminal, console et shell

Trois mots reviennent sans cesse :

  • la console est l'écran texte de la machine elle-même (ou celui que t'affiche Proxmox dans l'onglet Console) ;
  • le terminal est le programme qui affiche une session texte : Windows Terminal, le Terminal de macOS, ou la session SSH que tu ouvres vers un serveur ;
  • le shell est l'interpréteur qui lit ta ligne, la découpe, lance les programmes et te rend la main. Debian utilise Bash pour les sessions interactives ; d'autres shells existent (zsh, fish, dash pour les scripts système).

Une commande suit presque toujours la même forme :

text
commande  [options]  [arguments]
ls        -l -h      /var/log

Les options modifient le comportement : courtes avec un tiret (-l), combinables (-lh = -l -h), ou longues avec deux tirets (--human-readable). Les arguments disent sur quoi agir : un fichier, un dossier, un nom d'utilisateur. Linux distingue les majuscules et les minuscules partout : Rapport.txt et rapport.txt sont deux fichiers différents, ls -R et ls -r deux options différentes.

Trouver de l'aide

Personne ne retient toutes les options. On sait où les trouver :

CommandeCe qu'elle donne
man lsLe manuel complet de ls. Dans le manuel : /mot cherche, n passe à l'occurrence suivante, q quitte
ls --helpUn résumé des options, directement dans le terminal
man -k partitionLa liste des pages de manuel dont la description contient « partition » (apropos partition fait de même)
type cdDit si cd est un programme, une commande interne du shell ou un alias
help cdL'aide des commandes internes de Bash, qui n'ont pas de page de manuel à elles

Se déplacer dans les dossiers

Tous les fichiers sont rangés dans une seule arborescence qui part de la racine / (chapitre 4). Un chemin absolu part de la racine (/var/log/nginx) ; un chemin relatif part du dossier courant (nginx/access.log si tu es déjà dans /var/log).

CommandeEffet
pwdAffiche le dossier courant (print working directory)
cd /var/logVa dans /var/log (chemin absolu)
cd nginxVa dans le sous-dossier nginx du dossier courant (chemin relatif)
cd ..Remonte d'un niveau (.. = le dossier parent, . = le dossier courant)
cd ou cd ~Retourne dans ton dossier personnel, /home/clambert
cd -Revient au dossier précédent
lsListe le contenu du dossier courant
ls -lFormat long : droits, propriétaire, taille, date
ls -laFormat long, fichiers cachés compris (leur nom commence par un point)
ls -lhTailles lisibles (4,0K, 12M)
ls -ltTrié par date de modification, le plus récent en premier
tree -L 2L'arborescence sur deux niveaux (paquet tree à installer)
console
clambert@srv-web:~$ cd /etc/nginx
clambert@srv-web:/etc/nginx$ ls -l
total 56
drwxr-xr-x 2 root root 4096 15 oct.  10:12 conf.d
-rw-r--r-- 1 root root 1125 13 juin  14:05 fastcgi.conf
-rw-r--r-- 1 root root 1484 13 juin  14:05 nginx.conf
drwxr-xr-x 2 root root 4096 15 oct.  10:14 sites-available
drwxr-xr-x 2 root root 4096 15 oct.  10:14 sites-enabled
...

Chaque ligne du format long se lit ainsi : le type et les droits (drwxr-xr-x, le d signale un dossier, chapitre 6), le nombre de liens, le propriétaire et le groupe, la taille en octets, la date de dernière modification, le nom.

Créer, copier, déplacer, supprimer

CommandeEffet
mkdir sauvegardesCrée un dossier
mkdir -p /srv/www/suivi/staticCrée toute la chaîne de dossiers manquants
touch notes.txtCrée un fichier vide (ou met à jour la date d'un fichier existant)
cp nginx.conf nginx.conf.bakCopie un fichier
cp -a /etc/nginx /root/nginx-2026-11-04Copie un dossier entier en conservant droits, propriétaires et dates
mv ancien.txt nouveau.txtRenomme
mv rapport.txt /tmp/Déplace
rm fichier.txtSupprime un fichier
rm -r dossierSupprime un dossier et tout son contenu
rmdir dossierSupprime un dossier vide seulement

Les caractères génériques (wildcards) sont remplacés par le shell avant l'exécution : * vaut n'importe quelle suite de caractères, ? un seul caractère, [0-9] un caractère de la liste. ls /var/log/*.log liste les fichiers en .log ; rm access.log.[2-9].gz supprime les archives 2 à 9.

Lire un fichier

CommandeUsage
cat fichierAffiche tout le fichier (pour les fichiers courts)
less fichierAffiche page par page : Espace avance, b recule, /mot cherche, G va à la fin, q quitte
head -n 20 fichierLes 20 premières lignes
tail -n 50 fichierLes 50 dernières lignes
tail -f /var/log/nginx/access.logAffiche la fin du fichier et les lignes ajoutées en direct (Ctrl+C pour sortir)
wc -l fichierCompte les lignes (-w les mots, -c les octets)
file inconnu.binDevine le type d'un fichier d'après son contenu

Pour modifier un fichier de configuration, Debian fournit deux éditeurs en mode texte. nano s'utilise tout de suite : les raccourcis sont affichés en bas (^O = Ctrl+O pour enregistrer, ^X pour quitter, ^W pour chercher). vim (ou vi, présent partout) demande un apprentissage : i pour passer en insertion, Échap pour en sortir, :wq pour enregistrer et quitter, :q! pour quitter sans enregistrer. Avec sudo, ouvre un fichier système par sudoedit /etc/nginx/nginx.conf : l'éditeur tourne avec tes droits, sur une copie, et seul l'enregistrement final se fait en administrateur.

Chercher des fichiers et du texte

find parcourt l'arborescence et filtre selon des critères :

bash
find /etc -name "*.conf"                     # par nom (les guillemets empêchent le shell de développer *)
find /var/log -type f -size +100M            # fichiers de plus de 100 Mio
find /srv/www -mtime -2                      # modifiés il y a moins de 2 jours
find /home -user dev-igarnier                # appartenant à un utilisateur
find /tmp -type f -mtime +30 -delete         # supprimer les fichiers vieux de plus de 30 jours

grep cherche un motif dans le contenu des fichiers :

bash
grep "server_name" /etc/nginx/sites-available/suivi   # lignes qui contiennent le motif
grep -i "error" /var/log/nginx/error.log             # sans tenir compte de la casse
grep -r "PermitRootLogin" /etc/ssh/                  # récursivement dans un dossier
grep -n "listen" /etc/nginx/nginx.conf               # avec les numéros de ligne
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"     # sans les commentaires ni les lignes vides
grep -c "Failed password" auth.log                   # nombre de lignes qui correspondent
grep -E "40[34]" access.log                          # expression régulière étendue : 403 ou 404

Dans un motif, ^ désigne le début de ligne et $ la fin : ^# correspond aux lignes qui commencent par #, ^$ aux lignes vides.

which et whereis disent où se trouve un programme : which nginx répond /usr/sbin/nginx.

Redirections et tubes

Chaque commande a trois flux : l'entrée standard (stdin, numéro 0, le clavier par défaut), la sortie standard (stdout, 1, l'écran) et la sortie d'erreur (stderr, 2, l'écran aussi). Le shell peut les rediriger :

SyntaxeEffet
commande > fichierÉcrit la sortie dans le fichier, en l'écrasant
commande >> fichierAjoute la sortie à la fin du fichier
commande 2> erreurs.txtÉcrit les erreurs dans un fichier
commande > tout.txt 2>&1Sortie et erreurs dans le même fichier
commande 2> /dev/nullJette les erreurs (/dev/null avale tout)
commande < fichierLit l'entrée depuis un fichier
cmd1 | cmd2Le tube (pipe) : la sortie de cmd1 devient l'entrée de cmd2
cmd1 && cmd2Lance cmd2 seulement si cmd1 a réussi
cmd1 || cmd2Lance cmd2 seulement si cmd1 a échoué

Le tube est l'outil le plus puissant du shell : on assemble de petites commandes qui font chacune une chose. Les plus utiles dans un tube :

CommandeRôle
sortTrie les lignes (-n numérique, -r inverse, -u sans doublons, -t';' -k3 sur le 3e champ)
uniq -cRegroupe les lignes identiques consécutives et les compte (d'où un sort avant)
cut -d';' -f1,3Garde les champs 1 et 3, avec ; comme séparateur
tr 'a-z' 'A-Z'Remplace des caractères
sed 's/ancien/nouveau/g'Remplace un texte par un autre sur chaque ligne
awk -F';' '{print $3}'Découpe chaque ligne en champs et affiche le 3e ; awk sait aussi filtrer et calculer
tee fichierAffiche et écrit dans un fichier (sudo tee écrit dans un fichier protégé)
xargsTransforme les lignes reçues en arguments d'une commande

Un exemple réel : les dix adresses IP qui ont fait le plus de requêtes sur le site de suivi.

bash
cut -d' ' -f1 /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -n 10

Lis-la de gauche à droite : extraire le premier champ (l'adresse du client), trier pour rapprocher les adresses identiques, compter les doublons, trier par nombre décroissant, garder les dix premières lignes.

Variables, historique et alias

Le shell garde des variables : echo $HOME affiche ton dossier personnel, echo $PATH la liste des dossiers où le shell cherche les programmes. Une variable se crée par NOM=valeur (sans espace autour du =) et se lit par $NOM. export NOM la transmet aux programmes lancés depuis ce shell.

history affiche les commandes tapées ; !42 relance la commande numéro 42. Un alias raccourcit une commande : alias ll='ls -lh'. Pour le garder, ajoute la ligne à la fin de ~/.bashrc, le fichier lu à chaque ouverture de shell.

$(commande) insère le résultat d'une commande dans une autre :

bash
sudo cp -a /etc/nginx /root/nginx-$(date +%F)    # crée /root/nginx-2026-11-04

Quand une suite de commandes revient souvent, on l'écrit dans un script Bash, avec des variables, des conditions et des boucles. C'est l'objet du cours Scripts PowerShell et Bash ; les chapitres 9 et 15 de ce cours-ci montrent comment en faire un service ou une tâche planifiée.

De PowerShell à Bash

Si tu as commencé par Windows, cette table de correspondance t'évite de chercher :

ActionPowerShellBash
Où suis-je ?Get-Location (pwd)pwd
ListerGet-ChildItem (ls, dir)ls -l
Changer de dossierSet-Location (cd)cd
Créer un dossierNew-Item -ItemType Directory (mkdir)mkdir
Copier, déplacer, supprimerCopy-Item, Move-Item, Remove-Itemcp, mv, rm
Lire un fichierGet-Content (cat)cat, less
Les 20 dernières lignesGet-Content -Tail 20tail -n 20
Chercher du texteSelect-Stringgrep
Chercher un fichierGet-ChildItem -Recurse -Filterfind
AideGet-Helpman, --help
ProcessusGet-Process, Stop-Processps, kill
Configuration IPGet-NetIPAddressip address

La grande différence : un tube PowerShell transporte des objets (avec leurs propriétés), un tube Bash transporte du texte, qu'on découpe avec cut, awk ou grep.

Exercices

Les exercices de ce chapitre utilisent le fichier livraisons.csv suivant. Crée-le dans ton dossier personnel avec nano livraisons.csv pour vérifier tes réponses.

text
id;date;ville;statut
1041;2026-11-02;Lyon;livré
1042;2026-11-02;Villeurbanne;livré
1043;2026-11-02;Lyon;en cours
1044;2026-11-03;Vénissieux;incident
1045;2026-11-03;Lyon;livré
1046;2026-11-03;Villeurbanne;en cours
1047;2026-11-03;Bron;livré
1048;2026-11-04;Lyon;incident

Exercice 1 sur 4 Chemins absolus et relatifs Réussi À revoir

Tu es dans /var/log/nginx. Donne le dossier où tu arrives après chaque commande, chacune partant de /var/log/nginx :

  1. cd ..
  2. cd ../../lib
  3. cd /etc/nginx/sites-available
  4. cd ~
  5. cd ./../apt
Voir la réponseMasquer la réponse de l'exercice 1
  1. /var/log
  2. /var/lib : .. mène à /var/log, le second .. à /var, puis lib.
  3. /etc/nginx/sites-available : un chemin absolu ne dépend pas du dossier courant.
  4. Ton dossier personnel, par exemple /home/clambert.
  5. /var/log/apt : . est le dossier courant, .. son parent /var/log, puis apt.

Tu avais trouvé ?

Exercice 2 sur 4 Lire le résultat d'un tube Réussi À revoir

Sans les exécuter, donne le résultat de chaque commande sur livraisons.csv.

  1. wc -l livraisons.csv
  2. grep -c "livré" livraisons.csv
  3. grep incident livraisons.csv | cut -d';' -f1,3
  4. tail -n +2 livraisons.csv | cut -d';' -f4 | sort -u
Voir la réponseMasquer la réponse de l'exercice 2
  1. 9 livraisons.csv : huit livraisons plus la ligne d'en-tête.
  2. 4 : les lignes 1041, 1042, 1045 et 1047.
  3. Deux lignes, le numéro et la ville :
    text
    1044;Vénissieux
    1048;Lyon
    
  4. tail -n +2 commence à la ligne 2 (il saute l'en-tête) ; on garde le 4e champ et on trie sans doublons :
    text
    en cours
    incident
    livré
    

Tu avais trouvé ?

Exercice 3 sur 4 Compter les livraisons par ville Réussi À revoir

Écris la commande qui affiche le nombre de livraisons par ville, de la ville la plus servie à la moins servie, sans compter l'en-tête. Donne aussi le résultat.

Voir la réponseMasquer la réponse de l'exercice 3
bash
tail -n +2 livraisons.csv | cut -d';' -f3 | sort | uniq -c | sort -rn
text
      4 Lyon
      2 Villeurbanne
      1 Vénissieux
      1 Bron

Le premier sort est indispensable : uniq -c ne regroupe que les lignes identiques qui se suivent. Sans lui, Lyon apparaîtrait plusieurs fois. Le second sort -rn trie par nombre décroissant ; à égalité, il range les lignes en ordre alphabétique inverse, d'où Vénissieux avant Bron.

Tu avais trouvé ?

Exercice 4 sur 4 Rediriger correctement Réussi À revoir

Pour chaque besoin, écris la commande :

  1. Enregistrer la liste détaillée de /etc/nginx dans ~/inventaire.txt, en remplaçant le contenu éventuel.
  2. Ajouter à la fin du même fichier la liste de /etc/ssh.
  3. Chercher tous les fichiers nommés *.conf sous /etc sans afficher les messages « Permission non accordée ».
  4. Ajouter la ligne 192.168.10.180 srv-journaux à la fin de /etc/hosts, qui appartient à root.
Voir la réponseMasquer la réponse de l'exercice 4
  1. ls -l /etc/nginx > ~/inventaire.txt
  2. ls -l /etc/ssh >> ~/inventaire.txt
  3. find /etc -name "*.conf" 2> /dev/null : les messages d'erreur partent sur la sortie d'erreur (2), qu'on jette.
  4. echo "192.168.10.180 srv-journaux" | sudo tee -a /etc/hosts. La forme sudo echo … >> /etc/hosts échoue, car la redirection est faite par ton shell sans privilège.

Tu avais trouvé ?

Chapitre terminé !

Fais les 4 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : L'arborescence Linux (FHS), les fichiers et les liensRevoir le sommaire du cours