J'ai raconté ailleurs comment deux livres de Daniel J. Barrett m'ont fait passer de « j'exécute Linux » à « je pilote Linux ». Cette fiche est le sous-produit direct de cette lecture : ce que je notais au fur et à mesure, réorganisé.
Elle n'est pas exhaustive et ne cherche pas à l'être. Elle est classée par situation plutôt que par ordre alphabétique, parce que c'est comme ça qu'on retrouve une commande : on part d'un problème, pas d'un nom. L'index alphabétique couvre le trajet inverse, quand on croise une commande et qu'on veut savoir ce qu'elle fait.
Les commandes préfixées par sudo modifient le système. Lire avant d'exécuter, tester avec -n / --dry-run quand l'option existe.
Les bases#
pwd— où suis-je ? affiche le répertoire courantls/ls -l/ls -a— lister / avec détails / avec les fichiers cachéscd /var/log;cd ..;cd ~;cd -— aller / remonter / home / répertoire précédentmkdir dossier;rmdir dossier— créer / supprimer un répertoire videtouch fichier— créer un fichier vide (ou mettre à jour sa date)cp source destination— copier (-rpour un répertoire)mv source destination— déplacer ou renommerrm fichier;rm -r dossier— supprimer (pas de corbeille : c'est définitif)cat fichier— afficher tout le contenuless fichier— lire page par page (flèches,/recherche,qpour quitter)nano fichier— éditeur simple (Ctrl+O enregistrer, Ctrl+X quitter)vim fichier—ipour écrire, Échap puis:wqpour enregistrer et quitterecho 'texte';echo $HOME— afficher du texte ou une variablegrep motif fichier— chercher une chaîne dans un fichierfind . -name 'nom'— chercher un fichier par son nomclear— nettoyer l'écran (ou Ctrl+L)exit/logout— fermer la session ou le shellsudo commande— exécuter en administrateurwhoami;hostname;date— qui suis-je / nom de la machine / date et heuredf -h;free -h— espace disque / mémoire disponibleschmod +x script.sh;./script.sh— rendre exécutable puis lancer- Tab / Tab Tab — complétion automatique / lister les possibilités
*?[abc]{a,b}— jokers : tout / un caractère / un parmi / alternatives...~/— ici / parent / home / racine du systèmeapt install/apt remove— installer / désinstaller un logicielreboot;poweroff— redémarrer / éteindre (avecsudo)
Aide & documentation#
man 5 crontab— manuel, section 5 = formats de fichiers ; 1 = commandes, 8 = adminapropos reseau/man -k— chercher une commande par mot-clécmd --help | less— aide courte intégréetype -a cmd/which cmd— alias, fonction, builtin ou binaire ?tldr tar;tldr --update— exemples concrets au lieu du man (apt install tldr)cargo install tealdeer— même chose en Rust, démarrage instantanécurl cheat.sh/tar— aide par exemples, sans rien installer- explainshell.com — décortique une ligne de commande option par option
history | grep ssh— retrouver une commande passée!!/!$/!123— dernière commande / son dernier argument / commande n°123sudo !!— rejouer la dernière commande en root
Raccourcis clavier (readline, mode emacs)#
- Ctrl+A / Ctrl+E — début / fin de ligne
- Ctrl+B / Ctrl+F — recule / avance d'un caractère
- Alt+B / Alt+F — recule / avance d'un mot
- Ctrl+W — supprime le mot précédent (jusqu'à l'espace)
- Alt+Retour arrière — supprime le mot précédent (s'arrête aux
/,-,.) - Alt+D — supprime le mot suivant
- Ctrl+U / Ctrl+K — coupe avant / après le curseur
- Ctrl+Y — recolle ce qui a été coupé ; Alt+Y parcourt les coupes
- Ctrl+_ (ou Ctrl+X Ctrl+U) — annule la dernière modification
- Ctrl+T / Alt+T — intervertit deux caractères / deux mots
- Alt+U / Alt+L / Alt+C — mot en majuscules / minuscules / capitalisé
- Ctrl+R — recherche arrière dans l'historique (répéter pour remonter)
- Ctrl+G / Ctrl+J — abandonne / valide la recherche en cours
- Ctrl+S — recherche avant (nécessite
stty -ixondans~/.bashrc) - Ctrl+P / Ctrl+N — commande précédente / suivante
- Alt+. (ou Alt+_) — insère le dernier argument de la commande précédente
- Ctrl+X Ctrl+E — ouvre la ligne courante dans
$EDITOR - Ctrl+L — efface l'écran sans perdre la ligne en cours
- Ctrl+C / Ctrl+D / Ctrl+Z — interrompt / EOF / suspend (
fgpour reprendre) - Ctrl+S / Ctrl+Q — gèle / dégèle l'affichage (terminal qui semble figé)
set -o vi;set -o emacs— changer de mode d'édition (emacs par défaut)- zsh :
bindkey -e;bindkey -v;bindkey -L— même chose sous zsh (emacs par défaut) / lister bind -P;~/.inputrc— lister / personnaliser les raccourcis readline- Valable aussi dans
psql,python,irb— tout ce qui utilise readline
Navigation & inspection de fichiers#
ls -lAh --group-directories-first— listing lisible, cachés inclusls -lt/ls -lS— trier par date / par taillecd -— revenir au répertoire précédentpushd /var/log;popd— pile de répertoirestree -L 2 -a— arborescence limitée à 2 niveauxstat fichier— inode, permissions, dates atime/mtime/ctimefile fichier— type réel (ne pas se fier à l'extension)readlink -f lien— résoudre le chemin absolu réelfind . -name '*.log' -mtime +7 -delete— supprimer les.logde plus de 7 joursfind /var -type f -size +100M— fichiers de plus de 100 Mofind . -type f -exec chmod 644 {} +— appliquer une commande à chaque résultatfind . -newer ref.txt— fichiers modifiés aprèsref.txtlocate nginx.conf;sudo updatedb— recherche instantanée via index (plocate)du -sh * | sort -h— poids de chaque élément, triéncdu— explorateur d'espace disque interactif
Manipuler fichiers & répertoires#
cp -a src/ dst/— copie en préservant droits, liens, datescp -r --reflink=auto— copie légère sur Btrfs/XFS si supportémv -n a b— ne pas écraser la ciblerm -rf --one-file-system dir— suppression sûre, ne traverse pas les montagesmkdir -p a/b/c— crée toute l'arborescenceln -s /opt/app/bin/app /usr/local/bin/app— lien symboliquetouch -d '2024-01-01' f— forcer une date de modificationshred -u fichier— écrasement avant suppression (HDD)rsync -avh --progress src/ dst/— copie incrémentale (le/final compte !)rsync -avz --delete -e ssh src/ user@host:/dst/— miroir distant compressérsync -avn ...—-n= dry-run, à tester systématiquement d'abordinstall -m 750 -o www-data f /srv/— copier en fixant droits et propriétaire
Texte : lire, filtrer, transformer#
less +F fichier.log— commetail -fmais navigable (qpour sortir)tail -f -n 100 app.log— suivre un fichier en temps réelhead -n 20/tail -n +2— 20 premières lignes / à partir de la ligne 2grep -rniE 'error|fail' /var/log— récursif, insensible à la casse, regex étenduegrep -v '^#' -e '^$' conf— exclure commentaires et lignes videsgrep -c/-l/-o— compter / lister les fichiers / n'afficher que la correspondancegrep -A3 -B3 'motif'— contexte après / avantrg 'motif' --type ts— ripgrep : bien plus rapide que grepsed -i 's/ancien/nouveau/g' f— remplacement en place (-i.bakpour sauvegarder)sed -n '10,20p' f— afficher seulement les lignes 10 à 20sed '/^#/d' f— supprimer les lignes commentéesawk '{print $1, $NF}' f— première et dernière colonneawk -F: '$3>=1000 {print $1}' /etc/passwd— utilisateurs humainsawk '{s+=$1} END {print s}'— somme d'une colonnecut -d, -f1,3 data.csv— extraire des colonnessort -u/sort -k2 -n/sort -h— unique / par colonne numérique / tailles humainesuniq -c | sort -rn | head— top des occurrencestr -d '\r' < f > f.unix— supprimer les CR (fichiers Windows)wc -l/-c/-w— compter lignes / octets / motsdiff -u a b;vimdiff a b— comparer deux fichiersjq '.items[] | .name' f.json— parser du JSONcolumn -t -s, f.csv— aligner en colonnes lisiblesxargs -a liste.txt -I{} cp {} /dst— construire des commandes depuis une listecomm -13 a.txt b.txt— lignes présentes seulement dansb(fichiers triés)
sed ou awk : lequel choisir ?#
C'est la question qui revient à chaque fois, alors autant poser la règle en une ligne : grep filtre, sed transforme, awk calcule.
- Je pense « remplacer / supprimer / insérer » → sed (la ligne est une chaîne de caractères)
- Je pense « colonne 3, somme, si tel champ » → awk (la ligne est un tableau de champs)
- J'ai besoin de mémoire entre les lignes → awk (compteurs, tableaux, bloc
END) - Ça dépasse 3 lignes d'awk → passer à Python, ce sera plus lisible dans 6 mois
- Position fixe et simple → cut, plus rapide à écrire que les deux
sed : substituer et éditer des lignes#
sed 's/ancien/nouveau/' f— 1re occurrence de chaque lignesed 's/ancien/nouveau/g' f— toutes les occurrencessed -i.bak 's/a/b/g' f— modifié en place en gardantf.baksed 's#/usr/local#/opt#g' f— changer de délimiteur pour éviter les\/sed -E 's/([0-9]+)-([0-9]+)/\2-\1/' f— regex étendue + groupes de capturesed -n '10,20p' f;sed -n '$p' f— afficher lignes 10 à 20 / la dernièresed -n '/debut/,/fin/p' f— extraire un bloc entre deux motifssed -n '120,175p;175q' f | nl -ba -v120— extrait 120-175 numérotées comme dans le fichier...p;175q— leqarrête sed à 175 au lieu de lire tout le fichiernl -ba -v120—-banumérote aussi les lignes vides,-vfixe le départsed '/^#/d ; /^$/d' f— enlever commentaires et lignes videssed '1d' f;sed '$d' f— supprimer l'entête / la dernière lignesed '/motif/s/a/b/' f— substituer seulement sur les lignes contenantmotifsed 's/^/# /' f— commenter toutes les lignessed 's/[[:space:]]*$//' f— supprimer les espaces en fin de lignesed '3i\ligne' f;sed '3a\ligne' f— insérer avant / après la ligne 3sed -n 's/^Version: //p' f— extraire une valeur (-n+p= seulement ce qui matche)sed 's/.*/\U&/' f— tout en majuscules (GNU sed)
Toujours tester sans -i d'abord. Et attention : -i n'existe pas tel quel sur macOS/BSD.
awk : colonnes, filtres et calculs#
awk '{print $1, $3}' f— champs 1 et 3 ($0= ligne entière,$NF= dernier)awk -F: '{print $1}' /etc/passwd— choisir le séparateur d'entréeawk -F'\t' -v OFS=, '{print $1,$2}' f— TSV vers CSVawk 'NR==1 {next} {...}' f— sauter la ligne d'entêteawk 'NR>=10 && NR<=20' f— plage de lignes (NR= numéro de ligne)awk '$3 > 100' f— filtrer sur une valeur numériqueawk '/erreur/ {print $2}' f— filtrer par motif puis extraireawk '{s+=$2} END {print s}' f— somme d'une colonneawk '{s+=$1} END {print s/NR}' f— moyenneawk '{a[$1]++} END {for (k in a) print a[k], k}' f— compter par clé (puis| sort -rn)awk '!vu[$0]++' f— dédoublonner sans trier (garde l'ordre)awk '{print NF}' f;awk 'NF==0'— nombre de champs / lignes videsawk 'length > 80' f— lignes trop longuesawk -v seuil=100 '$2 > seuil' f— passer une variable du shell à awkawk '{printf "%-20s %6.2f\n", $1, $2}' f— mise en forme en colonnesawk 'BEGIN {...} {...} END {...}'— avant / pour chaque ligne / après : la structure d'awkss -tulpn | awk 'NR>1 {print $5}'— usage typique en bout de pipedu -s * | awk '$1 > 1e6 {print $2}'— filtrer une sortie chiffrée
Redirections, pipes & substitutions#
cmd > f/>> f— écraser / ajouter (stdout)cmd 2> err.log/&> tout.log— stderr / stdout+stderrcmd 2>&1 | tee -a log— tout dans le pipe et dans un fichiercmd < f/cmd <<< 'texte'— entrée depuis fichier / depuis une chaînecat <<'EOF' > f ... EOF— heredoc (quotes = pas d'expansion)cmd1 && cmd2 || cmd3— si succès / sinon$(cmd)— substitution de commandediff <(cmd1) <(cmd2)— substitution de processuscmd | tee /dev/tty | wc -l— voir et traiter en même tempscmd > /dev/null 2>&1— silence total
Permissions, propriétés & sudo#
chmod 640 f;chmod u+x,g-w f— octal ou symboliquechmod -R u=rwX,go=rX dir—X=+xseulement sur les répertoireschown -R user:group dir— changer propriétaire et groupeumask 022— droits par défaut des nouveaux fichierschmod g+s dir— setgid : héritage du groupe dans le répertoirechmod +t /tmp— sticky bit : seul le propriétaire peut supprimergetfacl f;setfacl -m u:jean:rw f— droits fins (ACL)lsattr/chattr +i f— rendre un fichier immuablesudo -i/sudo -u www-data cmd— shell root / exécuter en tant qu'un autre utilisateursudo visudo— éditer sudoers avec vérification syntaxiquesudo -l— lister ses propres droits sudo
Utilisateurs & groupes#
adduser jean— création interactive (Debian, préférer àuseradd)usermod -aG docker,sudo jean— ajouter à des groupes (-aobligatoire !)deluser --remove-home jean— supprimer un compte et son homepasswd jean;passwd -l jean— changer / verrouiller un mot de passeid jean;groups jean— uid, gid, groupessu - jean— changer d'utilisateur avec son environnementchage -l jean— expiration du mot de passewho/w/last/lastlog— sessions actives et historique de connexionuseradd -r -s /usr/sbin/nologin svc— compte de service sans shell
Paquets : APT & dpkg#
sudo apt update && sudo apt upgrade— mettre à jour l'index puis les paquetssudo apt full-upgrade— upgrade autorisant les suppressions (ex-dist-upgrade)apt search motif;apt show paquet— chercher / détaillersudo apt install ./paquet.deb— installer un.debavec ses dépendancessudo dpkg -i paquet.deb— installation d'un.deblocal, sans résolution des dépendancessudo apt -f install— à lancer juste aprèsdpkg -ipour compléter les dépendancessudo dpkg -r paquet;sudo dpkg -P paquet— désinstalle / + fichiers de conf (sans les dépendances)sudo apt remove/purge paquet— désinstaller / + fichiers de confsudo apt autoremove --purge— nettoyer les dépendances orphelinesapt list --installed | grep nginx— vérifier ce qui est installéapt list --upgradable— mises à jour disponiblesapt-mark hold/unhold paquet— figer une versionapt policy paquet— versions candidates et dépôts sourcesdpkg -l | grep ^rc— paquets désinstallés avec conf résiduelledpkg -L paquet;dpkg -S /chemin— fichiers du paquet / paquet fournissant un fichiersudo dpkg --configure -a— réparer une installation interrompuesudo apt --fix-broken install— résoudre des dépendances casséessudo add-apt-repository ppa:xxx/ppa— ajouter un PPA (Ubuntu)ls /etc/apt/sources.list.d/— dépôts additionnelssudo unattended-upgrade --dry-run -d— tester les MAJ de sécurité automatiquescat /var/run/reboot-required— un redémarrage est-il nécessaire ?snap list/sudo snap refresh— paquets snap (Ubuntu)
Processus & charge#
ps aux --sort=-%mem | head— top consommateurs mémoireps -ef --forest— arborescence des processuspgrep -af node;pkill -f 'node app'— chercher / tuer par motif de ligne de commandekill -15 PIDpuiskill -9 PID— arrêt propre (TERM) puis forçage (KILL)htop/btop— moniteur interactif (F5 arbre, F6 tri, F9 kill)top -o %CPU— sans installation supplémentairenice -n 10 cmd;renice -n 5 -p PID— baisser la prioriténohup cmd &/setsid cmd— détacher du terminaljobs/fg %1/bg %1/disown— gestion des jobs du shelllsof -i :8080;lsof -p PID— qui utilise ce port / fichiers ouvertsfuser -k 8080/tcp— tuer ce qui occupe un porttimeout 30s cmd— limiter la durée d'exécutionwatch -n 2 'df -h'— réexécuter toutes les 2 sstrace -p PID -f -e trace=openat— tracer les appels système
systemd : services & unités#
systemctl status nginx— état, PID, extrait des logssudo systemctl start|stop|restart|reload nginx— cycle de vie du servicesudo systemctl enable --now nginx— activer au boot + démarrer tout de suitesudo systemctl disable --now nginx— désactiver et arrêtersystemctl is-active/is-enabled/is-failed— réponses courtes, idéales en scriptsystemctl list-units --type=service --state=running— services actifssystemctl --failed— unités en échecsystemctl cat nginx;systemctl show nginx— définition / toutes les propriétéssudo systemctl edit nginx— override propre dans/etc/systemd/system/*.d/sudo systemctl daemon-reload— après modification d'un fichier.servicesystemctl list-timers --all— tâches planifiées systemdsystemd-analyze blame;critical-chain— ce qui ralentit le démarragesudo systemctl mask/unmask svc— interdire totalement le démarrageloginctl/hostnamectl/timedatectl— sessions / nom d'hôte / heure et NTPsudo timedatectl set-timezone Europe/Paris— fuseau horaire
Journaux & diagnostic#
journalctl -u nginx -f— suivre les logs d'un servicejournalctl -u nginx --since '1 hour ago'— fenêtre temporelle (--untilaussi)journalctl -p err -b— erreurs depuis le dernier bootjournalctl -b -1— logs du boot précédent (utile après crash)journalctl --disk-usage;--vacuum-time=7d— taille des logs / purgejournalctl -k/dmesg -T -w— messages du noyau (OOM killer, disques, USB)tail -f /var/log/syslog /var/log/auth.log— logs classiques Debian/Ubuntulogger -t monapp 'message'— écrire dans le journal depuis un scriptsudo logrotate -d /etc/logrotate.conf— tester la rotation sans l'appliqueruptime;free -h;vmstat 1— charge, mémoire, activité systèmeiostat -xz 1;iotop— IO disque (paquetsysstat)dmesg | grep -i 'out of memory'— confirmer un kill par manque de RAM
Disques, partitions & montage#
df -hT;df -i— espace libre par système de fichiers / inodeslsblk -f— disques, partitions, UUID, points de montageblkid— UUID et type de système de fichierssudo mount /dev/sdb1 /mnt;umount /mnt— monter / démontersudo mount -a— monter tout/etc/fstab(à tester avant reboot !)UUID=xxx /data ext4 defaults,noatime 0 2— ligne type de/etc/fstabsudo mkfs.ext4 -L data /dev/sdb1— formatersudo fdisk -l;sudo parted /dev/sdb print— table de partitionssudo e2fsck -f /dev/sdb1— vérifier un ext4 (démonté)sudo resize2fs /dev/sdb1— agrandir après extension de partitionsudo smartctl -a /dev/sda— santé du disque (smartmontools)sudo swapon --show;free -h— état du swapsudo dd if=x.iso of=/dev/sdX bs=4M status=progress conv=fsync— clé USB bootable (vérifier/dev/sdX!)
LVM : volumes logiques#
Principe : PV (disque) → VG (pool) → LV (volume). Un LV se formate et se monte comme une partition.
sudo pvs;vgs;lvs— vue rapide des volumes physiques, groupes, logiquessudo pvdisplay;vgdisplay;lvdisplay— même chose en détaillésudo lsblk— voir l'empilement disque → PV → LVsudo pvcreate /dev/sdb1— initialiser un disque comme volume physiquesudo vgcreate vg_data /dev/sdb1— créer un groupe de volumessudo vgextend vg_data /dev/sdc1— ajouter un disque à un groupe existantsudo lvcreate -L 50G -n lv_srv vg_data— créer un volume logique de 50 Gosudo lvcreate -l 100%FREE -n lv_srv vg_data— utiliser tout l'espace restantsudo mkfs.ext4 /dev/vg_data/lv_srv— formater le volume logiquesudo mount /dev/vg_data/lv_srv /srv— monter (puis ligne dans/etc/fstab)sudo lvextend -L +20G -r /dev/vg_data/lv_srv— agrandir de 20 Go,-rredimensionne le FSsudo lvextend -l +100%FREE -r /dev/vg_data/lv_srv— absorber tout l'espace libre du VGsudo lvreduce -L -10G -r /dev/vg_data/lv_srv— réduire (sauvegarder avant, ext4 seulement)sudo lvcreate -L 5G -s -n snap /dev/vg_data/lv_srv— instantané avant une mise à jour risquéesudo lvconvert --merge /dev/vg_data/snap— restaurer l'instantané (au prochain montage)sudo lvremove /dev/vg_data/lv_srv— supprimer un volume logiquesudo vgreduce vg_data /dev/sdc1;pvremove— retirer un disque du groupesudo pvmove /dev/sdb1— déplacer les données avant de retirer un disque- Ubuntu :
ubuntu-vg/ubuntu-lv— noms par défaut de l'installateur (souvent à étendre) df -hvslvs— silvsest plus grand, le FS n'a pas été redimensionné (-r)
Réseau#
ip a;ip -br a— adresses IP (vue compacte)ip r;ip route get 1.1.1.1— table de routage / route utiliséess -tulpn— ports en écoute avec les processusss -tan state established— connexions établiesping -c4/mtr host— connectivité / traceroute continudig +short example.com;dig @1.1.1.1 A x— résolution DNSresolvectl status;resolvectl query x— DNS via systemd-resolvedcurl -I https://site— en-têtes HTTP seulementcurl -sS -X POST -H 'Content-Type: application/json' -d '{}' url— requête APIcurl -w '%{time_total}\n' -o /dev/null -s url— mesurer un temps de réponsewget -c url— téléchargement reprenablenc -zv host 443— tester l'ouverture d'un porttcpdump -i eth0 -nn port 443 -c 20— capture de paquetshostnamectl set-hostname srv01— changer le nom d'hôtesudo netplan try;sudo netplan apply— config réseau Ubuntu (/etc/netplan/*.yaml)nmcli device status;nmcli con up X— NetworkManager (poste de travail)ip link set eth0 up/down— activer / désactiver une interface
SSH & accès distant#
ssh-keygen -t ed25519 -C 'poste-perso'— générer une clé modernessh-copy-id -i ~/.ssh/id_ed25519.pub user@host— installer sa clé publiquessh -p 2222 user@host— port non standardssh -i cle.pem -o IdentitiesOnly=yes user@host— forcer une clé précise~/.ssh/config:Host/HostName/User/Port/IdentityFile— alias de connexionssh -L 8080:localhost:80 user@host— tunnel local (accès à un service distant)ssh -R 9000:localhost:3000 user@host— tunnel inverse (exposer un service local)ssh -D 1080 user@host— proxy SOCKSssh -J bastion user@interne— rebond via une machine intermédiairescp -r dir user@host:/dst;sftp user@host— copie de fichiersssh-add -l;ssh-agent bash— clés chargées dans l'agentsudo sshd -t && sudo systemctl reload ssh— valider la conf avant de rechargerPermitRootLogin no/PasswordAuthentication no— durcissement dans/etc/ssh/sshd_configtmux new -s work;tmux a -t work— sessions persistantes (Ctrl+B d pour détacher)
Pare-feu & sécurité#
sudo ufw status verbose— état du pare-feusudo ufw allow 22/tcp;sudo ufw enable— ouvrir SSH avant d'activer !sudo ufw allow from 192.168.1.0/24 to any port 5432— règle sur une source précisesudo ufw delete allow 8080;ufw status numbered— supprimer une règlesudo ufw default deny incoming— politique par défautsudo nft list ruleset;iptables -L -n -v— règles bas niveausudo fail2ban-client status sshd— IP banniessudo fail2ban-client set sshd unbanip 1.2.3.4— débannirgrep 'Failed password' /var/log/auth.log | tail— tentatives d'intrusion SSHsudo lynis audit system— audit de durcissementgpg --verify fichier.sig fichier— vérifier une signaturesha256sum -c SHA256SUMS— vérifier une empreinte
Archives & compression#
tar -czf arch.tar.gz dir/— créer une archive gziptar -xzf arch.tar.gz -C /dst— extraire vers un répertoiretar -tzf arch.tar.gz | head— lister sans extrairetar -cJf arch.tar.xz dir/— xz : plus lent, plus compacttar --exclude='node_modules' -czf a.tgz .— exclure des cheminszip -r a.zip dir;unzip -l a.zip— format zipgzip -9 f;gunzip f.gz— compresser un fichier seulzstd -19 f;unzstd f.zst— excellent ratio vitesse/taille7z x archive.7z— paquetp7zip-full
Planification : cron, at, timers#
crontab -e;crontab -l— tâches de l'utilisateur courantsudo crontab -u www-data -e— cron d'un autre utilisateur*/15 * * * * cmd— min, heure, jour, mois, jour-semaine0 3 * * 1 /opt/backup.sh >> /var/log/bk.log 2>&1— tous les lundis à 3 h, avec logs@reboot cmd— au démarrage/etc/cron.d/;/etc/cron.daily/— cron système (champ utilisateur en plus)at 22:00 -f script.sh;atq;atrm 3— exécution unique différéemonjob.timer+monjob.service— alternative moderne à cronOnCalendar=*-*-* 03:00:00;Persistent=true— syntaxe timer (rattrape si machine éteinte)systemd-analyze calendar 'Mon *-*-* 03:00'— vérifier une expressionOnCalendar
Alias & fonctions du shell#
alias ll='ls -lAh'— crée un raccourci (valable pour la session courante)alias— liste tous les alias définisunalias ll— supprime un alias\ls— contourne ponctuellement un alias (antislash devant)type ll— alias, fonction, builtin ou binaire ?~/.bash_aliases— fichier dédié, chargé par~/.bashrcsur Debian/Ubuntusource ~/.bashrc(ou. ~/.bashrc) — recharge la conf sans rouvrir le terminalalias gs='git status';alias ..='cd ..'— exemples classiquesalias rm='rm -i'— filet de sécurité, mais masque le comportement réelalias sudo='sudo '— l'espace final permet à sudo de résoudre tes aliasmkcd() { mkdir -p "$1" && cd "$1"; }— un alias ne prend pas d'arguments : dès qu'il en faut un, écrire une fonction/etc/profile.d/mesalias.sh— alias pour tous les utilisateurs de la machine- zsh :
~/.zshrcau lieu de~/.bashrc— même syntaxe pour les alias et les fonctions
Variables du shell#
var=valeur— aucun espace autour du=echo "$var";echo "${var}_suffixe"— toujours guillemeter ; accolades pour délimiterexport VAR=valeur— transmet la variable aux processus enfantsVAR=valeur commande— variable définie pour cette seule commandeunset VAR;readonly VAR=x— supprime / rend non modifiableenv;printenv VAR;set— environnement / une variable / tout, shell inclusexport PATH="$HOME/bin:$PATH"— ajouter un répertoire d'exécutables$HOME$USER$PWD$SHELL$LANG$EDITOR— variables usuelles fournies par le système$?$$$0$#$@— code retour, PID, nom du script, nb d'arguments, argumentsresultat=$(commande)— récupère la sortie d'une commande${var:-defaut}— valeur de repli si la variable est vide${var:=defaut};${var:?message}— affecte le repli / échoue avec un message${#var}— longueur de la chaîne${var#prefixe};${var%.txt}— retire le début / la fin${var/ancien/nouveau}— remplace (//pour toutes les occurrences)${var^^};${var,,}— majuscules / minuscules (bash)arr=(a b c);${arr[1]};${arr[@]};${#arr[@]}— tableaux : élément, tous, nombrelocal var=x— variable limitée à une fonctionset -a ; source .env ; set +a— exporter d'un coup toutes les variables d'un.env~/.bashrcvs~/.profile— shell interactif vs session de connexion/etc/environment— variables globales (pas d'export, pas d'expansion)printenv | grep -i proxy— vérifier une variable d'environnement
Scripts bash : l'essentiel#
#!/usr/bin/env bash— shebang portableset -Eeuo pipefail— arrêt sur erreur, variable non définie, échec dans un pipeIFS=$'\n\t'— séparateur sûr : évite les surprises avec les espacestrap 'rm -rf "$tmp"' EXIT— nettoyage garanti à la sortietmp=$(mktemp -d)— répertoire temporaire sûr"${var:-defaut}"/"${var:?message}"— valeur par défaut / erreur si videif [[ -f "$f" && -r "$f" ]]; then ... fi— tests (préférer[[ ]]à[ ])for f in *.log; do echo "$f"; done— boucle (toujours guillemeter les variables)while read -r line; do ...; done < f— lire un fichier ligne par lignecase "$1" in start) ...;; *) ...;; esac— aiguillagemafonc() { local x=$1; ...; }— fonction avec variable locale$?/$#/$@/$0/$$— code retour / nb args / args / nom / PIDshellcheck script.sh— linter indispensablebash -x script.sh— mode trace pour déboguer
Neovim + kickstart.nvim#
~/.config/nvim/init.lua— le fichier unique de kickstart, à lire et éditer directementlua/kickstart/plugins/;lua/custom/plugins/— modules optionnels / tes propres plugins<leader>= Espace — appuyer sur Espace seul affiche which-key:Lazy;:Lazy update;:Lazy sync— gestionnaire de plugins (lazy-lock.jsonfige les versions):Mason— installer serveurs LSP, formateurs et linters:checkhealth— diagnostic complet (clipboard, parsers, providers):ConformInfo;<leader>f— formateur actif / formater le buffer
Telescope (recherche)
<leader>sf;<leader>sg— chercher un fichier / grep dans le projet<leader><leader>;<leader>s.— buffers ouverts / fichiers récents<leader>sw;<leader>/— mot sous le curseur / recherche dans le buffer courant<leader>sh;<leader>sk;<leader>sn— aide / raccourcis / fichiers de config nvim<leader>sd;<leader>sr— diagnostics / relancer la dernière recherche
LSP (défauts standardisés depuis nvim 0.11/0.12)
grd;grr;gri;grt— définition / références / implémentation / typegrn;gra— renommer le symbole / code actionK;gO;gW— doc flottante / symboles du fichier / du projet]d;[d;<leader>q— diagnostic suivant / précédent / liste quickfixCtrl+o;Ctrl+i— revenir / avancer dans la liste de sauts
Édition & fenêtres
gcc;gcen visuel — commenter une ligne / une sélectionsa);sd);sr)'— mini.surround : ajouter / supprimer / remplacer un entourageCtrl+h/j/k/l— naviguer entre les fenêtres (:vsplit,:split)<Esc>— effacer la surbrillance de recherche
Les mappings évoluent avec les versions : en cas de doute, <leader> puis attendre, ou :map.
Nouveautés nvim 0.12
:restart— redémarrer nvim sans quitter (réattache l'UI):lsp— nouvelle commande ;LspInfo,LspRestartetLspLogont disparuvim.pack.add { { src = 'https://...' } }— gestionnaire de plugins intégré (alternative à lazy.nvim)vim.o.autocomplete = true— autocomplétion native en insertion, sans plugincompleteopt = menu,menuone,noselect,popup— à régler avecautocomplete:Undotree;:Diff— plugins désormais fournis avec nvimvim.net.request();:edit https://...— requêtes HTTP natives- Code lens en lignes virtuelles, diagnostics de workspace — autres apports 0.12
Docker (auto-hébergement)#
docker ps -a;docker stats— conteneurs / consommation temps réeldocker logs -f --tail 100 nom— suivre les logsdocker exec -it nom bash— shell dans un conteneurdocker compose up -d;down— démarrer / arrêter une stackdocker compose pull && docker compose up -d— mettre à jour les imagesdocker compose logs -f service— logs d'un service de la stackdocker system df;docker system prune -a --volumes— espace utilisé / grand nettoyage (destructif)docker volume ls;docker inspect nom— volumes / configuration détailléedocker run --rm -it -v $PWD:/w -w /w image cmd— conteneur jetable sur le répertoire courantdocker image prune -f— supprimer les images orphelines
Infos système & dépannage#
uname -a;lsb_release -a;cat /etc/os-release— noyau et version de la distributionhostnamectl— résumé : OS, noyau, architecture, virtualisationlscpu;lsmem;free -h— CPU et mémoirelspci;lsusb;lsmod— matériel et modules noyausensors;uptime— températures / durée de fonctionnementsystemctl reboot;systemctl poweroff— redémarrer / éteindre proprementsudo update-alternatives --config editor— choisir l'outil par défautenv/printenv/export VAR=val— variables d'environnementecho $PATH;source ~/.bashrc— PATH / recharger la conf du shellls /etc/*release;dpkg --print-architecture— identifier précisément la machine- GRUB → Advanced options → recovery mode — récupération : console root, fsck, réinstallation de paquets
mount -o remount,rw /— repasser en écriture en mode secours
Fichiers & chemins à connaître#
/etc/fstab— montages permanents/etc/hosts;/etc/resolv.conf— résolution locale ; DNS (géré par resolved)/etc/ssh/sshd_config;~/.ssh/config— serveur SSH ; client SSH/etc/apt/sources.list.d/— dépôts de paquets/etc/systemd/system/— unités locales et overrides (prioritaires)/lib/systemd/system/— unités fournies par les paquets (ne pas éditer)/etc/netplan/*.yaml— configuration réseau Ubuntu/etc/crontab;/etc/cron.d/— tâches planifiées système/var/log/{syslog,auth.log,dpkg.log}— journaux principaux/etc/environment;~/.bashrc;~/.profile— variables et conf du shell/etc/sudoers.d/— droits sudo par fichier (éditer avecvisudo -f)/proc/cpuinfo;/proc/meminfo— infos noyau en temps réel/var/lib/docker/— images, volumes et conteneurs
Signaux, codes retour & rappels#
SIGTERM15 /SIGKILL9 /SIGHUP1 — arrêt propre / brutal / rechargement de confSIGINT2 (Ctrl+C) /SIGSTOP19 /SIGCONT18 — interruption / pause / repriseecho $?→ 0 succès ; toute valeur non nulle = échec- 126 / 127 / 130 — non exécutable / commande introuvable / Ctrl+C
- Toujours guillemeter
"$var"— sinon les espaces cassent tout - Tester avec
-n/--dry-run— rsync, apt, ufw et logrotate le proposent - Sauvegarder avant d'éditer une conf —
cp fichier fichier.bak-$(date +%F) - Vérifier la syntaxe avant reload —
sshd -t,nginx -t,visudo -c,netplan try - Ne jamais
rm -rfavec une variable vide —rm -rf "${dir:?}"/protège du pire
Index : à quoi sert cette commande ?#
Le trajet inverse du reste de la fiche : on croise une commande dans un tuto ou dans la sortie d'un agent, et on veut savoir ce qu'elle fait avant de l'exécuter.
alias— crée un raccourci de commandeapt/dpkg— gestionnaire de paquets / couche bas niveauat— exécute une commande une seule fois plus tardawk— traite du texte colonne par colonnebase64— encode/décode en base64basename/dirname— extrait le nom du fichier / le chemin du dossierbc— calculatrice en ligne de commandecal/date— calendrier / date et heurecat/tac— affiche un fichier / à l'enverschmod/chown— change les droits / le propriétairechroot— exécute dans une autre racine (dépannage)cmp/diff— compare octet par octet / ligne par lignecolumn— aligne du texte en colonnescp/mv/rm— copie / déplace / supprimecrontab— édite les tâches planifiéescurl/wget— requêtes HTTP / téléchargement de fichierscut/paste— découpe des colonnes / les recolledd— copie bloc à bloc (images disque, clés USB)df/du— espace libre par disque / poids des fichiersdig/nslookup— interroge le DNSdmesg— messages du noyau (matériel, OOM)echo/printf— affiche du texte / avec formatageenv/export— environnement / définit une variablefile— devine le type réel d'un fichierfind/locate— cherche des fichiers à la volée / via un indexfree/vmstat— mémoire / activité systèmefuser/lsof— qui utilise ce fichier ou ce portgetent— interroge les bases système (passwd, hosts)git— gestion de versionsgrep/rg— cherche un motif dans du textegzip/xz/zstd— compresse un fichier seulhead/tail— début / fin d'un fichierhostname/hostnamectl— nom de la machinehtop/top/btop— moniteur de processus interactifid/groups/whoami— identité et groupes de l'utilisateurip— adresses, routes, interfaces réseauiostat/iotop— activité disquejobs/fg/bg— gère les tâches du shelljournalctl— consulte les journaux systemdjq— manipule du JSONkill/pkill/killall— envoie un signal à un processusless/more— lit un fichier page par pageln— crée un lien (symbolique avec-s)logger— écrit dans le journal systèmels/tree— liste un répertoire / son arborescencelsblk/blkid/parted— disques, partitions, UUIDlscpu/lspci/lsusb/lsmod— matériel et modules du noyauman/tldr/apropos— documentation, exemples, recherchemd5sum/sha256sum— empreinte d'un fichiermkdir/rmdir— crée / supprime un répertoiremktemp— crée un fichier ou dossier temporaire de manière sûremount/umount— monte / démonte un système de fichiersmkfs/fsck/resize2fs— formate / vérifie / redimensionne un FSnano/vim— éditeurs de texte en terminalnc(netcat) /socat— teste ou relaie une connexion réseaunice/renice— ajuste la priorité CPUnl/wc— numérote les lignes / compte lignes, mots, octetsnohup/setsid/disown— détache un processus du terminalnproc/uptime— nombre de CPU logiques / charge et durée de marcheopenssl— certificats, chiffrement, tests TLSpasswd/chage— mot de passe et son expirationping/traceroute/mtr— teste et trace un chemin réseaups/pgrep— liste ou cherche des processuspv— affiche la progression d'un flux dans un pipepvs/vgs/lvs— volumes LVM (physiques, groupes, logiques)pwd/cd— répertoire courant / changer de répertoirereadlink/realpath— résout un chemin réelrename— renomme en masse avec une regexrsync— synchronise des fichiers, local ou distantscp/sftp— copie de fichiers via SSHsed— remplace ou supprime du texte par fluxseq/shuf— génère une suite / mélange des lignesshellcheck— analyse et corrige les scripts bashsleep/timeout/watch— attend / limite / répète une commandesort/uniq— trie / déduplique des lignessplit/csplit— découpe un gros fichierss/netstat— connexions et ports en écoutessh/ssh-keygen/ssh-copy-id— connexion distante et gestion des clésstat— métadonnées d'un fichier (dates, inode)strace/ltrace— trace les appels système d'un processussu/sudo— change d'utilisateur / exécute en rootsystemctl— pilote les services et unités systemdtar— crée et extrait des archivestee— écrit dans un fichier et sur la sortietime— mesure la durée d'exécutiontmux/screen— sessions terminal persistantestouch— crée un fichier vide ou change sa datetr— remplace ou supprime des caractèresufw/iptables/nft— pare-feuumask— droits par défaut des nouveaux fichiersuname/lsb_release— noyau / version de la distributionunzip/zip/7z— archives zipuseradd/usermod/adduser— gestion des compteswhich/type/command -v— localise une commandewho/w/last— sessions ouvertes et historiquexargs— construit des commandes depuis une listexxd/hexdump— affiche un fichier en hexadécimalyes— répond automatiquement à une invite
man, tldr et shellcheck restent les meilleurs compléments à cette fiche. Et en cas de doute sur une commande destructrice : --dry-run d'abord.
Si vous voulez le contexte — pourquoi j'ai eu besoin de construire ça après des années à « faire du Linux » — c'est dans cet article.