Systèmes · Ligne de commande

Linux &
CLI

Système de fichiers, navigation, permissions, pipes, recherche, scripts Bash, SSH et gestion de paquets — de zéro à l'autonomie en terminal.

Introduction à Linux

🐧

Linux est un système d'exploitation open-source basé sur Unix. Il est omniprésent en développement, DevOps, cloud et embarqué. Maîtriser la ligne de commande (CLI) est indispensable pour tout développeur.

💡

Même sur Windows, le terminal WSL2 (Windows Subsystem for Linux) te donne un vrai environnement Linux. Sur macOS, le terminal est basé sur zsh — la plupart des commandes sont identiques.

DistributionUsageGestionnaire
Ubuntu / DebianDev, serveursapt
Fedora / RHELEntreprisednf / yum
Arch LinuxAvancéspacman
Alpine LinuxDocker, embarquéapk
bash
user@machine:~$ uname -a
Linux machine 6.5.0 #1 SMP x86_64 GNU/Linux
user@machine:~$ whoami
user
user@machine:~$ pwd
/home/user
user@machine:~$ echo $SHELL
/bin/bash
user@machine:~$ date
Thu Mar 6 14:23:01 CET 2025
user@machine:~$ uptime
14:23 up 2 days, 3:14, 2 users, load average: 0.42
⌨️

Raccourcis essentiels : Tab auto-complète, ↑↓ historique, Ctrl+C interrompt, Ctrl+D quitte, Ctrl+L efface l'écran, Ctrl+R recherche dans l'historique.

Système de fichiers

Linux utilise une arborescence unique à partir de / (racine). Chaque dossier a un rôle précis.

/ — racine du système
├── bin — commandes essentielles (ls, cp…)
├── boot — noyau et bootloader
├── dev — périphériques
├── etc — configuration système
├── home — dossiers utilisateurs
│   └── user — ton dossier (~)
├── lib — bibliothèques partagées
├── proc — processus en cours
├── root — dossier de root
├── tmp — fichiers temporaires
├── usr — programmes installés
│   ├── bin — programmes utilisateurs
│   └── local — logiciels locaux
└── var — logs, bases de données, cache
📍

Les chemins absolus partent de / (ex : /home/user/docs). Les chemins relatifs partent du dossier courant (ex : ./docs ou ../autre).

RaccourciSignification
~Dossier home de l'utilisateur (/home/user)
.Dossier courant
..Dossier parent
-Dossier précédent (cd -)
/Racine du système
chemins
$ ls /
bin boot dev etc home lib proc root tmp usr var
$ ls -la ~
total 48
drwxr-xr-x 8 user user 4096 Mar 6 14:00 .
drwxr-xr-x 3 root root 4096 Jan 1 00:00 ..
-rw------- 1 user user 1234 Mar 5 09:15 .bash_history

Fichiers & dossiers

CommandeAction
touch fichierCrée un fichier vide (ou met à jour la date)
mkdir dossierCrée un répertoire
mkdir -p a/b/cCrée les parents si nécessaire
cp src dstCopie fichier
cp -r src dstCopie répertoire (récursif)
mv src dstDéplace ou renomme
rm fichierSupprime un fichier
rm -rf dossierSupprime récursivement ⚠️
ln -s src lienCrée un lien symbolique
CommandeAction
cat fichierAffiche le contenu
less fichierAffiche page par page (q pour quitter)
head -n 20Affiche les 20 premières lignes
tail -n 20Affiche les 20 dernières lignes
tail -f logSuit un fichier en temps réel
wc -l fichierCompte les lignes
file fichierDétecte le type de fichier
stat fichierMétadonnées complètes
diff f1 f2Compare deux fichiers
⚠️

rm -rf est irréversible — pas de corbeille en ligne de commande. Utiliser trash-cli ou ajouter alias rm='rm -i' dans son ~/.bashrc.

fichiers en pratique
$ mkdir -p projet/{src,tests,docs}
créé: projet/src projet/tests projet/docs
$ touch projet/src/main.py
$ cp projet/src/main.py projet/src/main.bak.py
$ mv projet/src/main.bak.py projet/src/backup/
$ tail -f /var/log/syslog # suivi temps réel

Permissions

Chaque fichier a des permissions pour 3 entités : le propriétaire (user), son groupe (group), et les autres (others). Chaque entité a 3 bits : lecture (r=4), écriture (w=2), exécution (x=1).

User
rwx
4+2+1 = 7
Group
r-x
4+0+1 = 5
Others
r--
4+0+0 = 4
ChmodEffet
chmod 755 frwxr-xr-x (exécutable partagé)
chmod 644 frw-r--r-- (fichier standard)
chmod 600 frw------- (privé)
chmod +x fAjoute l'exécution
chmod -R 755 dirRécursif sur dossier
chown user:grp fChange propriétaire
sudo commandeExécute en root
permissions
$ ls -la script.sh
-rw-r--r-- 1 user user 1024 Mar 6 script.sh
$ chmod +x script.sh
$ ls -la script.sh
-rwxr-xr-x 1 user user 1024 Mar 6 script.sh
$ chmod 600 .env # privé → clés API
$ sudo chown -R www-data /var/www
# Lire qui a accès
$ stat script.sh
File: script.sh
Octal: 0755/ -rwxr-xr-x

Pipes & redirections

Le pipe | connecte la sortie d'une commande à l'entrée d'une autre. Les redirections contrôlent où vont les entrées/sorties.

cmd1|cmd2sortie de cmd1 → entrée de cmd2
cmd>fichierredirige stdout → écrase
cmd>>fichierredirige stdout → ajoute
cmd<fichierlit stdin depuis fichier
cmd2>err.logredirige stderr
cmd&>all.logstdout + stderr ensemble
cmd2>/dev/nullsilencieux sur erreurs
pipelines réels
# Compter les fichiers Python
$ ls *.py | wc -l
12
# Chercher les erreurs dans les logs
$ cat app.log | grep ERROR | tail -20
# Top 5 processus consommateurs
$ ps aux | sort -k3 -rn | head -5
# Sauvegarder la sortie
$ python3 script.py > output.txt 2>&1
# tee : afficher ET sauvegarder
$ ./build.sh | tee build.log

Recherche

find cherche des fichiers, grep cherche dans le contenu.

find — exemplesDescription
find . -name "*.py"Tous les .py récursivement
find . -type f -mtime -7Fichiers modifiés < 7 jours
find . -size +10MFichiers > 10 Mo
find . -name "*.log" -deleteCherche et supprime
find . -perm 777Fichiers avec permissions 777
find /etc -user root -readableLisibles par root
grep — exemplesDescription
grep "erreur" fichier.logLignes contenant "erreur"
grep -i "error" f.logInsensible à la casse
grep -r "TODO" ./srcRécursif dans un dossier
grep -n "def " script.pyAffiche les numéros de ligne
grep -v "DEBUG"Exclut les lignes avec DEBUG
grep -c "ERROR"Compte les occurrences
grep -E "^[0-9]+"Regex étendue (ERE)

ripgrep (rg) est une alternative ultrarapide à grep qui respecte .gitignore. Recommandé pour les gros projets.

Traitement de texte

CommandeRôle
sort fichierTrie les lignes
sort -k2 -n fTri numérique par colonne 2
uniqSupprime les doublons consécutifs
sort f | uniq -cCompte les occurrences
cut -d: -f1 /etc/passwdExtrait des colonnes
awk '{print $1,$3}'Traite des colonnes flexiblement
sed 's/foo/bar/g'Remplacement global
tr 'a-z' 'A-Z'Transformation caractère par caractère
sed & awk
# sed — remplacer dans un fichier
$ sed 's/localhost/prod.example.com/g' config.txt
$ sed -i 's/debug/info/g' app.conf # in-place
$ sed -n '10,20p' fichier # lignes 10-20
# awk — analyse CSV
$ awk -F',' '{print $1, $3}' data.csv
$ awk '{sum+=$2} END{print sum}' f
# Pipeline complet
$ cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head

Processus

CommandeDescription
ps auxTous les processus en détail
top / htopSupervision temps réel (htop = interactif)
kill PIDTermine un processus (SIGTERM)
kill -9 PIDForce la terminaison (SIGKILL)
pkill nomTue par nom de processus
pgrep nomTrouve le PID par nom
jobsListe les processus en arrière-plan
bg / fgReprend en arrière/premier plan
nohup cmd &Lance en arrière-plan persistant
systemctl status svcÉtat d'un service systemd
processus
# Trouver et tuer un processus
$ ps aux | grep python
user 1234 2.5 1.2 ... python3 app.py
$ kill 1234
# Lancer en arrière-plan
$ python3 server.py &
[1] 5678
$ jobs
[1]+ Running python3 server.py &
# Persistant après déconnexion
$ nohup python3 worker.py > worker.log 2>&1 &
# systemd — services
$ sudo systemctl start nginx
$ sudo systemctl enable nginx # au démarrage

Réseau

CommandeDescription
ip addr / ifconfigInterfaces réseau et adresses IP
ping hôteTest de connectivité
traceroute hôteRoute des paquets
nslookup / digRésolution DNS
curl URLRequête HTTP
wget URLTéléchargement de fichier
ss -tulnpPorts ouverts et services
netstat -tulnpConnexions actives
nc (netcat)Test TCP/UDP manuel
curl en pratique
# Requête GET
$ curl https://api.example.com/users
# GET avec headers
$ curl -H "Authorization: Bearer TOKEN" https://api.example.com/me
# POST JSON
$ curl -X POST -H "Content-Type: application/json" \
-d '{"name":"Alice"}' https://api.example.com/users
# Télécharger un fichier
$ wget -O ubuntu.iso https://releases.ubuntu.com/24.04/ubuntu.iso
# Voir les ports ouverts
$ ss -tulnp | grep LISTEN

Variables & environnement

Variables Bash
# Définir une variable (sans espaces autour de =)
NOM="Alice"
AGE=25

# Utiliser une variable
echo "Bonjour $NOM, tu as $AGE ans"
echo "Bonjour ${NOM}!"   # accolades si ambiguïté

# Variables spéciales
echo $0     # nom du script
echo $1 $2  # arguments positionnels
echo $#     # nombre d'arguments
echo $?     # code retour dernière commande
echo $$     # PID du shell courant

# Variables d'environnement
export DATABASE_URL="postgresql://localhost/db"
printenv           # affiche tout l'environnement
env | grep PATH
~/.bashrc et ~/.bash_profile
# ~/.bashrc — s'exécute à chaque shell interactif

# Alias utiles
alias ll='ls -la'
alias gs='git status'
alias python='python3'
alias ..='cd ..'
alias ...='cd ../..'

# Variables d'environnement persistantes
export PATH="$HOME/.local/bin:$PATH"
export EDITOR="nano"

# Prompt personnalisé
export PS1='\u@\h:\w\$ '

# Appliquer sans redémarrer
$ source ~/.bashrc    # ou: . ~/.bashrc

Scripts Bash

Structure d'un script
#!/bin/bash
# Description: script exemple
set -e          # arrête si erreur
set -u          # erreur si var non définie
set -o pipefail # erreur dans les pipes

# Fonctions
log() { echo "[$(date +%H:%M:%S)] $1"; }

# Vérification d'arguments
if [[ $# -lt 1 ]]; then
  echo "Usage: $0 <nom>"
  exit 1
fi

NOM=$1
log "Traitement de $NOM"

# Condition
if [[ -f "$NOM" ]]; then
  log "Fichier existant"
else
  log "Fichier absent"
  exit 2
fi
Structures de contrôle
# Boucle for
for fichier in *.py; do
  echo "Traitement: $fichier"
done

# Boucle while
i=0
while [[ $i -lt 5 ]]; do
  echo "i=$i"
  ((i++))
done

# Test de fichiers
[[ -f fichier ]]  # fichier existe
[[ -d dossier ]]  # dossier existe
[[ -r fichier ]]  # lisible
[[ -x fichier ]]  # exécutable

# Test de chaînes
[[ -z "$var" ]]   # vide
[[ -n "$var" ]]   # non vide
[[ "$a" == "$b" ]] # égalité
exécuter un script
$ chmod +x deploy.sh
$ ./deploy.sh production
[14:30:00] Déploiement en production
$ bash -n deploy.sh # vérifie syntaxe
$ bash -x deploy.sh # mode debug

SSH & accès distant

Connexion et clés SSH
# Connexion basique
ssh user@serveur.example.com

# Avec port non-standard
ssh -p 2222 user@serveur.example.com

# Générer une paire de clés
ssh-keygen -t ed25519 -C "monmail@example.com"
# → crée ~/.ssh/id_ed25519 (privée)
# → crée ~/.ssh/id_ed25519.pub (publique)

# Copier la clé publique sur le serveur
ssh-copy-id user@serveur.example.com

# Ou manuellement
cat ~/.ssh/id_ed25519.pub | ssh user@serveur \
  "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
~/.ssh/config — raccourcis
# ~/.ssh/config
Host prod
  HostName 203.0.113.10
  User deploy
  IdentityFile ~/.ssh/id_ed25519
  Port 22

Host dev
  HostName 192.168.1.100
  User ubuntu
  IdentityFile ~/.ssh/id_ed25519

# Usage simplifié
ssh prod              # au lieu de ssh deploy@203.0.113.10

# Transfert de fichiers avec scp
scp fichier.txt prod:/home/deploy/
scp -r ./dossier prod:/var/www/app/

# Tunnel SSH (port forwarding)
ssh -L 5432:localhost:5432 prod  # accès BDD distante
🔒

Ne jamais committer une clé privée (id_ed25519) dans Git. Ajouter *.pem, id_rsa, id_ed25519 dans .gitignore.

Gestion de paquets

apt (Debian/Ubuntu)Description
sudo apt updateMet à jour la liste des paquets
sudo apt upgradeMet à jour les paquets installés
sudo apt install pkgInstalle un paquet
sudo apt remove pkgDésinstalle
sudo apt autoremoveSupprime les orphelins
apt search termeRecherche un paquet
apt show pkgInfos sur un paquet
dpkg -lListe les paquets installés
Outils complémentairesDescription
curl | bashInstallers web (prudence !)
snap install pkgPaquets snap universels
flatpak installPaquets flatpak
pip install pkgPaquets Python
npm install -gPaquets Node.js globaux
setup dev Ubuntu
$ sudo apt update && sudo apt upgrade -y
$ sudo apt install -y git python3 python3-pip nodejs npm curl
$ curl -fsSL https://get.docker.com | sh

Cheat Sheet Linux/CLI

📁 Fichiers & navigation

pwdRépertoire courant
ls -laListe détaillée + cachés
cd ~Aller au home
mkdir -pCrée avec parents
cp -rCopie récursive
rm -rfSupprime récursivement ⚠️
find . -nameRecherche par nom

🔍 Recherche & texte

grep -rCherche dans fichiers
grep -nAvec numéros de ligne
grep -vExclut les correspondances
sed 's/a/b/g'Remplacement global
awk '{print $1}'Première colonne
sort | uniq -cCompte occurrences
wc -lCompte les lignes

⚙️ Processus & système

ps auxTous les processus
htopSupervision interactive
kill PIDArrête un processus
kill -9 PIDForce l'arrêt
nohup cmd &Persistent background
df -hEspace disque
du -sh *Taille des dossiers

🌐 Réseau & SSH

curl -X POSTRequête HTTP
wget URLTéléchargement
ss -tulnpPorts ouverts
ssh user@hostConnexion distante
scp src dstCopie distante
ssh-keygen -t ed25519Génère clé SSH
ssh-copy-id hostDéploie clé pub