- -P
- afficher le chemin physique, liens symboliques résolus
- -L
- afficher le chemin logique, liens symboliques conservés (par défaut)
pwdoù suis-je ?
pwd -Pchemin réel quand vous êtes arrivé via un lien symbolique
Les commandes Linux par tâche, des fichiers et permissions au réseau, à systemd et au traitement de texte. Chaque entrée comporte options, exemples à copier et remarques pour macOS.
Dernière vérification : 2026-10-18 selon les manuels de GNU coreutils 9.x, util-linux, procps-ng, iproute2, systemd et bash 5.2 ; notes macOS d’après les pages man de macOS 26.
Lire des fichiers, parcourir des journaux, éditer dans le terminal et comparer des versions.
cat /etc/os-releaseafficher un fichier
cat part1.txt part2.txt > whole.txtconcaténer
cat -A script.sh | headrepérer les tabulations cachées et les fins de ligne Windows ^M
macOS/BSD : Le cat de macOS n’a pas -A ; utilisez cat -vet pour le même affichage.
tac access.log | headles lignes de journal les plus récentes d’abord
macOS/BSD : Absent de macOS ; utilisez tail -r fichier.
less /var/log/sysloglire un journal
journalctl -u nginx | less -Slignes larges sans retour à la ligne
head -n 20 data.csven-tête et premières lignes
head -c 512 file.bin | xxdjeter un œil au début d’un binaire
macOS/BSD : Le head de macOS n’accepte pas les nombres négatifs.
tail -n 50 app.log50 dernières lignes
tail -F /var/log/nginx/access.logsurveiller un journal soumis à rotation
tail -n +2 data.csvignorer la ligne d’en-tête d’un CSV
sudo nano /etc/hostsmodifier un fichier système
La barre de raccourcis en bas de l’écran indique les touches ; ^ signifie Ctrl et M- signifie Alt.
vim +42 app.pyouvrir à la ligne 42
diff -u old.conf new.confvue lisible des modifications
diff -rq dir1/ dir2/quels fichiers diffèrent entre deux arborescences
diff <(sort a.txt) <(sort b.txt)comparer après tri, via une substitution de processus
make 2>&1 | tee build.logsuivre une compilation et en garder un journal
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.confajouter à un fichier appartenant à root (sudo echo >> échoue, car c’est le shell qui fait la redirection)
printf '%s\n' "$var"afficher une variable sans risque, même si elle commence par -n
printf '%-12s %6.2f\n' disk 93.5colonnes alignées
echo -e et echo -n se comportent différemment selon les shells ; printf se comporte partout de la même façon.
column -t -s, data.csv | less -Slire un CSV simple sous forme de tableau
mount | column -taligner une sortie séparée par des espaces
xxd image.png | headhexadécimal et ASCII côte à côte
hexdump -C file.bin | headdump hexadécimal canonique
xxd fait partie des paquets de vim ; hexdump est dans util-linux (bsdextrautils sur les Debian/Ubuntu récents).
strings -n 8 firmware.bin | lesstrouver des numéros de version, des URL, des chemins
Fait partie de binutils sous Linux.
Lire et modifier qui peut lire, écrire et exécuter un fichier.
ls -l deploy.sh-rwxr-x--- 1 alice devs 812 Oct 18 09:12 deploy.sh
Le premier caractère est le type (- fichier, d répertoire, l lien symbolique). Viennent ensuite trois triplets : propriétaire, groupe, tous les autres. r=4, w=2, x=1, donc rwxr-x--- vaut 750.
chmod 644 index.htmllecture/écriture pour le propriétaire, lecture pour tous : fichiers ordinaires
chmod 755 deploy.shtout pour le propriétaire, lecture/exécution pour les autres : scripts et répertoires
chmod 600 ~/.ssh/id_ed25519clé privée lisible par vous seul ; ssh refuse les clés aux permissions plus larges
chmod +x script.shrendre un script exécutable
chmod go-w fileretirer l’écriture au groupe et aux autres
chmod -R u=rwX,go=rX site/le X majuscule n’ajoute l’exécution qu’aux répertoires et aux fichiers qui l’avaient déjà
Construire les modes symbolique et octal avec le calculateur chmod →
find site/ -type d -exec chmod 755 {} +la bonne solution, partie 1 : répertoires en 755
find site/ -type f -exec chmod 644 {} +partie 2 : fichiers en 644
Attention : Donne à tous les utilisateurs et à tout service compromis de la machine un accès en écriture à toute l’arborescence, rend tous les fichiers exécutables et fait refuser à OpenSSH les clés situées dans un ~/.ssh en 777. Appliqué à /etc ou /usr, il peut casser sudo et le système. Corrigez plutôt la propriété avec chown, ou utilisez les deux commandes find.
sudo chown -R www-data:www-data /var/www/siteconfier une racine web à l’utilisateur du serveur web
sudo chown "$USER": file.txtrécupérer la propriété d’un fichier créé par root
Attention : sudo chown -R sur /, /usr ou /etc efface les bits setuid et les propriétés dont dépendent sudo, passwd et les services ; la récupération passe généralement par une réinstallation. Vérifiez bien le chemin.
chgrp -R developers /srv/sharedconfier un dossier partagé au groupe d’une équipe
umaskafficher le masque actuel, souvent 0022
umask 077nouveaux fichiers en 600 et répertoires en 700 dans ce shell
Le masque retire des bits : les fichiers partent de 666 et les répertoires de 777, donc 022 donne 644 et 755.
sudo systemctl restart nginxune commande d’administration
sudo !!relancer la commande précédente avec sudo
sudo -u postgres psqlexécuter en tant qu’utilisateur de service
su - deployse connecter en tant que deploy avec son environnement
sudo su -shell root quand root n’a pas de mot de passe (sudo -i fait de même)
setfacl -m u:alice:rw report.xlsxalice peut lire et écrire, sans changer le groupe
getfacl report.xlsxafficher toutes les entrées
setfacl -R -m g:devs:rwX /srv/appun groupe obtient l’accès à toute une arborescence
Un + à la fin de la chaîne de permissions de ls -l indique que le fichier a une ACL.
sudo chattr +i /etc/resolv.confpersonne, pas même root, ne peut le modifier ou le supprimer avant -i
lsattr /etc/resolv.confafficher les attributs ; i signifie immuable
Pris en charge sur ext4, XFS, Btrfs. Si « Operation not permitted » s’affiche même en root, vérifiez lsattr.
Trouver ce qui tourne, l’arrêter et lancer des choses en arrière-plan.
ps aux | grep [n]ginxl’astuce [n] exclut grep lui-même des résultats
ps aux --sort=-%mem | headles plus gros consommateurs de mémoire
ps -o pid,ppid,etime,cmd -p 1234depuis combien de temps un processus tourne
macOS/BSD : Le ps de macOS n’a pas --sort ; utilisez ps aux -m (par mémoire) ou ps aux -r (par CPU).
pstree -pavec les PID
pstree -p 1234ce qu’un processus a lancé
top -b -n 1 | head -20instantané à coller dans un ticket
macOS/BSD : Le top de macOS est un autre programme : triez avec top -o cpu ou top -o mem.
htop -u www-datauniquement les processus d’un utilisateur
À installer avec apt install htop / dnf install htop.
pgrep -a nginxPID et lignes de commande
pgrep -f 'python manage.py runserver'trouver un script par ses arguments
macOS/BSD : Sous macOS, -a signifie « inclure les ancêtres » ; utilisez pgrep -lf pour voir les noms et les arguments.
pkill -f "node server.js"arrêter une application Node
pkill -HUP nginxenvoyer un signal de rechargement
pgrep -af nodevoir ce que -f ciblerait avant de tuer
Les motifs sont des expressions régulières recherchées n’importe où dans le nom ; pkill node touche aussi nodejs-helper. Vérifiez d’abord avec pgrep.
kill 1234arrêt poli
kill -9 1234dernier recours quand TERM est ignoré
kill %1tuer la tâche 1 de ce shell
Essayez d’abord un simple kill et laissez quelques secondes : -9 saute le nettoyage, ce qui peut laisser des fichiers temporaires, des verrous et des données à moitié écrites.
killall firefoxtous les processus Firefox
Sous Linux, se trouve dans le paquet psmisc.
jobslister les tâches de ce shell avec leur numéro
bg %1reprendre la tâche 1 en arrière-plan
fg %1la ramener au premier plan
Ctrl+Z suspend le programme au premier plan (il s’arrête jusqu’à bg ou fg).
./long-export.sh > export.log 2>&1 &la lancer et récupérer l’invite
waitdans un script, attendre la fin des tâches en arrière-plan
nohup ./server > server.log 2>&1 &survit à la fermeture de la session SSH
Pour tout ce qui doit durer, un service systemd (voir Services et journaux) ou tmux est plus robuste.
disown -h %1vous avez oublié nohup : passez-la en arrière-plan avec bg, puis détachez-la avec disown
tmux new -s deploydémarrer une session nommée
tmux attach -t deployse reconnecter après une coupure SSH
À installer avec votre gestionnaire de paquets. GNU screen est l’alternative plus ancienne (Ctrl+A d pour se détacher, screen -r pour se rattacher).
nice -n 19 tar -czf backup.tgz /datasauvegarde qui ménage les autres processus
sudo renice -n -5 -p 1234augmenter la priorité d’un processus en cours
La valeur nice va de -20 (priorité la plus haute) à 19 (la plus basse). Seul root peut descendre sous 0.
timeout 30s curl -s https://example.com/healthabandonner au bout de 30 secondes
timeout -s KILL 5m ./job.sharrêt forcé au bout de cinq minutes
Se termine avec le code 124 si la limite de temps est atteinte.
watch -n 2 df -hregarder l’espace disque se remplir
watch -d 'ss -s'-d met en évidence ce qui a changé
sudo lsof -i :8080ce qui écoute sur le port 8080
sudo lsof +L1fichiers supprimés encore ouverts (disque plein mais du n’affiche rien)
lsof -p 1234tous les fichiers ouverts par un processus
sudo fuser -vm /mnt/usbpourquoi umount affiche « target is busy »
sudo fuser -v 8080/tcpprocessus sur un port TCP
Attention : fuser -k tue sans confirmation tous les processus qui utilisent la cible ; sur un point de montage, cela peut inclure votre propre shell.
time ./build.shreal = temps réel écoulé, user + sys = temps CPU
strace -f -e trace=openat ./app 2>&1 | grep -v ENOENTquels fichiers ouvre-t-il réellement ?
sudo strace -p 1234sur quoi un processus figé est-il bloqué ?
Version de l’OS, noyau, CPU, mémoire, matériel, heure et charge.
uname -rex. 6.8.0-45-generic
uname -mquel binaire télécharger : x86_64 ou aarch64
cat /etc/os-releaseNAME, VERSION_ID, ID pour toutes les distributions de l’ère systemd
lsb_release -aalternative Debian/Ubuntu, si installée
macOS/BSD : macOS : sw_vers.
hostnamectlnom d’hôte, OS, noyau, virtualisation
sudo hostnamectl set-hostname web01renommer la machine
uptimecharge moyenne sur 1, 5 et 15 minutes
La charge est le nombre de processus en cours d’exécution ou en attente. Comparez-la au nombre de CPU (nproc) : une charge de 4 sur 4 cœurs signifie une machine pleinement occupée.
free -hregardez la colonne « available », pas « free »
macOS/BSD : macOS : vm_stat, ou top -l 1 | grep PhysMem.
Linux utilise la RAM libre comme cache disque : « free » paraît donc faible sur une machine en bonne santé. « available » correspond à ce que les programmes peuvent encore obtenir.
lscpumodèle, sockets, cœurs, threads, flags
make -j"$(nproc)"utiliser tous les cœurs disponibles
macOS/BSD : macOS : sysctl -n hw.ncpu et sysctl -n machdep.cpu.brand_string.
lspci -k | grep -A3 -i vgacarte graphique et pilote utilisé
lsusble périphérique USB est-il seulement détecté ?
sudo dmidecode -t memory | grep -i sizeRAM installée par emplacement
sudo lshw -shortune ligne par périphérique
sudo dmesg -T | tail -30ce qui vient de se passer (clé USB branchée, erreurs disque)
sudo dmesg -T | grep -i 'out of memory'l’OOM killer a-t-il arrêté votre application ?
grep MemAvailable /proc/meminfomémoire disponible en ko
grep -c ^processor /proc/cpuinfonombre de CPU logiques
cat /proc/1234/statusétat et mémoire d’un processus
vmstat 1 5r = file d’exécution, si/so = swap, wa = attente d’E/S
iostat -xz 1utilisation par disque (%util) et latence (await)
iostat fait partie du paquet sysstat.
date '+%Y-%m-%d %H:%M:%S'horodatage pour les journaux
date +%ssecondes depuis le 1970-01-01 UTC
date -d @1700000000timestamp vers date (GNU)
date -d '2 days ago' +%Fdate relative (GNU)
macOS/BSD : Le date de macOS n’a pas -d. Utilisez date -r 1700000000 pour un timestamp, date -v-2d pour « il y a 2 jours » et date -j -f '%Y-%m-%d' 2026-10-18 +%s pour analyser une date.
Convertir des timestamps avec le convertisseur de timestamp Unix →
timedatectlheure locale, UTC, fuseau horaire, NTP synchronisé ?
timedatectl list-timezones | grep Americatrouver le nom du fuseau
sudo timedatectl set-timezone America/Torontole modifier
Espace libre, ce qui l’occupe, partitions, montage et formatage.
df -htous les systèmes de fichiers montés
df -h .le système de fichiers de ce répertoire
df -i« No space left » alors qu’il reste des octets ? Vous manquez peut-être d’inodes
macOS/BSD : Sous macOS, -T filtre par type au lieu de l’afficher.
du -sh /var/logtaille d’un dossier
du -h -d 1 | sort -hsous-dossiers, les plus gros en dernier (fonctionne sous GNU et macOS)
sudo du -xh -d 1 / | sort -h | tailles plus gros répertoires de premier niveau
macOS/BSD : Le du de macOS a -d mais pas --max-depth.
sudo ncdu -x /naviguer avec les flèches, d pour supprimer
À installer avec apt install ncdu / dnf install ncdu.
lsblkdisques, partitions, tailles, points de montage
lsblk -fquelle partition est en ext4/xfs, et son UUID
macOS/BSD : macOS : diskutil list.
sudo blkid /dev/sdb1UUID et TYPE, pour /etc/fstab
findmntarborescence des montages avec leurs options
findmnt -T /var/lib/dockerquel système de fichiers contient ce chemin
sudo findmnt --verifyvérifier /etc/fstab avant de redémarrer
sudo mount /dev/sdb1 /mnt/usbmonter une clé USB (le répertoire doit exister)
sudo mount -o remount,rw /rendre accessible en écriture une racine en lecture seule
sudo mount -t nfs nas:/export /mnt/nasmonter un partage NFS
sudo umount /mnt/usbvous pouvez débrancher sans risque ensuite
sudo umount -l /mnt/nasdifféré : détacher maintenant, nettoyer quand ce n’est plus utilisé
« target is busy » signifie qu’un processus l’utilise (souvent votre propre shell placé dans ce répertoire) : trouvez-le avec fuser -vm ou lsof.
UUID=3f6c... /data ext4 defaults,nofail 0 2une ligne par système de fichiers ; nofail permet de poursuivre le démarrage si le disque est absent
sudo mount -amonter tout le contenu de fstab maintenant : testez avant de redémarrer
Une faute de frappe dans fstab peut faire démarrer la machine en mode d’urgence. Lancez toujours sudo mount -a (ou findmnt --verify) après modification.
sudo fdisk -ltous les disques et leurs partitions
sudo parted /dev/sdb printtype de table de partitions (gpt/msdos) et organisation
Attention : Écrire une table de partitions (w dans fdisk, mklabel dans parted) rend inaccessibles les données existantes du disque. Vérifiez d’abord le nom du périphérique avec lsblk ; /dev/sda et /dev/sdb s’intervertissent facilement.
sudo mkfs.ext4 -L data /dev/sdb1ext4 avec une étiquette
sudo mkfs.vfat -F 32 /dev/sdc1FAT32 pour une clé USB lisible par d’autres appareils
Attention : Efface immédiatement le système de fichiers de la cible, sans confirmation si le périphérique n’est pas monté. Vérifiez le périphérique avec lsblk -f ; formater /dev/sda au lieu de /dev/sda1, ou le mauvais disque, le détruit.
sudo fsck -f /dev/sdb1forcer une vérification complète d’une partition démontée
Attention : Ne lancez jamais fsck sur un système de fichiers monté en lecture-écriture : vous risquez de le corrompre. Démontez-le d’abord ou, pour le système de fichiers racine, démarrez sur un support de secours.
sudo dd if=ubuntu.iso of=/dev/sdX bs=4M status=progress conv=fsynccréer une clé USB amorçable (remplacez sdX par le disque entier, pas une partition)
dd if=/dev/zero of=test.img bs=1M count=100créer un fichier de 100 Mo
Attention : dd écrase la cible of= sans demander. Inverser if= et of=, ou choisir le mauvais /dev/sdX, efface ce disque. Vérifiez avec lsblk juste avant de lancer la commande.
macOS/BSD : macOS : ciblez /dev/rdiskN (d’après diskutil list) après diskutil unmountDisk, utilisez bs=4m et appuyez sur Ctrl+T pour voir la progression.
sync && sudo umount /mnt/usbavant de retirer une clé USB
swapon --showswap actuel
sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfileajouter un fichier d’échange de 2 Go (ajoutez-le à /etc/fstab pour le conserver)
Sous Btrfs, un fichier d’échange demande des étapes supplémentaires (btrfs filesystem mkswapfile avec les btrfs-progs récents).
shred -u -n 3 secrets.txtécraser trois fois, puis supprimer
Attention : Irréversible. Notez aussi que ce n’est pas fiable sur les SSD, les systèmes de fichiers journalisés ou copy-on-write (Btrfs, ZFS) ni avec des instantanés ; pour une vraie protection, utilisez le chiffrement complet du disque.
Adresses IP, routes, ports ouverts, requêtes HTTP, DNS, SSH et transfert de fichiers.
ip -br aune ligne par interface : nom, état, adresses
ip a show eth0une interface en détail
hostname -Iuniquement les adresses IP
macOS/BSD : macOS : ifconfig, ou ipconfig getifaddr en0.
ip remplace l’ancien ifconfig (net-tools), que beaucoup de distributions n’installent plus.
Calculer la plage réseau avec le calculateur de sous-réseau →
ip rroutes ; « default via » est la passerelle
ip route get 1.1.1.1quelle interface et quelle passerelle une destination utilise
sudo ip route add 10.20.0.0/16 via 192.168.1.1ajouter une route (perdue au redémarrage)
Vérifier des plages CIDR avec le calculateur de sous-réseau →
ip linkinterfaces et adresses MAC
sudo ip link set eth0 down && sudo ip link set eth0 upredémarrer une interface
Attention : Désactiver l’interface par laquelle vous êtes connecté en SSH coupe votre session.
sudo ss -tulpntous les ports en écoute et leur programme
ss -tn state established '( dport = :443 )'connexions établies vers le port 443
ss -stotaux des connexions
macOS/BSD : macOS : lsof -iTCP -sTCP:LISTEN -n -P, ou netstat -an.
ss remplace netstat ; netstat -tulpn fonctionne encore là où net-tools est installé.
curl -I https://example.comligne de statut et en-têtes
curl -LO https://example.com/file.tar.gztélécharger en suivant les redirections
curl -s -o /dev/null -w '%{http_code}\n' https://example.comuniquement le code de statut
curl -fsSL https://example.com/install.sh -o install.shtélécharger un script pour le lire avant de l’exécuter
curl -H 'Content-Type: application/json' -d '{"name":"Ada"}' https://api.example.com/usersPOST de JSON
curl -H "Authorization: Bearer $TOKEN" https://api.example.com/meguillemets doubles pour que $TOKEN soit développé
curl -X DELETE https://api.example.com/users/42autres méthodes
wget -c https://example.com/big.isoreprendre après une coupure de connexion
wget -qO- https://example.com/data.json | jq .envoyer directement dans une autre commande
macOS/BSD : Absent de macOS par défaut ; utilisez curl -LO (curl -C - -LO pour reprendre).
dig +short example.comuniquement les enregistrements A
dig MX example.comserveurs de messagerie
dig @1.1.1.1 example.cominterroger un résolveur précis (contourne le cache local)
dig -x 8.8.8.8résolution inverse
dig +trace example.comsuivre la délégation depuis la racine
Nom du paquet : dnsutils (Debian/Ubuntu) ou bind-utils (Fedora/RHEL).
host example.comA, AAAA et MX en une réponse courte
nslookup example.com 8.8.8.8la même commande existe sous Windows
resolvectl statusserveurs DNS par interface
sudo resolvectl flush-cachesvider le cache de systemd-resolved
macOS/BSD : macOS : sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder.
Uniquement sur les systèmes utilisant systemd-resolved (Ubuntu, Fedora par défaut).
ping -c 4 example.comquatre paquets, puis un récapitulatif
Sous Linux et macOS, ping tourne jusqu’à Ctrl+C sauf avec -c (Windows s’arrête après 4). L’absence de réponse ne signifie pas toujours que l’hôte est hors ligne : beaucoup bloquent l’ICMP.
traceroute -n example.comsauts sans résolution DNS
tracepath example.compas besoin de root, indique aussi le MTU
macOS/BSD : macOS a traceroute mais pas tracepath.
traceroute doit parfois être installé sous Linux ; tracepath (iputils) est généralement présent.
mtr -rw -c 100 example.comrapport après 100 sondes par saut
Combine ping et traceroute. Une perte sur un seul saut intermédiaire vient généralement d’un routeur qui dépriorise l’ICMP ; une perte qui se prolonge jusqu’au bout est réelle.
ssh alice@203.0.113.10se connecter
ssh -p 2222 alice@hostport non standard
ssh alice@host 'df -h'exécuter une commande et revenir
ssh -J bastion.example.com alice@10.0.0.5passer par un hôte bastion
ssh -N -L 5432:localhost:5432 alice@db-hostconnecter votre client de base de données local à un Postgres distant
ssh -N -D 1080 alice@hostnaviguer en passant par le serveur
ssh-keygen -t ed25519 -C "you@example.com"nouvelle paire de clés dans ~/.ssh
ssh-copy-id alice@hostajouter votre clé publique au fichier authorized_keys du serveur
ssh-keygen -R hostsupprimer une ancienne clé d’hôte après la réinstallation d’un serveur (« REMOTE HOST IDENTIFICATION HAS CHANGED »)
Host web
HostName 203.0.113.10
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519ensuite, simplement : ssh web (scp et rsync l’utilisent aussi)
scp report.pdf alice@host:/tmp/envoyer
scp alice@host:/var/log/app.log .récupérer
scp -r -P 2222 site/ alice@host:~/envoyer un dossier sur un autre port
Depuis OpenSSH 9.0, scp utilise le protocole SFTP en arrière-plan. Pour les copies volumineuses ou répétées, rsync est plus rapide car il n’envoie que les modifications.
rsync -avzP site/ deploy@host:/srv/site/la barre oblique finale de site/ copie son contenu, pas le dossier lui-même
rsync -av --exclude 'node_modules' ./ /backup/app/sauvegarde locale sans le superflu
macOS/BSD : Les macOS récents fournissent openrsync au lieu de rsync ; les options courantes fonctionnent, certaines plus rares non.
src/ signifie « le contenu de src » ; src sans barre oblique signifie « le dossier src ». Une erreur ici imbrique les dossiers (dest/src/…).
rsync -avn --delete site/ /srv/site/simulation d’abord : les lignes commençant par « deleting » montrent ce qui serait supprimé
rsync -av --delete site/ /srv/site/puis l’exécution réelle
Attention : Supprime dans dest tout ce qui n’est pas dans la source. Inverser source et destination, ou un chemin source vide ou erroné, efface la destination. Lancez toujours d’abord avec -n.
nc -zv db.internal 5432« succeeded » ou « Connection refused »/délai dépassé
nc -l 9000écouter sur un port pour tester un pare-feu depuis l’autre côté
Les options diffèrent selon les variantes de netcat : la version traditionnelle exige nc -l -p 9000.
sudo ufw status verboserègles et politique par défaut
sudo ufw allow 22/tcpautoriser SSH (avant enable)
sudo ufw allow from 10.0.0.0/8 to any port 5432un port, un réseau
Attention : sudo ufw enable sur un serveur distant sans avoir d’abord autorisé SSH (ufw allow OpenSSH ou 22/tcp) vous bloque l’accès.
sudo firewall-cmd --list-allzone active et règles
sudo firewall-cmd --permanent --add-service=https && sudo firewall-cmd --reloadouvrir HTTPS de façon permanente
sudo firewall-cmd --permanent --add-port=8080/tcpouvrir un port
Sans --permanent, une règle ne dure que jusqu’au prochain rechargement ou redémarrage.
nmcli device statusinterfaces et état de connexion
nmcli device wifi listréseaux à proximité
nmcli device wifi connect 'MyWiFi' password 'secret'se connecter à un réseau
La même tâche avec les quatre principaux gestionnaires de paquets : Debian/Ubuntu (apt), Fedora/RHEL (dnf), Arch (pacman), openSUSE (zypper). Préfixez avec sudo tout ce qui modifie le système.
| Tâche | apt (Debian, Ubuntu) | dnf (Fedora, RHEL) | pacman (Arch) | zypper (openSUSE) |
|---|---|---|---|---|
| Actualiser la liste des paquets # dnf actualise automatiquement les métadonnées périmées. Sous Arch, ne lancez jamais pacman -Sy suivi de -S paquet : les mises à jour partielles ne sont pas prises en charge ; utilisez -Syu. | apt update | dnf makecache | pacman -Sy | zypper refresh |
| Tout mettre à jour # openSUSE Tumbleweed utilise zypper dup. apt full-upgrade supprime aussi des paquets si nécessaire pour terminer la mise à jour. | apt update && apt upgrade | dnf upgrade | pacman -Syu | zypper update |
| Installer un paquet # | apt install nginx | dnf install nginx | pacman -S nginx | zypper install nginx |
| Installer un fichier de paquet téléchargé # Le ./ indique à apt qu’il s’agit d’un fichier et non d’un nom de paquet : les dépendances sont donc résolues (ce que dpkg -i ne fait pas). | apt install ./app.deb | dnf install ./app.rpm | pacman -U app.pkg.tar.zst | zypper install ./app.rpm |
| Supprimer un paquet # | apt remove nginx | dnf remove nginx | pacman -R nginx | zypper remove nginx |
| Supprimer avec les fichiers de configuration / dépendances inutilisées # | apt purge nginx && apt autoremove | dnf remove nginx && dnf autoremove | pacman -Rns nginx | zypper remove --clean-deps nginx |
| Rechercher un paquet # | apt search keyword | dnf search keyword | pacman -Ss keyword | zypper search keyword |
| Afficher les détails d’un paquet # | apt show nginx | dnf info nginx | pacman -Si nginx (installed: -Qi) | zypper info nginx |
| Lister les paquets installés # | apt list --installed | dnf list --installed | pacman -Q | zypper search --installed-only |
| Lister les mises à jour disponibles # | apt list --upgradable | dnf check-update | checkupdates (pacman-contrib) | zypper list-updates |
| Quel paquet possède un fichier # Pour les fichiers pas encore installés : dnf provides /chemin, apt-file search chemin (nécessite apt-file), pacman -F chemin. | dpkg -S /usr/bin/curl | rpm -qf /usr/bin/curl | pacman -Qo /usr/bin/curl | rpm -qf /usr/bin/curl |
| Lister les fichiers installés par un paquet # | dpkg -L nginx | rpm -ql nginx | pacman -Ql nginx | rpm -ql nginx |
| Bloquer un paquet à sa version actuelle # Sous DNF 4, versionlock nécessite le paquet du plugin versionlock. | apt-mark hold nginx | dnf versionlock add nginx | IgnorePkg = nginx in /etc/pacman.conf | zypper addlock nginx |
| Vider le cache des paquets # | apt clean | dnf clean all | pacman -Sc | zypper clean |
Qui vous êtes, qui est connecté, et gestion des comptes.
iduid, gid et tous vos groupes
id aliceun autre utilisateur
wqui est connecté et ce qu’il exécute
last -n 10connexions et redémarrages récents
sudo lastb -n 10tentatives de connexion échouées récentes (Linux)
sudo useradd -m -s /bin/bash alice && sudo passwd alicecréer et définir un mot de passe
Sous Debian/Ubuntu, adduser alice est la surcouche interactive plus conviviale qui crée le répertoire personnel et le mot de passe.
sudo usermod -aG docker alicepermettre à alice d’utiliser docker
sudo usermod -aG sudo aliceadministrateur sous Debian/Ubuntu (le groupe s’appelle wheel sous Fedora/RHEL/Arch)
Attention : Sans -a, usermod -G remplace tous les groupes supplémentaires de l’utilisateur, ce qui peut lui retirer l’accès à sudo. Les changements de groupe prennent effet à la prochaine connexion (ou lancez newgrp docker).
sudo userdel -r oldusersupprime aussi le répertoire personnel et la boîte mail locale
Attention : -r supprime définitivement le répertoire personnel et ses fichiers. Sauvegardez-le d’abord, ou verrouillez plutôt le compte (passwd -l).
passwdchanger le vôtre
sudo passwd aliceréinitialiser celui d’un autre
sudo passwd -l aliceverrouiller la connexion par mot de passe (les clés SSH peuvent encore fonctionner)
sudo groupadd developersnouveau groupe
sudo gpasswd -d alice developersen retirer alice
groups aliceles groupes d’alice
getent group sudomembres de sudo (fonctionne aussi avec LDAP)
getent passwd aliceentrée du compte : UID, répertoire personnel, shell
sudo visudo -f /etc/sudoers.d/deployun fichier distinct par règle
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myappune commande sans mot de passe
visudo vérifie la syntaxe avant d’enregistrer. Modifier /etc/sudoers avec un éditeur ordinaire et faire une faute de frappe peut priver tout le monde de sudo.
sudo chage -l alicedates du dernier changement et d’expiration
sudo chage -M 90 aliceexpiration tous les 90 jours
tar, gzip, xz, zip et sommes de contrôle.
tar -czf site-2026-10-18.tar.gz site/archive d’un dossier compressée en gzip
tar -cJf logs.tar.xz --exclude='*.tmp' logs/archive xz plus petite, sans les fichiers temporaires
tar -xf archive.tar.gzGNU tar et le tar de macOS détectent eux-mêmes la compression
tar -xzf app.tar.gz -C /opt/app --strip-components=1dans un dossier, sans le répertoire englobant
tar -tf backup.tar.gz | lessvoir le contenu sans extraire
tar -xf backup.tar.gz etc/nginx/nginx.confextraire un seul fichier (chemin tel qu’affiché par -t)
tar --zstd -cf data.tar.zst data/bien plus rapide que xz, avec un taux comparable à gzip -9 ou meilleur
zstd -d file.zstdécompresser un seul fichier
Nécessite GNU tar 1.31+ (ou un bsdtar récent) et le programme zstd.
gzip -k access.logcrée access.log.gz et conserve l’original
zcat access.log.gz | grep 404lire sans décompresser sur le disque
zgrep 500 access.log.*.gzchercher directement dans les journaux archivés
Sans -k, gzip remplace le fichier par sa version .gz.
xz -T0 -k big.sqltous les cœurs du CPU, original conservé
unxz big.sql.xzdécompresser
zip -r site.zip site/zipper un dossier
zip -r site.zip site/ -x '*.git*' '*/node_modules/*'exclure des chemins
zip -e chiffre avec l’ancien schéma ZipCrypto, qui est faible. Utilisez 7z ou gpg pour une vraie confidentialité.
unzip files.zip -d files/dans un dossier
unzip -l files.ziplister le contenu uniquement
unzip -o files.zipécraser sans demander
7z x archive.7zextraire avec les chemins complets
7z a -p backup.7z docs/archive chiffrée en AES-256 (demande un mot de passe)
7z l archive.rarlister le contenu de nombreux formats
Paquet : p7zip-full / 7zip sous Debian/Ubuntu, p7zip ou 7zip sous Fedora/Arch.
sha256sum ubuntu.isocomparer avec le hash de la page de téléchargement
sha256sum -c SHA256SUMS --ignore-missingvérifier tous les fichiers listés que vous avez réellement
macOS/BSD : macOS : shasum -a 256 fichier (et shasum -a 256 -c SUMSFILE).
Calculer le hash d’un texte ou d’un fichier dans le navigateur →
split -b 100M backup.tar.gz backup.part.backup.part.aa, .ab, …
cat backup.part.* > backup.tar.gzles rassembler
Trouver des fichiers par nom, ancienneté ou taille, et chercher du texte dans les fichiers.
find . -name '*.log'mettez le motif entre guillemets pour que le shell ne le développe pas avant
find / -iname 'nginx.conf' 2>/dev/nullchercher partout en masquant les erreurs de permission
find . -maxdepth 1 -type dsous-répertoires directs
find . -type l -xtype lliens symboliques cassés (GNU)
find . -type f -emptyfichiers vides
find /var/log -type f -mtime +30journaux de plus de 30 jours
find . -type f -mmin -15ce qui a changé au cours des 15 dernières minutes
sudo find / -xdev -type f -size +500M -exec ls -lh {} + 2>/dev/nullfichiers de plus de 500 Mo sur le système de fichiers racine
find . -name '*.sh' -exec chmod +x {} +{} + passe plusieurs fichiers par commande (rapide)
find . -name '*.py' -exec grep -l 'TODO' {} +quels fichiers Python contiennent TODO
find . -name '*.jpg' -print0 | xargs -0 -P4 -n 20 jpegoptimtraitement parallèle, sans problème avec les espaces dans les noms
find /tmp/app -name '*.tmp' -mtime +7 -printétape 1 : lister ce qui correspond
find /tmp/app -name '*.tmp' -mtime +7 -deleteétape 2 : la même commande avec -delete à la fin
Attention : L’ordre compte : -delete agit là où il apparaît, donc find . -delete -name "*.tmp" supprime tout sous . avant même que le test sur le nom ne soit appliqué. Placez -delete en dernier et lancez d’abord avec -print.
find /srv -type f -perm -o+wfichiers modifiables par tout le monde
sudo find / -xdev -perm -4000 -type f 2>/dev/nullprogrammes setuid
locate -i nginx.confbien plus rapide que find /
sudo updatedbactualiser l’index maintenant
Fourni par plocate ou mlocate ; l’index est reconstruit chaque jour, donc les fichiers créés aujourd’hui peuvent manquer tant que updatedb n’a pas tourné.
grep -n 'ERROR' app.loglignes correspondantes avec leur numéro
grep -v '^#' nginx.conf | grep -v '^$'configuration sans commentaires ni lignes vides
grep -c 'Failed password' /var/log/auth.logcompter les échecs de connexion SSH
grep -rn 'TODO' src/chaque TODO avec fichier et ligne
grep -rl --include='*.php' 'mysql_connect' .quels fichiers PHP utilisent encore une ancienne API
grep -rn --exclude-dir={.git,node_modules} 'apiKey' .ignorer les dossiers encombrants
grep -C 3 'Traceback' app.log3 lignes avant et après
grep -A 20 'Exception' app.logla trace de pile qui suit l’erreur
grep -E 'error|warn' app.logl’un ou l’autre mot (regex étendue)
grep -Eo '[0-9]{1,3}(\.[0-9]{1,3}){3}' access.log | sort | uniq -c | sort -rn | headadresses IP les plus fréquentes d’un journal
grep -P '\d{4}-\d{2}-\d{2}' file\d façon Perl (GNU grep)
macOS/BSD : -E fonctionne partout ; -P (PCRE) est une fonctionnalité GNU qui n’est pas disponible dans toutes les versions de macOS.
type llindique s’il s’agit d’un alias, d’une fonction, d’une commande interne ou d’un fichier
command -v docker >/dev/null || echo "docker missing"vérification portable dans les scripts
which -a python3tous les python3 du PATH, dans l’ordre
Découper, filtrer, trier, compter, transformer et remanier du texte et du JSON.
sed 's/http:/https:/g' links.txtafficher le résultat ; le fichier reste inchangé
sed 's|/usr/local|/opt|g' paths.txtn’importe quel délimiteur, pratique pour les chemins
sed -E 's/([0-9]+)px/\1rem/g' style.cssréutiliser un groupe capturé
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_configGNU sed
sed -i.bak 's/foo/bar/g' config.iniconserve config.ini.bak ; fonctionne sous GNU et macOS
macOS/BSD : Le sed de macOS exige un argument après -i : sed -i '' 's/foo/bar/g' file. GNU sed lit '' comme le script : la seule forme qui fonctionne sur les deux est -i.bak.
sed -n '100,120p' big.loglignes 100 à 120
sed '/^\s*#/d; /^$/d' app.confretirer les commentaires et les lignes vides (\s de GNU)
sed -n '/BEGIN CERT/,/END CERT/p' bundle.pemtout ce qui se trouve entre deux marqueurs
awk '{print $1}' access.logpremière colonne (IP du client)
awk -F: '{print $1, $7}' /etc/passwdutilisateur et shell
awk -F, 'NR>1 {print $2}' data.csvdeuxième colonne d’un CSV, sans l’en-tête (CSV simple uniquement : pas de virgules entre guillemets)
awk '$9 >= 500' access.loglignes dont le champ 9 (statut) est 5xx
awk '{s += $2} END {print s}' sales.txtsomme de la colonne 2
awk '{c[$1]++} END {for (k in c) print c[k], k}' access.log | sort -rn | headnombre d’occurrences par valeur, top 10
cut -d, -f1,3 data.csvcolonnes 1 et 3
cut -d: -f1 /etc/passwdtous les noms d’utilisateur
cut -c1-10 file10 premiers caractères de chaque ligne
cut considère chaque délimiteur comme une séparation de champ : deux espaces donnent un champ vide. Pour une sortie alignée par des espaces, utilisez awk.
du -sh * | sort -hdossiers par taille
sort -t, -k3,3nr data.csvCSV par colonne 3, numérique, décroissant
sort -u emails.txt > unique.txttrié et dédoublonné
sort ips.txt | uniq -c | sort -rn | headles 10 lignes les plus fréquentes
uniq ne fusionne que les doublons adjacents : triez d’abord.
wc -l access.lognombre de lignes
ls | wc -lnombre d’entrées dans ce dossier
grep -c '' filenombre de lignes incluant une dernière ligne sans retour à la ligne
tr 'a-z' 'A-Z' < in.txtmajuscules
tr -d '\r' < windows.txt > unix.txtsupprimer les fins de ligne CRLF de Windows
tr -s ' ' < fileréduire les espaces répétées
tr '\n' ',' < list.txtjoindre les lignes avec des virgules
tr ne lit que l’entrée standard : redirigez le fichier avec <.
find . -name '*.log' -print0 | xargs -0 rm -fsupprimer sans risque les fichiers trouvés
cat urls.txt | xargs -n 1 -P 4 curl -sOtélécharger 4 à la fois
ls *.png | xargs -I {} cp {} /backup/{}une commande par élément
macOS/BSD : GNU xargs exécute la commande une fois même si l’entrée est vide, sauf avec -r ; le xargs de macOS ignore par défaut une entrée vide et accepte -r pour la compatibilité.
jq . response.jsonaffichage indenté
jq -r '.items[].name' data.jsonun nom par ligne
jq -r '.[] | select(.active) | .email' users.jsonfiltrer, puis extraire un champ
curl -s https://api.github.com/repos/jqlang/jq | jq '.stargazers_count'directement depuis une API
À installer avec apt/dnf install jq. Fourni avec les macOS récents.
paste -sd, ids.txttoutes les lignes jointes par des virgules
paste names.txt emails.txtdeux fichiers en deux colonnes
comm -12 <(sort a.txt) <(sort b.txt)dans les deux
comm -23 <(sort a.txt) <(sort b.txt)uniquement dans a.txt
seq 1 5de 1 à 5, un par ligne
seq -w 1 10complétés par des zéros : 01 … 10
for i in $(seq 1 3); do echo "run $i"; donecompteur de boucle
printf '%s' 'user:pass' | base64encoder (printf évite un retour à la ligne final)
echo dXNlcjpwYXNz | base64 -ddécoder
base64 -w 0 image.png > image.b64sans retour à la ligne (GNU coupe à 76 caractères)
macOS/BSD : Le base64 de macOS ne coupe pas les lignes par défaut et n’a pas -w. Utilisez -d pour décoder (les anciens macOS utilisaient -D).
iconv -f WINDOWS-1252 -t UTF-8 old.csv > new.csvcorriger les caractères illisibles des exports Excel
iconv -llister les encodages pris en charge
shuf -n 1 names.txtune ligne au hasard
shuf -i 1-100 -n 5cinq nombres au hasard entre 1 et 100
Services systemd : démarrer, arrêter, activer au démarrage et lire leurs journaux avec journalctl.
systemctl status nginxétat, PID, mémoire et dernières lignes du journal
systemctl is-active --quiet nginx && echo uppour les scripts
sudo systemctl restart nginxredémarrage complet
sudo systemctl reload nginxrelire la configuration sans couper les connexions (si le service le permet)
Testez la configuration avant de redémarrer quand c’est possible, ex. sudo nginx -t, pour qu’une faute de frappe ne mette pas le site hors ligne.
sudo systemctl enable --now dockeractiver au démarrage et lancer maintenant
sudo systemctl disable --now cupsarrêter maintenant et au démarrage
sudo systemctl mask bluetoothempêcher totalement son lancement (unmask pour annuler)
systemctl --failedce qui a planté
systemctl list-units --type=service --state=runningce qui tourne
systemctl list-unit-files --state=enabledce qui se lance au démarrage
sudo systemctl edit nginxsurcharge drop-in qui survit aux mises à jour des paquets
systemctl cat nginxl’unité et toutes ses surcharges
sudo systemctl daemon-reloadnécessaire après avoir modifié des fichiers d’unité à la main
[Unit]
Description=My app
After=network.target
[Service]
User=app
WorkingDirectory=/srv/app
ExecStart=/srv/app/bin/server
Restart=on-failure
[Install]
WantedBy=multi-user.targetensuite : sudo systemctl daemon-reload && sudo systemctl enable --now myapp
journalctl -u nginx -fsuivre un service
journalctl -u myapp --since '10 min ago'fenêtre récente
journalctl -b -1 -p errerreurs du démarrage précédant le plantage
journalctl --disk-usageplace occupée par les journaux
sudo journalctl --vacuum-size=500Mgarder au plus 500 Mo de journaux archivés
sudo journalctl --vacuum-time=14dsupprimer les journaux archivés de plus de deux semaines
Pour une limite permanente, définissez SystemMaxUse= dans /etc/systemd/journald.conf.
sudo tail -f /var/log/syslogjournal général sous Debian/Ubuntu (/var/log/messages sous Fedora/RHEL)
sudo tail -f /var/log/auth.logconnexions et sudo sous Debian/Ubuntu (/var/log/secure sous RHEL)
Certaines distributions (Fedora, Arch) ne conservent les journaux que dans le journal systemd, sauf si rsyslog est installé.
sudo rebootredémarrer maintenant
sudo shutdown -r +10 'Kernel update'redémarrer dans 10 minutes en prévenant les utilisateurs connectés
sudo shutdown -cannuler un arrêt programmé
sudo shutdown -h nowéteindre
Exécuter des commandes selon un planning ou une seule fois plus tard.
crontab -eouvrir votre crontab dans $EDITOR
crontab -ll’afficher
crontab -l > crontab.bakla sauvegarder
Construire et comprendre le planning avec le générateur d’expressions cron →
30 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1tous les jours à 02:30, en conservant la sortie
*/15 * * * * /usr/local/bin/check.shtoutes les 15 minutes
0 9 * * 1-5 /usr/local/bin/report.sh09:00 du lundi au vendredi
@reboot /usr/local/bin/startup.shune fois au démarrage
Cron s’exécute avec un PATH minimal et sans profil de shell : utilisez des chemins absolus. Un % dans la commande doit être échappé en \%.
crontab -l > ~/crontab.bak && crontab -rsauvegarder avant de supprimer
crontab ~/crontab.bakrestaurer depuis un fichier
Attention : Supprime toutes vos tâches cron sans confirmation, et la touche r est juste à côté du e sur le clavier. Certaines implémentations de cron proposent -i pour demander d’abord (crontab -ri).
0 3 * * * root /usr/local/bin/cleanup.shligne dans /etc/cron.d/cleanup : notez le champ utilisateur en plus
ls /etc/cron.daily/scripts exécutés une fois par jour par run-parts
Sous Debian et Ubuntu, les fichiers de /etc/cron.d dont le nom contient un point sont ignorés : nommez-le backup, pas backup.cron.
echo 'systemctl restart myapp' | sudo at 02:00cette nuit à 2 h
echo './report.sh' | at now + 30 minutesdans une demi-heure
atqtâches en attente
atrm 3annuler la tâche 3
Nécessite le paquet at et le service atd en cours d’exécution.
systemctl list-timerstous les timers et leur prochain déclenchement
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
[Install]
WantedBy=timers.targetbackup.timer à côté de backup.service ; Persistent rattrape les exécutions manquées pendant un arrêt
systemd-analyze calendar 'Mon..Fri 09:00'vérifier ce que signifie une expression OnCalendar
sleep 5 && curl -s localhost:8080/healthlaisser à un service le temps de démarrer
sleep 2mles suffixes fonctionnent sous GNU et les macOS actuels
Pipes, redirections, globbing, variables, historique et les raccourcis qui font gagner le plus de temps. macOS utilise zsh par défaut : presque tout fonctionne aussi, sauf shopt, help et les fonctionnalités de bash 4 (macOS fournit bash 3.2).
ps aux | grep nginxfiltrer une liste
history | grep 'docker run'retrouver une commande déjà lancée
set -o pipefaildans les scripts : un pipeline échoue si n’importe quelle partie échoue, pas seulement la dernière
ls -l > listing.txtécraser (crée le fichier)
echo 'done' >> progress.logajouter à la fin
set -o noclobberfaire refuser à > l’écrasement des fichiers existants (>| force)
Le shell vide le fichier avant l’exécution de la commande : sort file > file vous laisse donc un fichier vide. Écrivez dans un nouveau nom, puis utilisez mv.
find / -name x 2>/dev/nulljeter les messages d’erreur
./build.sh > build.log 2>&1sortie et erreurs dans un même fichier (l’ordre compte : > d’abord, puis 2>&1)
./build.sh &> build.lograccourci bash pour la même chose
mysql mydb < dump.sqlfichier en entrée
cat > config.yml <<'EOF'
port: 8080
host: $HOST stays literal
EOFmettre 'EOF' entre guillemets empêche le développement des $variables
grep -c a <<< "banana"here-string
make && sudo make installinstaller seulement si la compilation a réussi
cd /srv/app || exit 1arrêter un script si cd échoue
(cd frontend && npm run build)parenthèses : un sous-shell, donc votre répertoire ne change pas
echo "Today is $(date +%A)"substitution de commande
echo $(( 1024 * 4 ))calcul en nombres entiers
diff <(ls dir1) <(ls dir2)substitution de processus : la sortie comme fichier temporaire
Les accents graves `commande` sont l’ancienne forme de $(commande) ; $( ) s’imbrique et se lit mieux.
ls *.jpgtous les JPG de ce dossier
rm photo-??.pngphoto-01.png … photo-99.png
cp config.{yml,yml.bak}expansion des accolades : cp config.yml config.yml.bak
shopt -s globstar; ls **/*.md** correspond à n’importe quelle profondeur (bash 4+)
Les globs ne correspondent pas aux fichiers cachés par défaut (shopt -s dotglob change cela). Si rien ne correspond, bash transmet le motif tel quel, sauf si shopt -s nullglob est activé.
echo 'Cost: $5'guillemets simples : rien n’est développé
echo "Home is $HOME"guillemets doubles : les variables sont développées, les espaces conservées
cp "$file" "$dest/"mettez toujours entre guillemets les variables contenant des chemins : les espaces cassent celles qui n’y sont pas
name="Ada"; echo "Hi $name"définir et utiliser
echo "${PORT:-8080}"valeur par défaut si non définie ou vide
file=report.tar.gz; echo "${file%%.*}" "${file##*/}"retirer l’extension / retirer le répertoire
echo "${#name}"longueur de la chaîne
export NODE_ENV=productionvisible par tous les programmes lancés depuis ce shell
DEBUG=1 ./appuniquement pour cette commande
printenv | sortles lister
unset DEBUGsupprimer
Perdues à la fermeture du shell. Placez les export dans ~/.bashrc (shells interactifs) ou ~/.profile (shells de connexion) pour les conserver.
echo "$PATH" | tr : '\n'une entrée par ligne
export PATH="$HOME/.local/bin:$PATH"placer votre propre dossier bin en tête (à ajouter dans ~/.bashrc)
hash -roublier les emplacements de commandes mis en cache après avoir déplacé des binaires
alias ll='ls -alF'à ajouter dans ~/.bashrc pour le conserver
source ~/.bashrcappliquer les changements sans ouvrir de nouveau terminal (comme . ~/.bashrc)
\lslancer le vrai ls, en contournant un alias
grep -q root /etc/passwd; echo $?0 trouvé, 1 non trouvé, 2 erreur
set -euo pipefailen tête de script : arrêt en cas d’erreur, de variable non définie ou de pipe en échec
sudo !!relancer la dernière commande avec sudo
cd !$utiliser le dernier argument de la commande précédente
!42relancer la ligne 42 de l’historique
^foo^barrelancer la dernière commande en remplaçant foo par bar
Avec HISTCONTROL=ignorespace (par défaut sous Ubuntu, via ignoreboth), une commande tapée avec une espace au début n’est pas enregistrée : pratique pour les commandes contenant des secrets.
bind -P | lesslister tous les raccourcis clavier
man rsyncmanuel complet ; / pour rechercher, q pour quitter
man 5 crontabsection 5 : le format du fichier, pas la commande
help cdles commandes internes de bash n’ont pas de page man à elles
apropos partitionquelles commandes mentionnent un mot
#!/usr/bin/env bash
set -euo pipefail
name="${1:-world}"
if [[ -f "$name.txt" ]]; then
echo "found $name.txt"
fi
for f in *.log; do
echo "$f"
donearguments, un test, une boucle
chmod +x script.sh && ./script.sh Adarendre exécutable et lancer
bash -x script.shtracer chaque ligne pendant l’exécution
$1 … $9 sont les arguments, "$@" les contient tous, $# indique leur nombre. [[ ]] est propre à bash ; utilisez [ ] dans les scripts sh POSIX.
resetaprès un cat sur un fichier binaire qui a laissé le terminal afficher n’importe quoi
Un problème, ou quelque chose à améliorer ? Nous lisons chaque message et corrigeons vite.
Cet aide-mémoire des commandes Linux regroupe plus de 200 commandes selon la tâche à accomplir : se déplacer et gérer des fichiers, permissions, processus, espace disque, réseau, paquets, utilisateurs, archives, recherche, traitement de texte, services et journaux systemd, cron, et les bases de bash qui relient le tout. Chaque entrée donne la syntaxe, les options que vous utiliserez vraiment avec une explication d’une ligne, des exemples à copier et, quand c’est important, un avertissement. Cherchez par tâche (« espace disque libre », « port 8080 ») ou par nom de commande, et créez un lien direct vers n’importe quelle entrée.
Les options suivent les manuels de GNU coreutils, util-linux, procps-ng, iproute2, systemd et bash, c’est-à-dire ce que livrent Ubuntu, Debian, Fedora, RHEL, Arch et openSUSE. Quand macOS se comporte différemment, une note bleue l’explique, car sed -i, date -d, stat -c et xargs sont les endroits classiques où un script écrit sur l’un casse sur l’autre. C’est une référence pour les 90 % d’usages courants, pas un remplacement des pages de manuel : pour les options rarement utilisées, man <command> reste la référence.
Commencez par la navigation et les fichiers : pwd, ls, cd, mkdir, cp, mv, rm, cat et less. Puis man (aide), sudo, grep et find pour chercher, chmod et chown pour les permissions, ps, top et kill pour les processus, df et du pour l’espace disque, et ssh et scp pour les machines distantes. Apprenez tôt les pipes (|) et les redirections (> et >>), car ils permettent de combiner tout le reste.
Lancez df -h pour voir l’espace libre de chaque système de fichiers monté, en unités lisibles. Pour savoir ce qui occupe l’espace, lancez du -h -d 1 | sort -h dans un répertoire : il liste les sous-dossiers, les plus gros en dernier. Si df indique que le disque est plein mais que du ne trouve rien, un fichier supprimé est probablement encore ouvert par un processus ; sudo lsof +L1 les liste.
Lancez sudo ss -tulpn pour lister tous les ports TCP et UDP en écoute avec le programme qui les détient, ou sudo lsof -i :8080 pour un seul port. Le sudo compte : sans lui, vous ne voyez que les noms de vos propres processus. ss a remplacé netstat, qui fonctionne encore sur les systèmes où le paquet net-tools est installé.
kill PID envoie SIGTERM, qui demande au processus de se terminer et le laisse faire le ménage : vider les fichiers, libérer les verrous, fermer les connexions. kill -9 PID envoie SIGKILL, que le noyau applique immédiatement et que le processus ne peut ni intercepter ni ignorer : aucun nettoyage n’a lieu. Utilisez d’abord kill seul, attendez quelques secondes, et réservez -9 aux processus qui l’ignorent.
macOS est livré avec le sed de BSD, où -i exige un argument d’extension de sauvegarde. Sur macOS, écrivez sed -i '' 's/old/new/g' file ; avec le sed GNU de Linux, la même commande échoue, car il lit '' comme le script. La forme qui fonctionne sur les deux est sed -i.bak 's/old/new/g' file, qui conserve une copie de sauvegarde que vous pouvez supprimer ensuite.
Presque toutes : les outils de base proviennent partout des mêmes projets GNU et util-linux. Ce qui diffère, c’est le gestionnaire de paquets (apt sur Debian et Ubuntu, dnf sur Fedora et RHEL, pacman sur Arch, zypper sur openSUSE, présentés côte à côte dans le tableau Paquets), certains chemins de fichiers journaux, le groupe d’administration (sudo ou wheel) et l’interface du pare-feu (ufw ou firewalld). Alpine et les systèmes basés sur BusyBox utilisent des versions réduites des outils, avec moins d’options.
Une courte liste de commandes cause presque tous les dégâts : rm -rf avec un chemin erroné ou vide, dd ou mkfs pointés sur le mauvais disque, chmod -R 777 ou chown -R sur un répertoire système, rsync --delete ou des copies miroir à la robocopy avec source et destination inversées, crontab -r au lieu de crontab -e, usermod -G sans -a, et find avec -delete au mauvais endroit. Chacune est marquée Dangereuse dans l’aide-mémoire, avec la façon précise dont elle tourne mal.
Le réflexe qui évite l’essentiel consiste à lancer d’abord la version inoffensive. Avant rm -rf, lancez ls sur le même chemin. Avant find … -delete, lancez le même find avec -print. Avant rsync --delete, ajoutez -n pour un essai à blanc. Avant dd ou mkfs, lancez lsblk et lisez deux fois le nom du périphérique. Dans les scripts, écrivez ${DIR:?} au lieu de $DIR pour qu’une variable vide interrompe le script au lieu de transformer un chemin en /.
Deux réglages du shell aident aussi : set -euo pipefail en tête de script arrête l’exécution à la première erreur au lieu de continuer dans un état incohérent, et set -o noclobber fait refuser à > l’écrasement d’un fichier existant.
macOS est un Unix, mais ses outils en ligne de commande viennent de FreeBSD plutôt que de GNU, et les différences apparaissent précisément quand vous copiez une commande d’un tutoriel Linux :
• sed -i exige un argument sur macOS (sed -i '' …) ; -i.bak fonctionne sur les deux.
• date n’a pas d’option -d sur macOS ; utilisez date -r <epoch> pour convertir un horodatage et date -v-2d pour les dates relatives.
• stat utilise -f avec d’autres lettres de format au lieu du -c de GNU.
• xargs sur macOS ignore par défaut une entrée vide, alors que xargs de GNU lance la commande une fois, sauf avec -r.
• du accepte -d 1 sur les deux, mais seul GNU accepte --max-depth ; ps n’a pas de --sort sur macOS (utilisez ps aux -m ou -r).
• head -n -5, tac, free, ip, ss, timeout et watch sont absents de macOS par défaut.
Si vous avez besoin du comportement GNU sur un Mac, les paquets Homebrew coreutils, gnu-sed et findutils installent les versions GNU avec un préfixe g (gsed, gdate, gstat, gxargs).
ls -l affiche les permissions sous forme de dix caractères, comme -rwxr-x---. Le premier est le type (- fichier, d répertoire, l lien) ; les neuf suivants forment trois groupes lecture, écriture et exécution pour le propriétaire, le groupe et tous les autres. En chiffres, r vaut 4, w vaut 2 et x vaut 1, additionnés par groupe : rwxr-x--- donne donc 750.
Modes typiques : 644 pour les fichiers ordinaires, 755 pour les répertoires et les scripts, 600 pour les clés privées et les fichiers contenant des secrets, 700 pour un répertoire privé comme ~/.ssh. Sur un répertoire, x signifie « peut y entrer », c’est pourquoi les répertoires en ont besoin et pas les fichiers ordinaires. Le calculateur chmod convertit entre les formes symbolique et octale si vous voulez vérifier un mode avant de l’appliquer.