Accueil·Commandes du terminal

Répertoire des commandes du terminal

227 commandes avec les options qu’on utilise vraiment et un exemple pour chacune

⌨️ Les commandes et les options se tapent telles quelles : elles ne sont pas traduites, seules les explications suivent votre langue.

Fichiers et répertoires32

Déplacer, supprimer, trouver. Certains ne demandent pas confirmation, et c’est pour ça que -i devient un réflexe.

lsListe le contenu d'un répertoire ; les noms commençant par un point n'apparaissent qu'avec -a.cdChange le répertoire courant du shell ; c'est une commande interne, donc un cd dans un script ou un sous-shell ne déplace pas votre shell.pwdAffiche le répertoire courant ; si vous y êtes entré par un lien symbolique, c'est le chemin du lien qui s'affiche, et seul -P donne le vrai.mkdirCrée un répertoire ; sans -p il échoue si un parent manque comme s'il existe déjà.rmdirSupprime un répertoire seulement s'il est vide ; le moindre contenu le fait refuser, d'où le recours à rm -r.rmSupprime définitivement des fichiers : pas de corbeille, et une espace de trop dans rm -rf efface ce qu'il ne fallait pas.cpCopie des fichiers ou des arborescences ; selon que la destination existe déjà, la source prend ce nom ou se place à l'intérieur.mvRenomme ou déplace ; sans -i ni -n, la cible est écrasée sans un mot.touchMet les horodatages d'un fichier à maintenant et le crée vide s'il manque ; il ne touche jamais au contenu.catAffiche les fichiers l'un après l'autre ; tout sort d'un coup, donc un fichier long appelle less et cat file | grep comporte un tube inutile.lessParcourt un fichier écran par écran sans tout charger ; / cherche, q quitte, et contrairement à more il ne se ferme pas tout seul à la fin.headAffiche le début d'un fichier ; avec plusieurs fichiers, il insère un en-tête pour chacun sauf avec -q.tailAffiche la fin d'un fichier et continue de le suivre avec -f ; seul -F le réouvre après une rotation de journal.findParcourt une arborescence en testant chaque entrée ; mettez le motif entre guillemets, -name '*.log', sinon le shell l'étend avant find.locateInterroge un index déjà construit plutôt que le disque : instantané, mais aveugle aux fichiers créés depuis le dernier updatedb.treeDessine l'arborescence sous forme d'arbre indenté ; il n'est pas installé par défaut sur macOS ni sur les images Linux minimales.duAdditionne l'espace disque réellement occupé ; il compte des blocs alloués, donc son total diffère de la somme des tailles et de df.dfIndique l'espace utilisé et libre par système de fichiers ; un disque peut manquer d'inodes alors qu'il reste des octets, et seul df -i le montre.lnDonne un autre nom à un fichier ; un lien symbolique créé avec -s peut viser n'importe où mais casse si la cible bouge, et une cible relative se lit depuis le répertoire du lien.statAffiche l'enregistrement de l'inode : taille, droits, propriétaire et les trois horodatages ; le format est -c sous GNU et -f sous BSD, où le -f de GNU désigne tout autre chose.fileDétermine le type d'un fichier d'après son contenu et non son nom ; il ignore l'extension, ce qui démasque un .jpg qui est en fait un PDF.basenameRetire la partie répertoire d'un chemin et peut aussi ôter un suffixe ; ce n'est que du texte, il ne vérifie jamais l'existence du fichier.dirnameNe garde que la partie répertoire du chemin ; sans barre oblique la réponse est un simple point, et comme basename il ne traite que du texte.realpathTransforme n'importe quel chemin en un chemin absolu, liens et points résolus ; sur macOS c'est la version BSD, donc les options GNU comme --relative-to manquent.rsyncNe transfère que les différences entre deux arborescences, en local ou via ssh ; une barre finale sur la source désigne son contenu, sans elle le répertoire descend d'un niveau.mountRattache un système de fichiers à un répertoire ; ce qui se trouvait dans le point de montage est masqué, pas supprimé, et revient au démontage.umountDémonte un système de fichiers ; le nom ne contient pas de n, et il refuse avec device is busy tant qu'un processus y garde un fichier ouvert ou son répertoire courant.readlinkAffiche la cible d'un lien symbolique, un seul saut sauf avec -f ; sur un fichier qui n'est pas un lien, il n'affiche rien et sort en erreur.mktempCrée un fichier ou un répertoire temporaire au nom imprévisible et affiche son chemin ; il ne nettoie pas derrière lui, associez-le à un trap en sortie.sha256sumAffiche l'empreinte SHA-256 d'un fichier pour vérifier qu'un téléchargement est intact ; une empreinte identique prouve que les octets concordent, pas que la source est fiable.truncateFixe exactement la taille d'un fichier : l'agrandir ne crée qu'un trou creux sans réserver d'espace, et le réduire jette la fin sans avertissement.shredRéécrit les octets avant de supprimer, mais sur SSD et sur les systèmes copy-on-write comme btrfs ou APFS les anciens blocs peuvent survivre : la vraie réponse est le chiffrement du disque.

Traitement de texte32

Ils sont faits pour être chaînés avec des tubes. Trois commandes reliées sont souvent plus courtes qu’une seule qui fait tout.

grepExtrait les lignes correspondant à un motif ; il lit du regex basique par défaut, donc + ? | et () exigent -E ou un antislash.sedModifie le texte ligne par ligne, surtout avec s/old/new/ ; le -i sur place diffère entre GNU et BSD, et sans g final seule la première occurrence de chaque ligne change.awkDécoupe chaque ligne en champs et y exécute un petit programme ; $0 est la ligne entière et $1 le premier champ, et le séparateur par défaut est toute suite d'espaces, pas une seule.sortTrie des lignes ; sans -n la comparaison est textuelle, donc 10 précède 9, et la locale fixe l'ordre à moins de préfixer par LC_ALL=C.uniqNe fusionne que les lignes identiques voisines, pas les doublons dispersés dans le fichier, d'où son usage quasi systématique après sort.wcCompte lignes, mots et octets ; -l compte les sauts de ligne, donc une dernière ligne sans saut n'est pas comptée.cutDécoupe des champs fixes ou des positions de caractères ; le délimiteur est un seul caractère et les répétitions ne sont pas fusionnées, donc les colonnes alignées par espaces relèvent d'awk.pasteColle des fichiers côte à côte avec une tabulation entre eux ; contrairement à join, il apparie par position sans regarder le contenu.trRemplace ou supprime des caractères un à un ; il ne lit que l'entrée standard, donc un nom de fichier en argument échoue : redirigez avec < ou passez par un tube.joinJoint deux fichiers sur un champ commun comme un join de base de données ; les deux doivent déjà être triés sur ce champ, sinon des lignes disparaissent sans un mot.commCompare deux fichiers triés et affiche trois colonnes : seulement à gauche, seulement à droite, dans les deux ; une entrée non triée donne n'importe quoi, et les options masquent des colonnes au lieu de les choisir.diffMontre ce qui a changé entre deux fichiers ; le format unifié -u est celui qu'attendent patch et la revue de code, et le code de sortie vaut 1 en cas de différence, ce qui arrête un script sous set -e.patchApplique un diff aux fichiers réels ; -p décide combien de composants de chemin sont retirés, et un diff git exige -p1 à cause de ses préfixes a/ et b/.teeCopie son entrée dans un fichier et vers l'écran en même temps ; c'est ainsi qu'on écrit dans un fichier appartenant à root, car dans sudo cmd > file la redirection est ouverte par votre propre shell.xargsTransforme les lignes reçues en arguments d'une autre commande ; les noms contenant des espaces cassent tout, sauf si les deux côtés utilisent NUL, soit find -print0 avec xargs -0.echoAffiche ses arguments suivis d'un saut de ligne ; -e et le traitement des antislashs varient selon le shell, donc printf est le choix portable.printfMet en forme du texte selon un modèle, comme le printf de C ; il n'ajoute aucun saut de ligne et réutilise le modèle tant qu'il reste des arguments.jqFiltre et remodèle du JSON avec son petit langage propre ; il n'est souvent pas installé par défaut, et c'est -r qui retire les guillemets des chaînes.columnComplète les champs pour aligner les colonnes comme un tableau ; les séparateurs répétés comptent pour un, donc un CSV à cellules vides se décale.foldCoupe les lignes longues à une largeur fixe en insérant de vrais sauts de ligne ; sans -s il tranche au milieu des mots et, contrairement au retour visuel du terminal, il modifie le contenu.nlNumérote les lignes en les affichant ; par défaut il ignore les lignes vides, d'où l'écart avec l'éditeur jusqu'à ce que vous passiez -b a.revInverse les caractères de chaque ligne, pas l'ordre des lignes : cela, c'est le rôle de tac.splitDécoupe un fichier en morceaux ; la ligne d'en-tête ne reste que dans le premier, et les noms finissent en aa, ab sauf avec -d pour des chiffres.csplitDécoupe un fichier là où un motif apparaît plutôt qu'à taille fixe ; les nombres affichés sont des octets, et {*} signifie répéter autant de fois que ça correspond.expandConvertit les tabulations en espaces ; un Makefile a besoin de vraies tabulations, donc lui appliquer expand casse la compilation.shufSort les lignes dans un ordre aléatoire ; il vient de GNU coreutils et manque sur macOS, où le remplaçant sort -R regroupe les lignes identiques.tacAffiche les lignes d'un fichier de la dernière à la première ; c'est du GNU coreutils, sur macOS on prend tail -r, et ce n'est pas rev, qui inverse les caractères.stringsExtrait le texte imprimable d'un binaire ; il attrape tout ce qui ressemble à du texte, donc l'essentiel du résultat est fortuit.iconvConvertit un texte d'un encodage à un autre ; il s'arrête au premier octet non convertible sauf avec -c, et il ne devine pas l'encodage d'entrée.vimUn éditeur modal : taper ne fait rien avant d'appuyer sur i, et on sort avec Esc puis :wq pour enregistrer ou :q! pour abandonner.nanoUn éditeur plein écran simple dont les commandes s'affichent en bas ; le caret de ^O et ^X signifie Ctrl, pas le caractère lui-même.base64Transforme des octets en texte ASCII et inversement pour faire passer du binaire dans un canal texte ; c'est un encodage, pas un chiffrement, et le décodage s'écrit -d sous GNU mais -D sur macOS ancien.

git45

Ce qui embrouille, c’est qu’annuler a plusieurs formes : déplacer là où pointe une branche n’est pas ajouter un commit qui l’inverse.

git initTransforme un dossier en nouveau dépôt git ; init seul ne suit aucun fichier, il faut encore add et commit.git cloneCopie un dépôt distant avec son historique ; un clone --depth 1 n'a ni anciens commits ni autres branches, d'où --unshallow plus tard.git configLit et écrit la configuration de git ; sans --global, seul ce dépôt est concerné, un nouveau clone l'ignore donc.git init --bareCrée un dépôt sans copie de travail, uniquement destiné à recevoir des push ; on n'y édite pas de fichiers, mais aucun push n'est refusé à cause de la branche active.git addIndexe le fichier tel qu'il est à cet instant ; si vous le modifiez après le add, cette modification reste dehors et il faut refaire add.git commitEnregistre ce qui est indexé en un commit ; -a ne prend que les fichiers déjà suivis, les nouveaux restent dehors.git statusMontre ce qui est indexé, modifié ou non suivi ; les fichiers non suivis sont regroupés par dossier sans -uall.git diffN'affiche que les modifications non encore indexées : après un git add, cela paraît vide, il faut alors --staged.git logListe l'historique du plus récent au plus ancien, mais seulement les ancêtres du HEAD courant : les autres branches exigent --all.git showAffiche un commit avec son message et son diff ; la forme <commit>:<chemin> extrait une ancienne version du fichier sans toucher à la copie de travail.git blameAttribue à chaque ligne le commit qui l'a modifiée en dernier ; un simple reformatage masque le véritable auteur, d'où -w et --ignore-rev.git branchListe, crée et supprime des branches en local ; la supprimer ne touche pas le distant, le serveur exige git push origin --delete.git checkoutL'ancienne commande qui change de branche et restaure des fichiers, scindée en switch et restore dans git 2.23 ; checkout -- <fichier> efface définitivement les modifications non commitées.git switchLa commande de git 2.23 qui ne fait que changer de branche ; elle ne réécrit jamais le contenu des fichiers, c'est le rôle de restore.git restoreLa commande de git 2.23 qui restaure le contenu des fichiers ; par défaut elle écrase votre fichier et les modifications non commitées disparaissent, alors que --staged se contente de désindexer.git mergeIntègre le travail d'une autre branche dans la branche courante ; --squash n'enregistre aucune fusion, git considère donc toujours cette branche comme non fusionnée.git rebaseRejoue vos commits sur une nouvelle base ; les hachages changent, donc ne rebasez jamais une branche déjà récupérée par d'autres : utilisez merge.git resetDéplace le pointeur de branche sur un autre commit : --soft garde tout indexé, --mixed (par défaut) vide aussi l'index mais laisse vos modifications dans les fichiers, et --hard les détruit également, sans retour.git revertAnnule un commit en ajoutant un commit inverse ; l'historique reste intact, contrairement à reset qui déplace le pointeur, donc ce qui est déjà poussé se défait avec revert.git cherry-pickCopie un seul commit sur la branche courante sous un nouveau hachage ; fusionner cette branche plus tard peut donc faire apparaître deux fois la même modification.git stashMet de côté vos modifications en cours et rend l'arbre propre ; les fichiers non suivis restent sauf avec -u, et pop supprime l'entrée là où apply la conserve.git cleanSupprime les fichiers non suivis, dont git n'a jamais eu de copie : rien ne revient ; -fdx efface aussi les fichiers ignorés comme un .env local, faites d'abord -n.git remoteGère les noms et les URL des dépôts distants ; il ne fait que les noter, rien ne circule avant un fetch ou un push.git fetchTélécharge les nouveaux commits sans toucher à vos fichiers ni à votre branche : un merge ou un rebase doit suivre, et les branches supprimées côté serveur subsistent jusqu'à --prune.git pullEnchaîne fetch et merge, d'où les commits de fusion inattendus ; --rebase ou --ff-only les évite.git pushEnvoie vos commits vers un dépôt distant ; --force écrase la branche distante et peut effacer les commits des autres, préférez --force-with-lease, qui refuse si le distant a bougé.git tagAttache à un commit un nom, par exemple une version ; un git push ordinaire n'emporte pas les étiquettes, il faut pousser l'étiquette par son nom.git rmRetire un fichier de l'index et du disque ; --cached conserve le fichier et cesse seulement de le suivre, mais l'ancien contenu reste dans l'historique, donc un secret fuité y demeure.git mvDéplace un fichier et indexe le changement d'un coup ; git n'enregistre pas les renommages, il les déduit du contenu, donc un changement de casse seul exige -f sous macOS et Windows.git ls-filesListe les chemins de l'index et non du disque, ce qui en fait la liste fiable pour un script ; -i ne s'emploie pas seul et réclame -c ou -o avec --exclude-standard.git update-indexModifie l'index directement ; ces marques restent locales et ne sont jamais poussées, et celle qui préserve vos modifications d'un fichier de configuration suivi est --skip-worktree, pas --assume-unchanged.git sparse-checkoutApparue dans git 2.25, elle ne garde sur le disque que les répertoires nommés ; l'historique reste entier et le mode cone attend des noms de répertoires, pas des motifs glob.git reflogConserve toutes les positions passées de HEAD et de vos branches : c'est là que réapparaissent les commits perdus par reset --hard ou par une branche supprimée ; les entrées expirent au bout de 90 jours et n'existent que sur votre machine.git bisectCoupe en deux l'intervalle de commits pour trouver le premier fautif ; il faut conclure par git bisect reset, sinon vous restez sur un commit détaché.git describeNomme le commit courant à partir de l'étiquette la plus proche, sous la forme v1.2.0-5-gabc1234 ; par défaut il ne voit que les étiquettes annotées, les légères exigent --tags et un dépôt sans étiquette exige --always.git rev-parseTraduit un nom comme HEAD ou v1.2.0^ en véritable hachage et indique où se trouve le dépôt ; les scripts récupèrent le nom de branche avec --abbrev-ref HEAD, et hors d'un dépôt la commande échoue.git fsckVérifie la base d'objets et liste les commits que rien ne référence : le second moyen de retrouver un travail perdu après un reset quand le reflog a expiré ; il signale, il ne répare pas.git gcCompacte les objets épars et supprime les inaccessibles pour réduire .git ; --prune=now jette aussi les commits que retenait le reflog, ce qui supprime le filet de sécurité pour annuler un reset.git archiveExporte les fichiers d'un commit en tar ou zip ; .git et les fichiers non suivis sont exclus, ce qui donne une archive de version plus propre qu'un zip du dossier.git applyApplique un fichier diff à votre copie de travail ; il ne crée aucun commit et ignore l'auteur inscrit dans le correctif, les correctifs reçus par courriel relèvent donc de am.git amTransforme des correctifs reçus par courriel en commits en conservant auteur et message ; en cas d'échec il s'arrête au milieu de la série, à vous de conclure par --continue, --skip ou --abort.git format-patchÉcrit un fichier .patch au format courriel par commit ; format-patch main désigne les commits postérieurs à main, pas main lui-même.git shortlogRegroupe les commits par auteur et les compte, pratique pour des notes de version ; une même personne avec deux adresses compte deux fois sans un .mailmap pour les fusionner.git worktreeExtrait un second dossier de travail du même dépôt pour mener deux branches en parallèle sans recloner ; une même branche ne peut pas être extraite deux fois, et supprimer le dossier à la main laisse une entrée jusqu'au prune.git submoduleÉpingle un autre dépôt à un commit précis dans le vôtre ; un clone ordinaire laisse le dossier vide jusqu'à update --init, et le parent suit un commit, pas une branche.

Processus et système36

Ce qui tourne et ce qui mange la machine. Identifier vient avant tuer.

psPrend un instantane des processus en cours ; `ps aux` est la forme BSD sans tiret et `ps -ef` la forme POSIX, et melanger les deux est l'erreur classique.topRedessine la liste des processus toutes les quelques secondes ; ses options diffèrent totalement selon la plateforme : un seul releve s'obtient avec `-b -n 1` sous Linux et `-l 1` sous macOS.htopUne reecriture de top en couleurs et compatible souris, ou F9 envoie directement un signal, mais elle n'est pas installee par defaut : `apt install htop` ou `brew install htop` d'abord.killEnvoie un signal a un PID pour arreter un processus ; le TERM par defaut lui laisse le temps de faire le menage, alors que `-9` ne peut pas etre intercepte et laisse fichiers ouverts et verrous derriere lui.killallTue les processus par leur nom plutot que par PID ; le nom doit correspondre exactement a l'executable, si bien que `killall chrome` rate un processus nomme "Google Chrome".pkillTue tous les processus correspondant a un motif ; sans `-f`, seul le nom est compare, et un motif trop large emporte plus que prevu : lancez d'abord pgrep avec le meme motif.pgrepN'affiche que les PID correspondant a un motif, selon les memes regles que pkill : c'est le test a blanc a faire avant de tuer quoi que ce soit.jobsUne commande interne au shell qui numerote uniquement les taches d'arriere-plan de ce shell : celles d'un autre terminal n'apparaissent jamais et on les designe par `%1`, pas par PID.bgReprend en arriere-plan une tache arretee par Ctrl+Z ; elle appartient toujours a ce shell, donc fermer le terminal l'emporte, sauf avec nohup ou disown.fgRamene au premier plan une tache d'arriere-plan ou arretee ; ne fonctionne que pour les taches de ce shell, designees par un numero comme `%1` et non par un PID.nohupFait ignorer le signal de raccrochage a une commande pour qu'elle survive a la deconnexion ; elle n'est pas mise en arriere-plan pour autant, le `&` reste a votre charge, et la sortie s'accumule discretement dans ./nohup.out.niceLance une commande avec une priorite CPU plus faible ; la valeur va de 19 (le plus cedant) a -20 (le plus gourmand), les valeurs negatives exigent root, et cela n'agit que sur le CPU, pas sur le disque (c'est ionice).reniceModifie la priorite d'un processus deja lance ; un utilisateur ordinaire ne peut que le rendre plus cedant, et revenir en arriere demande root.systemctlDemarre, arrete et inspecte les services systemd ; `enable` ne regle que le demarrage au boot, utilisez donc `enable --now` pour lancer aussi, et lancez `daemon-reload` apres avoir modifie un fichier unit.journalctlLit le journal binaire que systemd collecte ; sans /var/log/journal il est effacé au redemarrage, et `-u` exige le nom exact de l'unite.serviceUne fine surcouche heritee de l'epoque SysV ; sur une machine systemd, elle se contente de transmettre a systemctl et comprend moins de verbes.crontabGere la table de taches propre a chaque utilisateur ; cron s'execute avec un PATH quasi vide et ne lit jamais votre profil de connexion, donc ecrivez des chemins absolus, et `crontab -r` efface toute la table sans demander.atExecute une commande une seule fois a l'heure indiquee ; le demon atd doit tourner (souvent il n'est meme pas installe) et la sortie arrive par courrier, pas a l'ecran.uptimeIndique depuis combien de temps la machine tourne et la charge moyenne ; ces trois nombres sont des processus pret a s'executer moyennes sur 1, 5 et 15 minutes, pas des pourcentages : 4.00 sur 4 coeurs signifie pleine charge.freeCompte la memoire et le swap restants sous Linux ; la colonne a lire est available et non free, car le cache est rendu au besoin, et macOS n'a pas free du tout (utilisez vm_stat).vmstatAffiche a intervalle fixe les compteurs memoire, swap, disque et CPU ; jetez la premiere ligne, qui est une moyenne depuis le demarrage et non l'instant present, et regardez d'abord les colonnes si/so et wa.iostatMontre le debit par disque et le temps d'attente des requetes ; le premier bloc est une moyenne depuis le demarrage, Linux exige le paquet sysstat, et macOS emploie d'autres options comme `-w 1 -c 5`.lsblkPresente les disques et leurs partitions sous forme d'arbre ; il n'affiche pas l'espace libre non partitionne (c'est fdisk ou parted) et n'existe que sous Linux, macOS utilisant `diskutil list`.unameDonne le nom du noyau, sa version et l'architecture de la machine ; il ne dit pas la distribution, pour cela lisez /etc/os-release (ou `sw_vers` sous macOS), et `-o` n'existe que chez GNU.hostnameAffiche ou definit le nom de la machine ; `hostname web01` ne tient que jusqu'au redemarrage, rendez-le permanent avec `hostnamectl` sous Linux ou `scutil --set HostName` sous macOS, et `-I` qui liste toutes les IP n'existe que sous Linux.dateAffiche l'heure actuelle dans le format voulu et fait du calcul de dates ; le format apres `+` est identique partout, mais decaler une date s'ecrit `-d` chez GNU et `-v` ou `-j -f` sous macOS/BSD.envAffiche tout l'environnement, ou lance une commande avec des variables supplementaires ; celles-ci ne valent que pour cette execution et ne laissent rien dans votre shell.exportMarque une variable pour que les processus enfants en heritent ; elle meurt avec ce shell, mettez-la donc dans ~/.bashrc ou ~/.zshrc pour la conserver, et un simple `VAR=x` sans export reste invisible aux programmes lances.whichParcourt PATH et indique ou se trouve l'executable de ce nom ; comme il ne regarde que PATH, il ment sur les alias, les fonctions et les commandes internes, et la reponse honnete vient de `type -a` ou `command -v`.typeDemande au shell lui-meme ce qu'est vraiment un nom : alias, fonction, commande interne ou fichier, exactement ce que `which` ne peut pas voir puisqu'il ne regarde que PATH.lsofListe tous les fichiers et sockets ouverts, ce qui repond a la question "qui occupe le port 3000" ; sans sudo vous ne voyez que vos propres processus, donc un resultat vide ne prouve pas que le port est libre.fuserTrouve, et tue si vous le demandez, ce qui utilise un fichier, un point de montage ou un port ; `-k` envoie SIGKILL sans laisser le temps de faire le menage et n'existe que sous Linux (psmisc), la version macOS ne connaissant que `-cfu`.watchRelance la meme commande toutes les quelques secondes et redessine l'ecran ; mettez entre guillemets tout ce qui contient un tube ou un `*`, sinon le shell l'applique une seule fois a watch lui-meme, et macOS ne le fournit pas.timeoutExecute une commande avec une limite de temps et la coupe au depassement, en sortant avec 124 ; le signal par defaut est TERM, qu'un programme bloque peut ignorer, ajoutez donc `-k` pour enchainer avec KILL (GNU coreutils, absent de macOS).straceAffiche chaque appel systeme d'un processus, ce qui montre ou il se bloque ; la sortie part sur stderr, redirigez-la avec `2>&1`, il faut le droit ptrace (generalement sudo) et cela n'existe que sous Linux (macOS a dtruss).dmesgLit le tampon circulaire du noyau, le premier endroit a consulter apres un incident disque ou USB ; sa taille est fixe, donc les lignes anciennes ont deja disparu, et la plupart des distributions exigent root (macOS utilise `log show`).

Réseau28

Quand une connexion échoue, ceux-ci délimitent jusqu’où elle est allée : le nom ne se résout pas, pas de route, ou le port est fermé.

curlRecupere une URL et affiche le corps dans le terminal ; contrairement a un navigateur, il ne suit pas les redirections sans `-L`, si bien qu'un 301 ressemble a une reponse vide.wgetTelecharge une URL dans un fichier et suit les redirections de lui-meme ; c'est la difference avec curl, qui ecrit dans le terminal sauf indication contraire, et macOS ne le fournit pas.pingEnvoie des requetes ICMP echo pour voir si un hote repond et en combien de temps ; l'absence de reponse ne signifie pas qu'il est en panne, car beaucoup de pare-feu jettent l'ICMP alors que le TCP fonctionne.tracerouteEnumere les routeurs traverses par un paquet jusqu'a la destination ; une ligne `* * *` au milieu ne veut pas dire que le chemin est coupe, seulement que ce routeur refuse de repondre.digInterroge directement un serveur DNS et montre les enregistrements tels quels ; il contourne /etc/hosts et le cache du systeme, la reponse peut donc differer de celle du navigateur, et certaines distributions exigent d'installer dnsutils ou bind-utils.nslookupL'ancien outil de resolution de noms : il fonctionne encore, mais son format de sortie et son code de retour sont trop irreguliers pour un script, et dig a pris sa place.hostRepond a une requete de nom en deux ou trois lignes donnant adresses et serveurs de courrier ; c'est le plus pratique pour une verification rapide, mais pour voir tous les enregistrements il faut dig.ssLa facon moderne de lister les sockets ouverts sous Linux, successeur de netstat et bien plus rapide sur une machine chargee ; attention, `-p` ne revele le processus proprietaire qu'en root.netstatL'ancienne facon de voir les sockets et la table de routage ; sous Linux ss a pris le relais et il n'est souvent meme pas installe, et bien que macOS le conserve, il ne dit pas quel processus possede un socket : c'est lsof qui repond.ipLa commande Linux unique pour les adresses, les routes et la table de voisins, qui remplace ifconfig, route et arp ; tout changement fait avec elle disparait au redemarrage, sauf s'il est aussi ecrit dans la configuration reseau.ifconfigL'ancienne commande pour consulter et modifier les interfaces reseau ; sous Linux `ip addr` l'a remplacee, elle n'est parfois pas installee et n'affiche pas toutes les adresses ajoutees par ip — sous macOS, en revanche, elle reste l'outil de reference.routeLit et modifie la table de routage du noyau, mais sous Linux `ip route` a pris la suite, et sous BSD/macOS la syntaxe est tout autre, comme `route -n get default` : les exemples ne se transposent pas.arpAffiche la table des adresses MAC des voisins du meme reseau local ; rien au-dela du routeur n'y figure, et sous Linux l'outil actuel est `ip neigh`.nc (netcat)Ouvre une connexion TCP ou UDP brute pour voir si un port repond et fait passer des octets entre deux machines ; trois netcat incompatibles portent le meme nom (OpenBSD, GNU, ncat de Nmap), donc `-z` ou `-p` peut tout simplement ne pas exister chez vous.telnetOuvre une session TCP en clair ou tout circule sans chiffrement : ne l'utilisez jamais pour vous connecter (c'est le role de ssh) ; son seul usage restant est de verifier si un port repond, et on en sort par Ctrl+] puis quit.sshOuvre un shell chiffre sur une autre machine ; ssh refuse categoriquement une cle privee lisible par autrui, faites-lui donc `chmod 600`, et le port s'ecrit `-p` ici mais `-P` avec scp et sftp.ssh-keygenCree une paire de cles publique et privee ; seule la moitie `.pub` va sur un serveur, et une cle creee sans phrase secrete est un simple fichier avec lequel quiconque le copie peut se connecter.ssh-copy-idAjoute votre cle publique au ~/.ssh/authorized_keys du serveur pour qu'il cesse de demander un mot de passe ; la connexion par mot de passe doit encore etre ouverte pour cette premiere fois, et `-i` attend le fichier `.pub`, pas la cle privee.sftpUn outil interactif de transfert de fichiers porte par la connexion ssh ; l'option de port est un `-P` majuscule et non le `-p` de ssh, et il n'execute pas de commandes distantes : seulement ses propres put, get et ls.scpCopie des fichiers via ssh en une seule fois ; le port est un `-P` majuscule, le chemin distant exige deux-points, et pour du volumineux ou du repete rsync vaut mieux car il saute l'inchange et reprend.iptablesModifie le filtre de paquets en cours ; les regles sont examinees de haut en bas et la premiere qui correspond gagne, donc un DROP ajoute apres un ACCEPT ne se declenche jamais, les regles disparaissent au redemarrage si elles ne sont pas sauvegardees, et passer la politique par defaut a DROP avant d'autoriser le port 22 vous enferme dehors sur une machine distante.ufwUne surcouche conviviale d'iptables sous Debian et Ubuntu ; autorisez SSH avant de faire `enable`, sinon vous coupez la session ou vous vous trouvez, et Docker publie ses ports directement dans iptables, hors de portee des regles ufw.tcpdumpCapture les paquets qui passent sur le fil ; il faut root, ce qu'on capture s'ecrit apres les options dans sa propre syntaxe de filtre comme `port 443 and host x`, et capturer sans filtre sur une interface chargee ensevelit le terminal instantanement.whoisInterroge l'enregistrement d'un domaine ou d'un bloc d'adresses ; les champs personnels sont desormais souvent masques et chaque serveur de TLD met en forme sa reponse a sa facon, si bien qu'analyser cette sortie dans un script casse vite.nmapBalaye un hote pour voir quels ports repondent ; `-sS` et `-O` exigent root, et scanner une machine qui ne vous appartient pas est consigne comme une attaque dans ses journaux et illegal dans certains pays : restez sur vos propres reseaux.openssl s_clientOuvre une connexion TLS brute pour inspecter le certificat et la poignee de main ; sans `-servername`, un serveur qui heberge plusieurs sites sur une adresse vous renvoie son certificat par defaut, et sans `< /dev/null` il reste a attendre une saisie.speedtestMesure le debit de la ligne en envoyant du trafic reel vers un serveur proche ; il n'est preinstalle sur aucun systeme, et deux programmes differents portent le meme nom (le speedtest d'Ookla et le speedtest-cli en Python) avec des options distinctes.mtrFusionne traceroute et ping dans un tableau mis a jour en continu, l'outil qu'il faut pour les pertes intermittentes ; une perte a un saut intermediaire est le plus souvent ce routeur qui limite ses reponses, et seule celle qui persiste jusqu'au dernier saut est reelle.

Archives14

Regrouper et compresser sont deux gestes : tar regroupe, gzip réduit, et .tar.gz fait les deux.

tarNe fait que regrouper des fichiers dans une seule archive sans compresser lui-même : ce sont `-z` (gzip), `-j` (bzip2) et `-J` (xz) qui s’en chargent ; on choisit exactement un mode parmi `-c` pour créer, `-x` pour extraire ou `-t` pour lister, et `-f` reste la dernière option, le nom de l’archive venant juste après.gzipCompresse un seul fichier en .gz et supprime l’original par défaut dès que l’opération réussit : gardez-le avec `-k` ou en écrivant sur la sortie standard avec `-c` ; il ne regroupe jamais plusieurs fichiers, d’où la présence de tar en amont.gunzipDécompresse un .gz vers le fichier d’origine et supprime le .gz en cas de succès : `-k` le conserve, `-f` devient nécessaire si un fichier du même nom existe déjà, et `-c` envoie le contenu sur la sortie standard sans rien écrire sur le disque, exactement comme zcat.zipContrairement à tar, il embarque sa propre compression et c’est le format qu’une machine Windows ouvre sans rien installer ; un répertoire exige `-r`, sinon vous n’archivez que l’entrée du dossier et rien de son contenu, et le mot de passe de `-e` repose sur l’ancien ZipCrypto, qui est faible.unzipExtrait une archive .zip et, sans `-d`, la déverse directement dans le répertoire courant : regardez d’abord avec `-l` si elle contient un dossier racine ; les noms issus d’anciens zips Windows exigent `-O CP932`, et un mot de passe passé par `-P` reste visible dans l’historique du shell et dans ps.bzip2Compresse plus fort que gzip mais met plus de temps et, comme gzip, supprime l’original pour ne laisser que le .bz2 si l’on omet `-k` ; dans tar l’option correspondante est `-j`, et la décompression se fait avec `-d`, ce que fait bunzip2.xzProduit la plus petite sortie des trois formats courants, au prix de la lenteur et d’environ 700 Mo de mémoire au niveau `-9` ; il reste monothread sans `-T0`, efface l’original sans `-k`, et son option dans tar est le `-J` majuscule.zcatEnvoie le contenu d’un .gz sur la sortie standard sans jamais le décompresser sur le disque, ce qui permet de grepper un journal déjà tourné tel quel ; `-f` laisse passer aussi les fichiers non compressés dans la même passe, et bzip2, xz et zstd ont leurs propres bzcat, xzcat et zstdcat.7zS’emploie avec un verbe en tête — `a` pour ajouter, `x` pour extraire avec les chemins, `e` pour les aplatir, `l` pour lister —, lit bien plus que le .7z, y compris zip, tar et rar, et compresse plus fort que la plupart ; le dossier de sortie s’écrit collé à `-o`, sans espace, et c’est `-mhe=on` ajouté à `-p` qui masque aussi les noms de fichiers.ddCopie bloc par bloc, et c’est ainsi qu’on écrit une image d’installation sur un périphérique ; ce que vous nommez dans `of=` est écrasé depuis le bloc zéro, sans confirmation et sans retour possible, alors vérifiez le périphérique avec lsblk juste avant d’appuyer sur Entrée, prenez `bs=4M` pour la vitesse et `status=progress` (Ctrl+T sous macOS) pour suivre.splitDécoupe un gros fichier en morceaux ; par défaut la coupe se fait par lignes, 1000 à la fois, donc écrivez `-b 100M` si vous pensiez à une taille ; sans préfixe les morceaux s’appellent xaa, xab, etc., et un seul `cat part_* > file` les recolle, ce qui ne marche que parce que les suffixes se trient dans l’ordre.cpioUn archiveur ancien qui prend sur l’entrée standard la liste des noms à empaqueter, d’où le find qui l’alimente presque toujours ; `-o` écrit une archive, `-i` en extrait une, `-t` la liste, `-H newc` est le format portable des images initramfs, et `--no-absolute-filenames` empêche une archive venue d’ailleurs d’écrire dans des chemins absolus.zstdLe moderne : il atteint la taille de gzip plusieurs fois plus vite et, en `-19`, s’approche de celle de xz en une fraction du temps de xz ; contrairement à gzip il conserve le fichier source par défaut (`--rm` le supprime), `-T0` exploite tous les cœurs, et tar l’appelle avec `--zstd`.rarUn format propriétaire dont seule l’extraction est gratuite : créer une archive exige le binaire rar payant, alors que `unrar x` — ou `7z x`, sans rien installer de chez RARLAB — ouvre celle qu’on vous a envoyée ; `x` conserve les chemins enregistrés, `e` les aplatit, `-hp` masque aussi les noms de fichiers et `-v100m` découpe en volumes.

Droits15

Le mode numérique et le mode symbolique désignent la même chose : 755 et u=rwx,go=rx sont le même droit.

chmodFixe les bits de permission des fichiers et répertoires ; chmod -R 755 rend aussi les fichiers ordinaires exécutables, d'où l'emploi du X majuscule pour les épargner.chownChange le propriétaire et le groupe d'un fichier ; seul root peut céder un fichier à autrui, d'où le recours quasi systématique à sudo.chgrpChange seulement le groupe d'un fichier, ce que chown fait aussi avec :group ; sans être root, vous ne pouvez attribuer qu'un groupe dont vous êtes membre.umaskDétermine quels bits de permission sont retirés aux nouveaux fichiers ; elle soustrait au lieu d'accorder, donc 022 donne 644 pour les fichiers et 755 pour les répertoires, et ne touche pas à l'existant.sudoExécute une commande en tant qu'un autre utilisateur, root par défaut ; la redirection de sudo cmd > file est ouverte par votre shell, elle échoue donc sur un fichier de root, où tee prend le relais.suDevient un autre utilisateur avec le mot de passe de celui-ci, à l'inverse de sudo qui demande le vôtre ; sans le tiret vous gardez votre PATH, cause habituelle de command not found.idAffiche les identifiants d'utilisateur et de groupe d'un processus ; id -u qui renvoie 0 signifie root, la façon standard pour un script de vérifier les droits.groupsÉnumère les groupes d'un utilisateur ; un groupe ajouté à l'instant par usermod n'apparaît qu'à la prochaine connexion, car la liste est figée à l'ouverture de session.whoamiAffiche le nom d'utilisateur effectif et non celui de connexion, donc sous sudo ou su il indique root.passwdChange un mot de passe de connexion et enregistre son empreinte dans /etc/shadow ; macOS n'a presque aucune des options Linux et passe par dscl ou les Réglages.getfaclAffiche la liste de contrôle d'accès, ces droits supplémentaires par utilisateur au-delà du propriétaire, du groupe et des autres ; c'est du Linux avec le paquet acl, tandis que macOS montre sa propre ACL via ls -le.setfaclAccorde des droits à un utilisateur ou groupe supplémentaire sans changer le propriétaire ; dès qu'une ACL existe, ls affiche un + après les droits, et l'entrée mask peut silencieusement plafonner ce que vous avez donné.chattrPose des attributs au niveau du système de fichiers, comme immuable ; avec +i même root doit d'abord retirer l'indicateur, et cela ne marche que sur Linux avec ext4, xfs ou btrfs.xattrLit et supprime les attributs étendus sous macOS, surtout com.apple.quarantine, à l'origine de l'avertissement disant que l'application est endommagée ; sous Linux on utilise getfattr et setfattr.visudoModifie /etc/sudoers avec un verrou et une vérification de syntaxe avant enregistrement ; éditer ce fichier à la main et se tromper prive tout le monde de sudo, et c'est précisément ce que visudo évite.

Paquets et runtimes25

La question est toujours quoi va où : dans ce projet, ou sur la machine entière.

npm installTélécharge dans node_modules les dépendances demandées par package.json et met à jour package-lock.json ; depuis npm 7 les dépendances peer sont aussi installées, et --production a cédé la place à --omit=dev.npm ciSupprime node_modules et installe exactement ce que dit package-lock.json ; il ne modifie jamais le fichier de verrouillage et échoue net s'il diverge de package.json, d'où son usage en CI plutôt qu'install.npm runExécute une commande de la section scripts de package.json ; les arguments destinés au script exigent un -- devant, et seuls start et test s'appellent sans run.npm initCrée un package.json ; npm init <nom> fait tout autre chose : il télécharge et exécute create-<nom>, comme npx.npxExécute le binaire d'un paquet, en privilégiant node_modules/.bin et en le téléchargeant temporairement sinon ; une faute de frappe pouvant ramener un paquet inconnu, --no le limite au local.yarn addAjoute un paquet et met à jour yarn.lock ; yarn seul vaut install, et Yarn 2 a supprimé yarn global add, les outils ponctuels passent donc par yarn dlx.pnpm addPlace le paquet dans un magasin partagé et le relie dans node_modules ; à la racine d'un workspace, pnpm refuse un add nu et réclame -w ou --filter.npm auditSignale les vulnérabilités connues dans l'arbre installé ; fix --force fait monter des versions majeures qui cassent, et les alertes enfouies dans des dépendances de développement sont souvent sans remède.npm publishPublie le paquet sur le registre ; un nom avec portée est privé par défaut, d'où --access public, et un numéro de version ne se réutilise jamais : vérifiez d'abord la liste des fichiers avec --dry-run.node --versionAffiche la version du node trouvé en premier dans le PATH ; d'où le fait qu'un terminal d'éditeur ou un job de CI en annonce parfois une autre quand un gestionnaire de versions est en place.nvm useChange la version de Node utilisée par le shell courant ; le changement ne vaut que dans ce shell, un nouveau terminal ou un job de CI revient au défaut, et comme nvm est une fonction de shell, un script ou un Makefile doit d'abord sourcer nvm.sh.brew installInstalle une bottle précompilée sous macOS et Linux ; les applications graphiques exigent --cask, et la mise à jour revient à brew update puis brew upgrade, pas à install.apt-get installInstalle depuis la liste de paquets déjà téléchargée : une liste périmée fait échouer la recherche du paquet jusqu'à un apt-get update, et pour les scripts apt-get offre une interface stable, apt étant destiné aux humains.apt updateRafraîchit seulement les listes de paquets : il faut ensuite apt upgrade pour installer quoi que ce soit, et dans un conteneur neuf la liste est vide, d'où ce premier appel.dnf installInstalle depuis les dépôts activés en résolvant les dépendances et rafraîchit ses métadonnées tout seul, sans l'étape update d'apt ; depuis RHEL 8, yum est un lien vers dnf, et Fedora 41 est passée à dnf5.pacman -SInstalle un paquet depuis les dépôts sync d'Arch ; la distribution étant en rolling release, rafraîchir avec -Sy sans mettre à jour crée une mise à jour partielle qui casse les bibliothèques : utilisez -Syu.pip installInstalle un paquet dans le Python actif ; l'appeler via python -m pip évite le cas classique d'un pip appartenant à un autre interpréteur, et depuis la PEP 668 un Python système refuse d'installer hors d'un environnement virtuel.pip freezeAffiche chaque paquet installé avec sa version exacte, prêt à être redirigé vers requirements.txt ; il liste aussi les dépendances transitives, il doit donc être lancé dans l'environnement virtuel.python -m venvCrée un interpréteur isolé et son site-packages dans un dossier ; le créer ne suffit pas, il faut l'activer ou appeler directement .venv/bin/python, et comme les chemins y sont inscrits, renommer le dossier ensuite le casse.docker runCrée et démarre un nouveau conteneur à partir d'une image à chaque appel : lancé deux fois, il en existe deux, et pour relancer un conteneur arrêté c'est docker start ; sans -p rien n'est joignable depuis l'hôte, et sans -v ce qui est écrit disparaît avec le conteneur.docker psN'affiche que les conteneurs en cours d'exécution ; celui qui s'est arrêté juste après le démarrage reste invisible sans -a, et c'est là qu'il faut regarder quand docker run semble n'avoir rien fait.docker buildConstruit une image à partir d'un Dockerfile ; le point final est le contexte envoyé au démon, donc un dossier volumineux ralentit la construction jusqu'à ce que .dockerignore l'allège, et COPY ne voit que les fichiers de ce contexte.docker compose upDémarre tous les services de compose.yaml comme un même projet ; docker-compose avec tiret est la v1 retirée alors que docker compose est le plugin v2, et les conteneurs existants sont réutilisés sauf avec --build ou --force-recreate.docker execLance un autre processus dans un conteneur déjà en marche ; il échoue sur un conteneur arrêté, et les images slim n'ont pas de bash, on entre donc avec sh.docker logsAffiche ce que le processus principal du conteneur a écrit sur stdout et stderr ; une application qui journalise dans un fichier interne n'y apparaît pas, et les journaux disparaissent avec le conteneur.

Comment lire

  • Les crochets [ ] marquent une partie facultative.
  • Les points de suspension … signifient qu’on peut en mettre plusieurs.
  • Les options sont sensibles à la casse : sur certaines commandes, -r et -R ne font pas la même chose.

Questions fréquentes

Q. Pourquoi les noms de commandes ne sont-ils pas traduits ?

Parce qu’on les tape tels quels. Un ls traduit est un nom que le shell ne connaît pas. Les options restent pour la même raison : seules les explications suivent la langue.

Q. Les options diffèrent entre macOS et Linux.

Oui. macOS embarque les outils BSD, donc certaines options GNU manquent : sed -i réclame un argument, ps n’accepte pas -ef. Là où ça diverge, la description précise la plateforme.

Q. Comment repérer les commandes irréversibles ?

Leur description le dit. rm ne passe pas par la corbeille, dd écrase un disque si of= est faux, et git reset --hard comme git clean -fd jettent le travail non validé.