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.
| Distribution | Usage | Gestionnaire |
|---|---|---|
| Ubuntu / Debian | Dev, serveurs | apt |
| Fedora / RHEL | Entreprise | dnf / yum |
| Arch Linux | Avancés | pacman |
| Alpine Linux | Docker, embarqué | apk |
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.
Les chemins absolus partent de / (ex : /home/user/docs). Les chemins relatifs partent du dossier courant (ex : ./docs ou ../autre).
| Raccourci | Signification |
|---|---|
~ | Dossier home de l'utilisateur (/home/user) |
. | Dossier courant |
.. | Dossier parent |
- | Dossier précédent (cd -) |
/ | Racine du système |
Fichiers & dossiers
| Commande | Action |
|---|---|
| touch fichier | Crée un fichier vide (ou met à jour la date) |
| mkdir dossier | Crée un répertoire |
| mkdir -p a/b/c | Crée les parents si nécessaire |
| cp src dst | Copie fichier |
| cp -r src dst | Copie répertoire (récursif) |
| mv src dst | Déplace ou renomme |
| rm fichier | Supprime un fichier |
| rm -rf dossier | Supprime récursivement ⚠️ |
| ln -s src lien | Crée un lien symbolique |
| Commande | Action |
|---|---|
| cat fichier | Affiche le contenu |
| less fichier | Affiche page par page (q pour quitter) |
| head -n 20 | Affiche les 20 premières lignes |
| tail -n 20 | Affiche les 20 dernières lignes |
| tail -f log | Suit un fichier en temps réel |
| wc -l fichier | Compte les lignes |
| file fichier | Détecte le type de fichier |
| stat fichier | Métadonnées complètes |
| diff f1 f2 | Compare 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.
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).
| Chmod | Effet |
|---|---|
| chmod 755 f | rwxr-xr-x (exécutable partagé) |
| chmod 644 f | rw-r--r-- (fichier standard) |
| chmod 600 f | rw------- (privé) |
| chmod +x f | Ajoute l'exécution |
| chmod -R 755 dir | Récursif sur dossier |
| chown user:grp f | Change propriétaire |
| sudo commande | Exécute en root |
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.
Recherche
find cherche des fichiers, grep cherche dans le contenu.
| find — exemples | Description |
|---|---|
| find . -name "*.py" | Tous les .py récursivement |
| find . -type f -mtime -7 | Fichiers modifiés < 7 jours |
| find . -size +10M | Fichiers > 10 Mo |
| find . -name "*.log" -delete | Cherche et supprime |
| find . -perm 777 | Fichiers avec permissions 777 |
| find /etc -user root -readable | Lisibles par root |
| grep — exemples | Description |
|---|---|
| grep "erreur" fichier.log | Lignes contenant "erreur" |
| grep -i "error" f.log | Insensible à la casse |
| grep -r "TODO" ./src | Récursif dans un dossier |
| grep -n "def " script.py | Affiche 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
| Commande | Rôle |
|---|---|
| sort fichier | Trie les lignes |
| sort -k2 -n f | Tri numérique par colonne 2 |
| uniq | Supprime les doublons consécutifs |
| sort f | uniq -c | Compte les occurrences |
| cut -d: -f1 /etc/passwd | Extrait 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 |
Processus
| Commande | Description |
|---|---|
| ps aux | Tous les processus en détail |
| top / htop | Supervision temps réel (htop = interactif) |
| kill PID | Termine un processus (SIGTERM) |
| kill -9 PID | Force la terminaison (SIGKILL) |
| pkill nom | Tue par nom de processus |
| pgrep nom | Trouve le PID par nom |
| jobs | Liste les processus en arrière-plan |
| bg / fg | Reprend en arrière/premier plan |
| nohup cmd & | Lance en arrière-plan persistant |
| systemctl status svc | État d'un service systemd |
Réseau
| Commande | Description |
|---|---|
| ip addr / ifconfig | Interfaces réseau et adresses IP |
| ping hôte | Test de connectivité |
| traceroute hôte | Route des paquets |
| nslookup / dig | Résolution DNS |
| curl URL | Requête HTTP |
| wget URL | Téléchargement de fichier |
| ss -tulnp | Ports ouverts et services |
| netstat -tulnp | Connexions actives |
| nc (netcat) | Test TCP/UDP manuel |
Variables & environnement
# 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 — 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
#!/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
# 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é
SSH & accès distant
# 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
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 update | Met à jour la liste des paquets |
| sudo apt upgrade | Met à jour les paquets installés |
| sudo apt install pkg | Installe un paquet |
| sudo apt remove pkg | Désinstalle |
| sudo apt autoremove | Supprime les orphelins |
| apt search terme | Recherche un paquet |
| apt show pkg | Infos sur un paquet |
| dpkg -l | Liste les paquets installés |
| Outils complémentaires | Description |
|---|---|
| curl | bash | Installers web (prudence !) |
| snap install pkg | Paquets snap universels |
| flatpak install | Paquets flatpak |
| pip install pkg | Paquets Python |
| npm install -g | Paquets Node.js globaux |
Cheat Sheet Linux/CLI
📁 Fichiers & navigation
pwd | Répertoire courant |
ls -la | Liste détaillée + cachés |
cd ~ | Aller au home |
mkdir -p | Crée avec parents |
cp -r | Copie récursive |
rm -rf | Supprime récursivement ⚠️ |
find . -name | Recherche par nom |
🔍 Recherche & texte
grep -r | Cherche dans fichiers |
grep -n | Avec numéros de ligne |
grep -v | Exclut les correspondances |
sed 's/a/b/g' | Remplacement global |
awk '{print $1}' | Première colonne |
sort | uniq -c | Compte occurrences |
wc -l | Compte les lignes |
⚙️ Processus & système
ps aux | Tous les processus |
htop | Supervision interactive |
kill PID | Arrête un processus |
kill -9 PID | Force l'arrêt |
nohup cmd & | Persistent background |
df -h | Espace disque |
du -sh * | Taille des dossiers |
🌐 Réseau & SSH
curl -X POST | Requête HTTP |
wget URL | Téléchargement |
ss -tulnp | Ports ouverts |
ssh user@host | Connexion distante |
scp src dst | Copie distante |
ssh-keygen -t ed25519 | Génère clé SSH |
ssh-copy-id host | Déploie clé pub |