« Le port est déjà occupé » sur un serveur
Première ligne de l'index inverse : ss -tulnp | grep :8080 pour trouver le PID, kill <PID>, ou directement kill -9 $(lsof -t -i :8080).
Guide
L'aide-mémoire des commandes Linux range les 160 commandes que l'on tape au quotidien dans le terminal en huit catégories — fichiers et répertoires, consulter et modifier un contenu, traitement de texte, permissions et utilisateurs, processus et services, réseau, compression et archivage, informations et administration système — avec pour chacune une explication et quelques lignes d'exemple directement copiables. Les commandes à nombreuses options comme ls, find, grep, sed, awk, tar, curl, ss ou journalctl ont en plus un tableau d'options courantes, dépliable à la demande.
Mis à jour le 2026-09-094 sources10 min read
L'aide-mémoire des commandes Linux range les 160 commandes que l'on tape au quotidien dans le terminal en huit catégories — fichiers et répertoires, consulter et modifier un contenu, traitement de texte, permissions et utilisateurs, processus et services, réseau, compression et archivage, informations et administration système — avec pour chacune une explication et quelques lignes d'exemple directement copiables. Les commandes à nombreuses options comme ls, find, grep, sed, awk, tar, curl, ss ou journalctl ont en plus un tableau d'options courantes, dépliable à la demande.
Il répond à deux façons de chercher. Soit vous connaissez le nom de la commande et avez oublié les paramètres (cherchez tar, chmod) ; soit vous savez seulement ce que vous voulez voir — « quel processus occupe le port 8080 », « quel répertoire prend le plus de place », « pourquoi ce service ne démarre pas ». Pour ce second cas, un index « je veux voir… → quelle commande » part de l'objectif et donne 2–3 commandes qui l'atteignent, de la plus recommandée à la plus compatible.
En bas de page tourne un terminal simulé dans le navigateur : système de fichiers en mémoire, interpréteur Shell d'une soixantaine de commandes, prise en charge des tubes, des redirections, des jokers et d'un sous-ensemble courant de sed/awk, avec 8 niveaux d'exercice allant de la création d'une arborescence à la statistique de journaux par tubes. Il n'accède ni à votre ordinateur ni au réseau : une erreur de rm -rf ne fait que réinitialiser le niveau.
help liste toutes les commandes prises en charge par le simulateur et Tab complète les noms de fichiers.Une recherche sur « port » fait remonter à la fois le tableau de commandes et l'index inverse :
Une résolution complète du niveau 8, « combinaison de tubes », dans le terminal simulé :
Je veux voir : quel processus occupe un port
ss -tulnp | grep :8080
lsof -i :8080
netstat -tulnp | grep 8080 anciens systèmes
Réseau › ss -tulnp voir les ports en écoute et les processus associés (remplace netstat)
Réseau › lsof -i :<port> quel processus occupe un portuser@toolun-lab:~$ awk '{print $2}' access.log | sort | uniq -c | sort -rn
3 /index.html
2 /api/list
2 /about
✔ Niveau réussi : combinaison de tubes : les chemins les plus visités.Deux principes de la conception Unix déterminent la forme de ce tableau. « Tout est fichier » : les périphériques, les informations de processus (/proc) et les sockets sont exposés comme des fichiers, d'où des usages étranges en apparence mais valides comme cat /proc/cpuinfo, ls -l /dev/sd* ou echo > /dev/tcp/host/port. « Chaque programme fait une seule chose et la fait bien » : grep filtre, sort trie, uniq fusionne les doublons adjacents, wc compte — chacun est minuscule, et la puissance vient du tube qui les enchaîne.
C'est aussi pourquoi | apparaît partout dans les exemples : awk '{print $1}' access.log | sort | uniq -c | sort -rn | head assemble cinq petits programmes pour obtenir « les IP les plus fréquentes » ; comprendre l'entrée et la sortie de chaque segment est plus utile que mémoriser la commande entière.
Chaque processus démarre avec trois « fichiers » déjà ouverts : l'entrée standard (0), la sortie standard (1) et l'erreur standard (2). > écrit la sortie standard dans un fichier, 2> traite le flux d'erreur, 2>&1 fusionne l'erreur dans la sortie et &> est le raccourci de bash. La combinaison la plus fréquente au quotidien est cmd > out.log 2>&1 & : sortie normale et erreurs vont dans le journal, puis le tout passe en arrière-plan. Oublier 2>&1 est la première cause de « pourquoi il n'y a aucune erreur dans le journal ».
Dans ls -l, la première colonne -rwxr-xr-x se lit en quatre segments : le type (- fichier, d répertoire, l lien), puis trois caractères chacun pour le propriétaire, le groupe et les autres, avec lecture (4), écriture (2) et exécution (1). La somme des trois donne la notation chiffrée : rwx=7, r-x=5, r--=4, donc 755 signifie « je peux tout, les autres lisent et exécutent » et 644 « je lis et écris, les autres lisent ». Pour un répertoire, x veut dire « pouvoir y entrer » : sans x, même avec r, le contenu ne peut pas être listé. 600/700 servent aux clés privées et à ~/.ssh — un client SSH refuse un fichier de clé aux permissions trop larges. Pour d'autres combinaisons, cochez les cases du Calculateur chmod.
Le nom kill est trompeur : il ne fait qu'envoyer un signal au processus. Le TERM par défaut (15) signifie « veuillez quitter », le programme a une chance de sauvegarder son état ; KILL (9) est appliqué directement par le noyau, sans aucune chance — donc kill d'abord, et kill -9 seulement après quelques secondes sans effet. HUP (1) est la convention « recharger la configuration » des démons : nginx -s reload repose sur lui.
Les distributions modernes gèrent les services via systemd : systemctl les démarre, les arrête et les active au démarrage, journalctl centralise leurs journaux. Le parcours type du dépannage « le service ne démarre pas » est systemctl status pour l'état et les dernières lignes → journalctl -u <service> -n 100 pour l'erreur complète → ss -tlnp pour vérifier si le port est déjà pris.
ifconfig, netstat, route et arp appartiennent à net-tools, qui n'est plus maintenu et n'est plus installé par défaut ; leurs équivalents iproute2 sont ip addr, ss, ip route et ip neigh. Ce tableau liste les deux, et l'index inverse place les nouveaux outils en tête. Les cinq lettres de ss -tulnp correspondent à TCP, UDP, écoute, ports numériques et processus : c'est presque toujours l'ouverture du diagnostic d'un problème de port.
Le -i de GNU sed peut s'employer sans argument ; le sed BSD (fourni avec macOS) exige un suffixe de sauvegarde après -i, d'où l'écriture sed -i '' 's/a/b/' file. D'autres différences existent : date -d (GNU) contre date -v (BSD), ou readlink -f absent des anciennes versions de macOS. Ce tableau suit la version GNU et signale les écarts macOS dans les notes de chaque entrée ; brew install coreutils gnu-sed permet d'installer les versions GNU.
yast), les commandes d'environnements de bureau et les CLI propres à un langage sont exclus.sed ne prend en charge que s///, N,Mp et Nd, awk seulement {print $N} ; pas de réseau (curl, ssh, apt expliquent pourquoi), pas de vrais processus (ps, top, kill renvoient des données de démonstration fixes), pas d'éditeur interactif (écrivez des fichiers avec echo > ou cat >>).Première ligne de l'index inverse : ss -tulnp | grep :8080 pour trouver le PID, kill <PID>, ou directement kill -9 $(lsof -t -i :8080).
Le groupe « traitement de texte » couvre toute la chaîne, de grep -A3 -B1 pour le contexte à awk/sort/uniq -c pour les statistiques, puis tail -F pour suivre un journal qui tourne ; les niveaux 3 et 8 du terminal d'entraînement portent exactement sur ces deux cas.
tar -czvf → scp / rsync -avz → tar -xzvf -C /var/www/, trois commandes voisines ; le piège de rsync --delete est signalé dans les notes.
Dans « informations et administration système », enchaînez cat /etc/os-release, nproc, free -h, df -h, ss -tlnp et systemctl list-units : dix minutes suffisent pour une vue d'ensemble.
En principe non. Linux n'a pas de corbeille et rm libère directement l'inode. Avant d'agir sur un répertoire important, vérifiez le chemin avec ls, mettez les variables entre guillemets et testez leur vacuité dans vos scripts (rm -rf "${DIR:?}"/), ou remplacez rm par un outil comme trash-cli.
Le plus souvent, le terminal et le fichier n'ont pas le même encodage. Regardez d'abord l'encodage avec file nom-du-fichier, convertissez un fichier GBK en UTF-8 avec iconv -f GBK -t UTF-8 avant de chercher ; grep -a force le traitement comme texte d'un fichier pris à tort pour du binaire.
Les colonnes de ss -tulnp sont, dans l'ordre : Netid, State, Recv-Q, Send-Q, Local Address:Port, Peer Address:Port, Process. Pour le port, regardez Local Address:Port (*:8080 ou 0.0.0.0:8080 signifie une écoute sur toutes les interfaces) ; pour le processus, la dernière colonne, du type users:(("node",pid=842,fd=18)).
Il tourne dans le navigateur, sans pile réseau, et ne doit pas envoyer de requêtes à votre place ; ces commandes renvoient une explication et un renvoi vers l'entrée du tableau. L'entraînement porte sur les fichiers, le texte et les permissions, entièrement disponibles dans le système de fichiers en mémoire.
Lire un fichier auquel vous avez déjà accès ne demande rien ; modifier des répertoires système (/etc, /usr), écouter un port inférieur à 1024, consulter le détail des processus d'autrui, gérer les services et les paquets exigent root. sudo exécute une commande en tant que root, ce qui est plus sûr que de passer root pour une longue session.
Les données de l'aide-mémoire, l'index inverse et le terminal simulé sont des contenus statiques téléchargés avec la page et exécutés localement dans le navigateur ; la recherche, la copie et les exercices n'envoient aucune requête. Les favoris sont conservés dans le localStorage de la machine. Le système de fichiers du terminal simulé n'existe que dans la mémoire de la page courante, vidé à chaque rechargement, sans jamais lire ni écrire vos vrais fichiers.
ls, cp, sort, cut, etc.ss(8), ip(8), find(1) et grep(1).Mis à jour le 2026-09-09
160 commandes Linux/Shell classées par fichiers, texte, permissions, processus, réseau, archives et système, avec tableaux d’options et exemples réels ; un index « ce que je cherche → quelle commande » ; recherche, copie, favoris et terminal d’entraînement
Cet outil n’est pas entièrement traduit ; certains contenus utilisent la langue source ou une langue de repli.
Recherche par objectif : dites d’abord ce que vous voulez savoir, puis 2–3 commandes pour l’obtenir, classées du plus récent au plus ancien et de la plus recommandée à la plus compatible.
pwd # /var/www/site
ls -la # verbeux + fichiers cachés ls -lh # taille lisible par l'homme ls-lt | head # Afficher les dernières nouveautés dans l'ordre inverse de l'heure de modification
| -l | Forme longue : autorisations, propriétaire, taille, heure |
| -a | Contient des fichiers cachés commençant par . |
| -h | Taille en K/M/G |
| -t | Trier par heure de modification |
| -S | Trier par taille |
| -R | Sous-répertoire récursif |
| -d | Listez uniquement le répertoire lui-même et n'y entrez pas |
cd /var/log cd .. # Niveau précédent cd - # Retour au répertoire précédent cd # Répertoire personnel (identique à cd ~)
mkdir -p app/src/{components,utils}
mkdir -m 700 private| -p | Créer de manière récursive, aucune erreur ne sera signalée si elle existe déjà |
| -m | Spécifier les autorisations |
| -v | Montrer ce qui a été créé |
touch README.md touch -d "2026-01-01" old.log # Spécifiez l'heure
cp a.txt b.txt cp -r src/ backup/ # Le répertoire nécessite -r cp -a /etc/nginx ~/nginx-bak # Réserver les autorisations et l'heure
| -r / -R | Copier des répertoires de manière récursive |
| -a | Archive : égal à -dR --preserve=all |
| -i | Renseignez-vous avant la couverture |
| -n | Ne pas écraser les fichiers existants |
| -u | Copier uniquement lorsque la source est mise à jour |
| -v | afficher le processus |
mv ancien.txt nouveau.txt # Renommer mv *.log logs/ # Déplacement par lots mv -i a.txt dir/ # Demander avant d'écraser
| -i | Renseignez-vous avant la couverture |
| -n | Non couvert |
| -f | Forcer la couverture |
| -v | afficher le processus |
rm file.txt rm -r build/ # Supprimer le répertoire rm -rf node_modules # Ne pas confirmer ou ignorer la non-existence
rm n'entre pas dans la corbeille. Avant rm -rf, faites écho à la variable path pour voir si elle est vide : rm -rf "$DIR"/ est égal à rm -rf / lorsque DIR est vide.
| -r | Supprimer des répertoires de manière récursive |
| -f | Ne demande pas, ignore que ça n'existe pas |
| -i | Confirmez un par un |
| -d | Supprimer les répertoires vides |
| -- | Les paramètres suivants sont des options inappropriées (supprimer les fichiers commençant par -) |
rmdir empty-dir rmdir -p a/b/c # avec le répertoire parent vide
ln -s /opt/app/current ~/app ln -sf lien nouvelle cible # Écraser les liens existants readlink -f link # Voir où pointe le lien
find . -name "*.log"
find /var -type f -size +100M # Fichiers de plus de 100 Mo
trouver . -mtime -7 -name "*.js" # Modifié dans les 7 jours
find . -name "*.tmp" -delete
find . -type f -exec chmod 644 {} \;| -name / -iname | Par nom (-iname ignore la casse) |
| -type f|d|l | Fichier/Répertoire/Lien |
| -size +10M / -1k | par taille |
| -mtime -N / +N | Modifié il y a N jours/N jours |
| -maxdepth N | limite de profondeur |
| -exec cmd {} \; | Exécuter la commande pour chaque résultat |
| -delete | Supprimer les correspondances |
| -empty | Fichier ou répertoire vide |
sudo updatedb locate nginx.conf
which python3 tapez ls # bash intégré, vous pouvez voir les alias/commandes intégrées/externes command -v node # Détermine si la commande existe dans le script
tree -L 2 tree -a -I "node_modules|.git" # exclure
file photo.bin # photo.bin: JPEG image data, ...
stat app.log stat -c "%s %n" * # Juste la taille et le nom
du -sh . du -sh * | trier -rh | head # Qui prend le plus de place du -h --max-depth=1 /var
| -s | Afficher le total uniquement |
| -h | lisible par l'homme |
| --max-depth=N | Niveau de restriction |
| -a | Contient des fichiers |
df -h df -h /home df -i # utilisation de l'inode (complet lorsqu'il y a trop de fichiers)
basename /var/log/syslog # syslog basename report.pdf .pdf # report dirname /var/log/syslog # /var/log
realpath ../config.yml
rsync -avz --progress src/ user@host:/srv/app/ rsync -av --delete ./dist/ /var/www/site/ # Supprimez également les fichiers redondants dans la cible rsync -avn src/ dst/ # -n aperçu uniquement
La présence ou l'absence de / à la fin du répertoire source a différentes significations : src/ synchronise le contenu, et src synchronise le répertoire lui-même.
| -a | Mode d'archivage (récursif + conserver les attributs) |
| -v | afficher le processus |
| -z | compression de transmission |
| --delete | Supprimer les fichiers redondants du côté cible |
| -n / --dry-run | Seulement un aperçu |
| --exclude=PAT | exclure |
| -P | Progression + reprise à partir du point d'arrêt |
scp app.tar.gz user@1.2.3.4:/tmp/ scp -r user@host:/var/log/app ./logs scp -P 2222 file user@host:~ # Spécifiez le port (P majuscule)
cat config.yml cat -n app.js # avec numéro de ligne cat a.txt b.txt > all.txt # Épissage
| -n | Numéro de ligne |
| -A | Afficher les caractères invisibles (^M est CRLF) |
| -s | Compresser les lignes vides consécutives |
less /var/log/syslog #/recherche par mot clé n suivant G pour terminer g jusqu'au début q quitter F suivre (comme tail -f)
| -N | Afficher le numéro de ligne |
| -S | Ne cassez pas la ligne |
| +F | Entrez en mode suivi |
| -i | La recherche ignore la casse |
head -n 20 app.log head -c 100 fichier.bin # 100 premiers octets head -n -5 fichier # sauf les 5 dernières lignes
tail -n 50 app.log tail -f /var/log/nginx/access.log tail -F app.log # Continuez à suivre après la rotation du fichier
| -n N | N lignes suivantes |
| -f | Suivez et ajoutez |
| -F | Suivre et gérer la reconstruction des fichiers |
| -n +N | De la ligne N jusqu'à la fin |
wc -l access.log ls | wc -l #Combien d'éléments y a-t-il dans le répertoire ? chat *.py | wc -l # Nombre de lignes de code
diff -u old.conf new.conf diff -r dir1 dir2 # Comparer les répertoires diff <(sort a) <(sort b) # Comparez le contenu trié
| -u | format unifié |
| -r | Comparer les répertoires de manière récursive |
| -q | Signalez seulement si cela diffère |
| -w | ignorer les espaces |
| -i | Ignorer le cas |
cmp a.bin b.bin
nl -ba script.sh # Les lignes vides sont également numérotées
tac app.log | less
strings app.bin | grep -i version
xxd file.bin | head -20 xxd -r dump.txt > fichier.bin # Restaurer
nano /etc/hosts # Ctrl+O Enregistrer Ctrl+X Quitter Ctrl+W Rechercher Ctrl+K Couper la ligne
vim app.conf # :wq Enregistrez et quittez :q! Quitter sans enregistrer / recherche de mots dd supprimer la ligne u annuler : définir le numéro de ligne nu
make 2>&1 | tee build.log écho "texte" | sudo tee /etc/file # Utilisez sudo pour écrire des fichiers protégés cmd | tee -a log.txt # Ajouter
ls > list.txt echo "line" >> notes.txt cmd > out.log 2>&1 # Tout enregistrer cmd 2>/dev/null # supprimer les erreurs cmd &> all.log # abréviation bash
ps aux | grep nginx cat log | grep ERROR | wc -l history | tail -20
grep -rn "TODO" src/
grep -i error app.log
grep -v "^#" nginx.conf | grep -v "^$" # Supprime les commentaires et les lignes vides
grep -E "5[0-9]{2}" access.log # Expression régulière étendue
grep -l "main" *.c # Liste uniquement les noms de fichiers
grep -A3 -B1 "Exception" app.log # Première et trois dernières lignes de contexte| -r / -R | répertoire récursif |
| -n | Afficher le numéro de ligne |
| -i | Ignorer le cas |
| -v | Inverser la sélection (lignes sans motif) |
| -E | Expression régulière étendue (identique à egrep) |
| -F | comme chaîne fixe |
| -w | correspondance de mots entiers |
| -c | Comptez simplement le nombre de lignes |
| -l | Répertorier uniquement les noms de fichiers correspondants |
| -o | Afficher uniquement la pièce correspondante |
| -A/-B/-C N | Après/avant/avant et après N lignes de contexte |
| --include="*.js" | Limiter les noms de fichiers lors de la récurrence |
rg "TODO" --type ts
rg -n "fetch\(" src/sed 's/foo/bar/g' a.txt # Afficher le résultat du remplacement sed -i 's/foo/bar/g' a.txt # Modifier les fichiers directement (GNU) sed -i.bak 's/8080/80/' app.conf # Effectuer une sauvegarde avant d'apporter des modifications sed 's#/usr/local#/opt#g' f # Le délimiteur peut être remplacé
| -i | Modifier sur place (macOS nécessite -i '') |
| -n | Imprimer uniquement les lignes sélectionnées par la commande p |
| -e | plusieurs scripts |
| -E | régulier prolongé |
| g drapeau | Remplacer tout sur une seule ligne |
sed -n '10,20p' app.log # Lignes 10 à 20 sed '5d' f.txt # Supprimer la ligne 5 sed '/^$/d' f.txt # Supprimer les lignes vides sed '3i\new line' f.txt # Insérer avant la ligne 3
awk '{print $1}' access.log | trier | uniq-c | trier -rn | head # Les IP les plus visitées
awk -F : '{print $1}' /etc/passwd # nom d'utilisateur
awk '$3 > 100 {print $0}' data.txt # La troisième colonne comporte plus de 100 lignes
awk '{somme += $2} END {print sum}' f # Somme| -F <séparateur> | Séparateur de champs (vide par défaut) |
| $0 / $1 / $NF | Ligne entière / 1ère colonne / dernière colonne |
| NR | Numéro de ligne actuel |
| BEGIN{} / END{} | Exécuter avant le début/après la fin |
| /régulier/{…} | Traiter uniquement les lignes correspondantes |
cut -d, -f1,3 data.csv cut -d: -f1 /etc/passwd cut -c1-8 fichier # par position du caractère
sort names.txt sort -n nums.txt # Par valeur numérique sort -k2 -t, -r data.csv # Trier par colonne 2 dans l'ordre inverse sort -u list.txt # Trier et supprimer les doublons sort -h tailles.txt # Selon la taille K/M/G
| -n | en valeur |
| -r | ordre inverse |
| -k N | par colonne N |
| -t <séparateur> | Séparateur de colonnes |
| -u | Supprimer les doublons |
| -h | taille lisible par l'homme |
| -V | Tri des numéros de version (1.2 < 1.10) |
sort words.txt | uniq -c | sort -rn trier un.txt | uniq -d # Afficher uniquement les doublons trier un.txt | uniq -u # Afficher uniquement les uniques
echo hello | tr a-z A-Z # HELLO tr -d '\r' < win.txt > unix.txt # Supprimer CR tr -s ' ' < f # Compresser les espaces consécutifs écho $CHEMIN | tr ':' '\n' # Un par ligne
find . -name "*.log" | xargs rm
trouver . -name "*.txt" -print0 | xargs -0 wc -l # Le nom du fichier contient des espaces
chat urls.txt | xargs -n1 -P4 curl -sO # parallèle à 4 voies
echo a b c | xargs -I{} echo "item: {}"| -0 | NUL séparé (avec find -print0) |
| -n N | Passer N paramètres à chaque fois |
| -I {} | Utilisez {} pour occuper de l'espace |
| -P N | N parallèle |
| -r | Ne pas exécuter lorsque l'entrée est vide |
paste -d, names.txt emails.txt
join -t, -1 1 -2 1 <(sort a.csv) <(sort b.csv)
cat /etc/fstab | column -t mount | column -t
echo abc | rev # cba
plier -w 80 -s long.txt # -s plier aux espaces
iconv -f GBK -t UTF-8 gbk.txt > utf8.txt icônev -l | grep -i gb # Liste les encodages pris en charge
dos2unix script.sh sed -i "s/\r$//" script.sh # Lorsque dos2unix n'est pas installé
curl -s https://api.github.com/repos/git/git | jq .stargazers_count jq ".items[] | .name" data.json jq -r ".[].id" list.json # -r chaîne originale sans guillemets chat a.json | jq. # Formatage
echo "Hello" echo -e "a\tb\nc" echo $HOME echo "PATH=$PATH" >> ~/.bashrc
printf "%-10s %5d\n" name 42 printf "%.2f\n" 3.14159 printf "%s\n" *.txt # Un nom de fichier par ligne
seq 1 10 séq 0 5 100 # taille de pas 5 for i in $(seq 1 3); do echo $i; done
echo "2^10" | bc echo "scale=3; 10/3" | bc écho "obase=16; 255" | bc # Convertir en hexadécimal
chmod 755 script.sh # rwxr-xr-x chmod 644 file.txt # rw-r--r-- chmod 600 ~/.ssh/id_ed25519 # Vous seul pouvez lire et écrire chmod -R 755 public/ # récursif
| 755 | Valeurs communes pour le répertoire/exécutable |
| 644 | Valeurs communes pour les fichiers ordinaires |
| 600 | Fichiers de clé privée et de mot de passe |
| 700 | Répertoire privé (tel que ~/.ssh) |
| -R | récursivité |
chmod +x déployer.sh # Ajouter un exécutable chmod u+w,go-w file # Le propriétaire peut écrire, les autres ne peuvent pas chmod a-x file chmod g+s shared/ # Répertoire setgid : nouveau groupe d'héritage de fichiers
sudo chown www-data:www-data -R /var/www/site sudo chown $USER file.txt projet de développeurs chgrp/ # uniquement shuffle
umask umask 027 # Groupe en lecture seule, les autres n'ont aucune autorisation
sudo apt update sudo -i # Passer au shell interactif racine sudo -u postgres psql # Exécuter en tant qu'autre utilisateur sudo !! # Utilisez sudo pour réexécuter le précédent
su - deploy sortir # revenir
whoami id id déployer # Voir les autres utilisateurs
sudo useradd -m -s /bin/bash deploy sudo passwd deploy sudo usermod -aG sudo déployer # Rejoindre le groupe sudo
sudo usermod -aG docker $USER newgrp docker # Ou reconnectez-vous pour prendre effet
sudo userdel -r olduser
passwd sudo passwd deploy sudo passwd -l déployer # Verrouiller le compte
groups groups www-data cat /etc/group | grep docker
who w last -n 10 lastlog
ssh-keygen -t ed25519 -C "me@example.com" cat ~/.ssh/id_ed25519.pub ssh-copy-id user@host # Installer la clé publique sur le serveur
ssh user@1.2.3.4 ssh -p 2222 user@host #Spécifier le port ssh -i ~/.ssh/key.pem ubuntu@host ssh -L 8080:localhost:80 user@host # Redirection de port ssh user@host "uptime" # Exécuter une seule commande
| -p | port |
| -i | fichier de clé privée |
| -L local:cible:port | redirection de port local |
| -N | Seul le transfert n'ouvre pas le shell |
| -v | Problèmes de connexion de débogage |
Host prod
HostName 1.2.3.4
User deploy
Port 2222
IdentityFile ~/.ssh/prod_keyps aux | grep nginx ps -ef | grep java ps aux --sort=-%mem | head # Le plus consommateur de mémoire ps -p 1234 -o pid,etime,cmd # Depuis combien de temps un processus est-il en cours d'exécution ?
| aux | Style BSD : tous les utilisateurs, y compris les terminaux, verbeux |
| -ef | Style UNIX : tous les processus, y compris le processus parent |
| --sort=-%cpu | Trier par CPU dans l'ordre inverse |
| -p PID | Spécifier le processus |
| -o champ | Colonnes personnalisées |
pgrep -f "node server.js" pgrep -l nginx # avec le nom pkill -f "node server.js" # Rechercher et tuer
top top -o %MEM top -p 1234 # Afficher uniquement un certain processus
htop htop -u www-data
kill 1234 kill -9 1234 # Tuer si désobéissant kill -HUP 1234 # Laisser le service recharger la configuration kill -l # liste de signaux
| -15 / -TERM | Par défaut : demander une sortie normale |
| -9 / -KILL | Fin forcée sans laisser une chance de nettoyer |
| -1 / -HUP | Couramment utilisé pour surcharger la configuration |
| -2 / -INT | Égal à Ctrl+C |
| -STOP / -CONT | Pause/Reprise |
killall node killall -9 chrome
npm run build & jobs fg %1 # Ctrl+Z met en pause la tâche en cours au premier plan, puis bg pour la continuer en arrière-plan
nohup python server.py > server.log 2>&1 & écho $! # PID vient de démarrer
tmux new -s work # Ctrl+B puis d pour séparer tmux ls tmux attach -t work tmux kill-session -t work
systemctl status nginx systemctl status --failed # Service en échec
sudo systemctl restart nginx sudo systemctl reload nginx # Recharger la configuration sans interrompre la connexion
sudo systemctl enable --now docker sudo systemctl disable apache2 systemctl is-enabled nginx
systemctl list-units --type=service --state=running systemctl list-unit-files | grep enabled
journalctl -u nginx -f journalctl -u app -n 200 --no-pager journalctl --since "1 hour ago" journalctl -p err -b # Erreurs depuis ce démarrage sudo journalctl --vacuum-size=500M # Nettoyer
| -u <unité> | un service |
| -f | suivre |
| -n N | N dernières lignes |
| --since / --until | plage horaire |
| -p err | Filtrer par niveau |
| -b | Cette startup |
| -k | Messages du noyau |
crontab -e # Sauvegarde tous les jours à 15h30 30 3 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1 # toutes les 5 minutes */5 * * * * /usr/bin/curl -s https://example.com/ping crontab -l # Vue
echo "systemctl restart app" | at 03:00 atq #queue atrm 3 # supprimer
watch -n 2 "df -h" watch -d free -m # -d mettre en évidence les changements
time ./build.sh time curl -s https://example.com > /dev/null
timeout 10 ping example.com timeout -s KILL 30 ./stuck.sh
lsof -p 1234 lsof +D /var/log # Qui utilise les fichiers de ce répertoire ? lsof | grep delete # Fichiers supprimés mais occupés (le disque n'est pas libéré)
strace -p 1234 strace -f -e trace=network node app.js strace -c ./cmd # Statistiques
nice -n 19 tar czf big.tgz data/ renice -n 10 -p 1234
ss -tulnp ss -tlnp | grep :80 ss -s # statistiques de connexion ss -tan state established
| -t / -u | TCP / UDP |
| -l | Surveiller uniquement |
| -n | Le port numérique ne résout pas le nom du service |
| -p | Afficher les processus (nécessite root pour tout voir) |
| -a | Connectez tout |
netstat -tulnp | grep 3000 netstat -an | grep ESTABLISHED | wc -l
lsof -i :8080 lsof -i tcp -sTCP:LISTEN kill -9 $(lsof -t -i :3000) # Tuer l'occupant directement
ip addr ip -4 -br addr # rationaliser nom d'hôte -I # IP uniquement
ip route ip route get 8.8.8.8 # Par quel chemin se rendre à une certaine adresse ?
ping -c 4 example.com ping -i 0.2 -c 20 10.0.0.1
traceroute example.com mtr -rw example.com
curl -I https://example.com # Lire uniquement les en-têtes de réponse
curl -sS https://api.example.com/x | jq. # Silencieux mais signalant une erreur
curl -o file.zip -L https://…/file.zip # Téléchargez et suivez les redirections
curl -X POST -H "Content-Type: application/json" -d '{"a":1}' https://api.example.com/items
curl -u user:pass https://…
curl -w "%{http_code} %{time_total}\n" -o /dev/null -s https://example.com| -I | En-tête de requête uniquement (HEAD) |
| -L | suivre la redirection |
| -o fichier / -O | Enregistrer dans un fichier/en utilisant un nom de fichier distant |
| Méthode -X | Méthode de demande |
| -H "en-tête : valeur" | En-tête de requête |
| -d données | Corps de la requête (POST par défaut) |
| -s / -S | Silencieux/Silencieux avec erreurs |
| -v | Afficher l'interaction complète |
| -k | Ignorer les erreurs de certificat (pour le débogage) |
| -wformat | Code d'état de sortie, consommation de temps, etc. |
wget https://example.com/file.tar.gz wget -c https://…/big.iso # Continuer le téléchargement wget -qO- https://exemple.com | head # Sortie à l'écran wget -r -np -nH --cut-dirs=1 https://example.com/docs/
dig example.com dig +short example.com dig MX example.com creuser @8.8.8.8 exemple.com # Spécifier DNS dig -x 93.184.216.34 # Vérification inversée
nslookup example.com nslookup -type=txt example.com
host example.com
sudo nano /etc/hosts 127.0.0.1 dev.example.com
nc -zv example.com 443 nc -l 8080 # Moniteur 8080 écho "salut" | nc host 8080 # Envoyer des données
telnet smtp.example.com 25
sudo ufw status sudo ufw allow 22 sudo ufw allow 80/tcp sudo ufw allow from 10.0.0.0/8 to any port 5432 sudo ufw enable
Assurez-vous de libérer 22 avant de l'ouvrir, sinon SSH sera verrouillé de lui-même.
sudo firewall-cmd --list-all sudo firewall-cmd --add-port=8080/tcp --permanent sudo firewall-cmd --reload
sudo iptables -L -n -v --line-numbers sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
sudo tcpdump -i eth0 port 80 -nn sudo tcpdump -i any host 10.0.0.5 -w cap.pcap # Enregistrez le fichier sur Wireshark
sudo iftop -i eth0 nload
ip neigh arp -a
tar -czvf site.tar.gz site/ tar -czf logs.tgz --exclude="*.tmp" logs/ tar -cJvf site.tar.xz site/ # xz compresse plus petit et plus lentement
| -c | créer |
| -x | Délier |
| -t | contenu de la liste |
| -z / -j / -J | gzip / bzip2 / xz |
| -v | afficher le fichier |
| -f fichier | Nom du fichier d'archive (doit suivre le nom du fichier) |
| -C répertoire | Basculez vers le répertoire puis exécutez |
| --exclude=PAT | exclure |
tar -xzvf site.tar.gz tar -xzvf site.tar.gz -C /var/www/ tar -xf any.tar.* # La nouvelle version de tar reconnaît automatiquement le format de compression tar -tzvf site.tar.gz # Voyons d'abord ce qu'il y a à l'intérieur
gzip big.log # obtenir big.log.gz gzip -k big.log # Conserver le fichier original gunzip big.log.gz zcat big.log.gz | grep ERROR # Afficher directement sans décompresser
zip -r project.zip project/ -x "*/node_modules/*" zip -e secret.zip fichier.txt # Chiffrement
unzip archive.zip unzip archive.zip -d out/ unzip -l archive.zip # afficher uniquement la liste unzip -O gbk cn.zip # Lorsque les noms de fichiers chinois Windows sont tronqués
7z x archive.7z 7z a -mx9 out.7z dir/ 7z x file.rar
xz -9 big.sql xz -d big.sql.xz bzip2 -k file
split -b 100M big.iso part_ cat part_* > big.iso
sha256sum ubuntu.iso sha256sum -c SHA256SUMS md5sum file.zip
sudo dd if=ubuntu.iso of=/dev/sdX bs=4M status=progress && sync dd if=/dev/zero of=test.bin bs=1M count=100 # Fichier de test de 100 Mo
of= Si vous écrivez sur le mauvais périphérique, le disque sera directement effacé. Veuillez confirmer avec lsblk trois fois avant de l'exécuter.
uname -a uname -m # x86_64 / aarch64 cat /etc/os-release # Version finale
hostnamectl sudo hostnamectl set-hostname web-01
uptime # Load > Nombre de cœurs de processeur (nproc) indique la mise en file d'attente
free -h free -m -s 2 # Actualiser toutes les 2 secondes
nproc lscpu | grep -E "Model name|^CPU\(s\)"
lsblk lsblk -f # Avec système de fichiers et UUID sudo fdisk -l
sudo mount /dev/sdb1 /mnt/usb sudo umount /mnt/usb monter | colonne -t # Monté cat /etc/fstab # Monter automatiquement au démarrage
vmstat 1 10
iostat -x 1 5
sudo dmesg -T | tail -50 sudo dmesg -T | grep -i "processus tué" # Qui a été OOMé ?
env | sort printenv HOME echo $PATH | tr ":" "\n"
export JAVA_HOME=/usr/lib/jvm/java-17 export PATH="$HOME/.local/bin:$PATH" echo 'export EDITOR=vim' >> ~/.bashrc && source ~/.bashrc
alias ll="ls -alF" alias gs="git status" unalias ll liste d'alias #
history | grep ssh !105 sudo !! historique -c # Effacer
sudo apt update && sudo apt upgrade sudo apt install htop apt search nginx apt show nginx sudo apt remove --purge pkg && sudo apt autoremove
| update | Actualiser l'index des sources du logiciel |
| upgrade | Mettre à niveau le package installé |
| install / remove | Installer/désinstaller |
| search / show | Recherche / Détails |
| autoremove | Nettoyer les dépendances qui ne sont plus nécessaires |
| list --installed | Liste installée |
sudo dnf install -y git sudo dnf update dnf search nginx sudo yum install epel-release # Ancien système
sudo pacman -Syu sudo pacman -S neovim pacman -Ss keyword sudo pacman -Rns pkg
brew install jq brew upgrade brew list brew search ripgrep
sudo snap install code --classic snap list
sudo dpkg -i app.deb sudo apt -f install dpkg -l | grep nginx dpkg -L nginx #Quels fichiers sont empaquetés ?
sudo shutdown -h now sudo reboot sudo shutdown -r +10 "Redémarrer la maintenance après 10 minutes" sudo shutdown -c # Annuler
date date "+%Y-%m-%d %H:%M:%S" date -d "yesterday" +%F date +%s # horodatage date -d @1700000000 # Convertir l'horodatage en date
timedatectl sudo timedatectl set-timezone Asia/Shanghai timedatectl list-timezones | grep Asia
cal cal 2026 cal -3 # un mois avant et après
lsmod | grep nvidia sudo modprobe br_netfilter
lspci | grep -i vga lsusb
ulimit -n ulimit -n 65535 # Session en cours cat /proc/sys/fs/file-max
chsh -s $(which zsh) echo $SHELL
source ~/.bashrc . ~/.zshrc # Synonyme
#!/usr/bin/env bash set -euo pipefail # Arrêt sur erreur, erreur de variable non définie, transmission d'erreur de tuyau for f in *.log; do echo "processus $f" done
man tar man 5 crontab # Section 5 : Format de fichier tar --help | less tldr tar # Version exemple de la communauté (installation requise)
Un petit système de fichiers et un interpréteur Shell en mémoire : plus de 60 commandes prises en charge, dont ls / cd / cat / grep / sed / awk / find / chmod / tar, avec des pipes, des redirections et des jokers ; 8 niveaux, de « créer une arborescence » à « statistiques via un pipe ». Aucune connexion réseau, aucun accès à vos vrais fichiers. Pour les commandes Git, l’entraînement se trouve dansAide-mémoire des commandes Git.