Vous êtes sur la page 1sur 489

Scott Granneman

Linux
Guide de survie

2e édition

Traduit de l’anglais (États-Unis) par Hervé


Soulard
Mise en pages : Hervé Soulard
© 2019, Pearson France
Aucune représentation ou reproduction, même partielle, autre que celles
prévues à l’article L. 122-5 2° et 3° a) du Code de la propriété
intellectuelle ne peut être faite sans l’autorisation expresse de Pearson
France ou, le cas échéant, sans le respect des modalités prévues à
l’article L. 122-10 dudit code.
ISBN : 978-2-3260-5715-9
Sommaire
Remerciements
Votre avis
Introduction
Public visé
À propos de la deuxième édition
Conventions utilisées

PREMIÈRE PARTIE : SE LANCER

Chapitre 1 - Les commandes : ce qu’il faut savoir


Tout est fichier
Longueur maximale des noms de fichiers
Les noms sont sensibles à la casse
Les caractères spéciaux à éviter dans les noms
Les caractères spéciaux et leur signification
Fichiers spéciaux qui affectent les commandes
Réinitialiser un écran encombré
Conclusion
Chapitre 2 - Parcours du système de fichiers
Lister les fichiers et les dossiers
Lister le contenu d’autres répertoires
Lister le contenu des répertoires en utilisant les caractères spéciaux
Afficher une liste de fichiers dans des sous‑répertoires
Afficher une liste sur une seule colonne
Afficher le contenu sous forme de noms séparés par des virgules
Afficher les fichiers et les répertoires cachés
Afficher le type des fichiers
Afficher le contenu avec des couleurs
Permissions, propriétés et autres
Inverser l’ordre d’affichage des éléments
Trier le contenu par la date et l’heure
Trier le contenu en fonction de la taille
Exprimer la taille des fichiers en ko, Mo et Go
Afficher le chemin du répertoire courant
Changer de répertoire
Atteindre le répertoire personnel
Atteindre le répertoire précédent
Conclusion
Chapitre 3 - Création et destruction
Appliquer l’heure courante à un fichier
Appliquer une date donnée à un fichier
Créer un nouveau fichier vide
Créer un nouveau répertoire
Créer un nouveau répertoire et ses sous‑répertoires
Copier des fichiers
Copier des fichiers à l’aide de caractères spéciaux
Copier des fichiers en mode bavard
Empêcher l’écrasement accidentel par copie de fichiers
Copier des répertoires
Copier des fichiers sous forme de sauvegarde parfaite dans un autre
répertoire
Déplacer des fichiers et des répertoires
Renommer des fichiers et des répertoires
Comprendre le stockage des fichiers sous Linux
Créer un lien vers un autre fichier ou répertoire
Supprimer des fichiers
Supprimer plusieurs fichiers à la fois grâce aux caractères spéciaux
Empêcher la suppression accidentelle de fichiers
Supprimer un répertoire vide
Supprimer des fichiers et des répertoires non vides
Suppression de fichiers pouvant poser problème
Conclusion
Chapitre 4 - Informations sur les commandes
Trouver des informations sur une commande grâce à man
Déterminer rapidement la fonction d’une commande grâce à son nom
Rechercher une commande selon sa fonction
Afficher une page man spécifique
Trouver des informations sur une commande grâce à info
Naviguer dans info
Localiser les chemins de l’exécutable d’une commande, de ses
sources et de ses pages man
Déterminer quelle version d’une commande s’exécutera
Découvrir comment une commande sera interprétée
Conclusion
Chapitre 5 - Création de blocs de commandes
Exécuter plusieurs commandes séquentiellement
Exécuter des commandes uniquement en cas de succès des
précédentes
Exécuter une commande uniquement en cas d’échec de la
précédente
Relier la sortie d’une commande à une autre commande
Comprendre les flux d’entrée‑sortie
Utiliser la sortie d’une commande comme entrée d’une autre
Rediriger la sortie d’une commande vers un fichier
Empêcher l’écrasement de fichiers lors d’une redirection
Ajouter la sortie d’une commande à un fichier
Utiliser un fichier comme entrée d’une commande
Rediriger l’entrée et la sortie
Diriger la sortie à la fois vers un fichier et stdout
Conclusion

DEUXIÈME PARTIE : MANIPULER LES FICHIERS

Chapitre 6 - Affichage du contenu des fichiers


Déterminer le type de fichier
Afficher des fichiers sur stdout
Concaténer des fichiers vers stdout
Concaténer des fichiers dans un autre fichier
Concaténer des fichiers et numéroter les lignes
Afficher des fichiers texte page par page
Effectuer des recherches dans votre pager
Modifier les fichiers affichés par un pager
Afficher les dix premières lignes d’un fichier
Afficher les dix premières lignes de plusieurs fichiers
Afficher un nombre de lignes donné pour un ou plusieurs fichiers
Afficher les premiers octets, kilo‑octets ou mégaoctets d’un fichier
Afficher les dix dernières lignes d’un fichier
Afficher les dix dernières lignes de plusieurs fichiers
Afficher les n dernières lignes d’un ou plusieurs fichiers
Afficher les dernières lignes d’un ou plusieurs fichiers avec mise à
jour régulière
Conclusion
Chapitre 7 - Manipulation de fichiers texte avec des filtres
Dénombrer les mots, les lignes et les caractères dans un fichier
Numéroter les lignes d’un fichier
Sélectionner une colonne complète de données dans un fichier
délimité
Trier le contenu d’un fichier
Trier numériquement le contenu d’un fichier
Retirer les lignes en double dans un fichier
Remplacer des caractères choisis par d’autres
Remplacer des caractères répétés par une seule instance
Supprimer les caractères correspondants
Transformer le texte d’un fichier
Afficher certains champs d’un fichier
Conclusion
Chapitre 8 - Propriétés et permissions
Changer d’utilisateur
Devenir un autre utilisateur en bénéficiant de ses variables
d’environnement
Devenir root
Devenir root en bénéficiant de ses variables d’environnement
Modifier le groupe des fichiers et des répertoires
Modifier le groupe d’un répertoire de façon récursive
Modifier le propriétaire des fichiers et des répertoires
Modifier le propriétaire et le groupe des fichiers et des répertoires
Comprendre les bases des permissions
Modifier les permissions des fichiers et des répertoires en employant
la notation symbolique
Modifier les permissions des fichiers et des répertoires en employant
la notation octale
Modifier les permissions de façon récursive
Activer et désactiver la permission suid
Activer et désactiver la permission sgid
Activer et désactiver le sticky bit
Conclusion
Chapitre 9 - Archivage et compression
Archiver et comprimer des fichiers avec zip
Obtenir la meilleure compression possible avec zip
Archiver et compresser des fichiers du type indiqué dans des
(sous‑)répertoires
Protéger par mot de passe les archives zip compressées
Dézipper des fichiers
Tester un fichier zip
Archiver et compresser des fichiers avec gzip
Archiver et compresser des fichiers de façon récursive avec gzip
Décompresser des fichiers compressés avec gzip
Tester un fichier compressé avec gunzip
Archiver et compresser des fichiers avec bzip2
Décompresser des fichiers compressés avec bzip2
Tester un fichier compressé avec bzip2
Archiver des fichiers avec tar
Archiver et compresser des fichiers avec tar et gzip
Tester les fichiers à restaurer et à décompresser
Restaurer et décompresser des fichiers
Conclusion

TROISIÈME PARTIE : RECHERCHER DES ÉLÉMENTS

Chapitre 10 - Recherche d’éléments


Effectuer une recherche dans une base de données des noms de
fichiers
Effectuer une recherche dans une base de données de noms de
fichiers sans se préoccuper de la casse
Mettre à jour la base de données utilisée par locate
Rechercher des motifs dans des fichiers texte
Les bases de la recherche de motifs dans les fichiers texte
Rechercher récursivement du texte dans des répertoires
Rechercher des termes et mettre en exergue les résultats
Rechercher du texte dans un fichier en ignorant la casse
Rechercher uniquement des mots complets dans des fichiers
Afficher les numéros des lignes dans lesquelles figurent les mots
recherchés
Rechercher des mots spécifiques dans la sortie d’autres commandes
Afficher le contexte des mots trouvés
Afficher les lignes ne contenant pas les mots
Afficher la liste des fichiers contenant les mots recherchés
Afficher le nombre d’occurrences des mots dans des fichiers
Rechercher des mots dans le résultat d’une recherche
Conclusion
Chapitre 11 - La commande find
Trouver des fichiers en fonction de leur nom
Rechercher des fichiers en fonction du propriétaire
Rechercher des fichiers en fonction de leur taille
Rechercher des fichiers en fonction de leur type
Rechercher des fichiers en fonction de la date
Afficher un résultat lorsque plusieurs expressions sont vraies (AND)
Afficher un résultat lorsque l’une des expressions est vraie (OR)
Afficher un résultat lorsqu’une expression est fausse (NOT)
Exécuter une commande sur tous les fichiers trouvés
Exécuter plus efficacement une commande sur tous les fichiers
trouvés
Exécuter une commande sur les fichiers trouvés dont les noms
contiennent des espaces
Conclusion

QUATRIÈME PARTIE : L’ENVIRONNEMENT


Chapitre 12 - Le shell
Afficher l’historique de l’interpréteur de la ligne de commande
Répéter la dernière commande
Répéter une commande précédente en utilisant des nombres
Répéter une commande précédente en utilisant une chaîne
Répéter une commande précédente et l’exécuter
Afficher tous les alias de commandes
Afficher l’alias d’une commande donnée
Créer un nouvel alias temporaire
Créer un nouvel alias permanent
Supprimer un alias
Créer une nouvelle fonction temporaire
Créer une nouvelle fonction permanente
Afficher toutes les fonctions
Supprimer une fonction
Choisir entre un alias et une fonction
Conclusion
Chapitre 13 - Surveillance des ressources système
Connaître la durée d’activité de votre ordinateur
Afficher tous les processus en cours d’exécution
Afficher l’arborescence des processus
Afficher les processus d’un utilisateur donné
Mettre fin à un processus
Afficher une liste dynamique des processus en cours
Afficher la liste des fichiers ouverts
Énumérer les fichiers ouverts par un utilisateur
Énumérer les utilisateurs d’un fichier donné
Énumérer les processus d’un programme donné
Afficher des informations sur la RAM
Afficher l’utilisation des systèmes de fichiers
Afficher l’espace disque utilisé par un répertoire
Afficher uniquement l’espace total occupé par un répertoire
Conclusion
Chapitre 14 - Installation de logiciels
Installer des paquetages RPM
Désinstaller des paquetages RPM
Installer un paquetage RPM et ses dépendances
Désinstaller un paquetage RPM et ses dépendances
Mettre à jour un paquetage RPM et ses dépendances
Trouver les paquetages RPM disponibles
Installer des paquetages DEB
Désinstaller des paquetages DEB
Installer un paquetage DEB et ses dépendances
Désinstaller des paquetages DEB et leurs dépendances
Mettre à jour des paquetages DEB et leurs dépendances
Trouver les paquetages DEB disponibles au téléchargement
Nettoyer les paquetages d’installation DEB devenus inutiles
Résoudre des problèmes avec APT (DEB)
Conclusion

CINQUIÈME PARTIE : LE RÉSEAU

Chapitre 15 - Connectivité
Afficher l’état des interfaces réseau
Vérifier qu’un ordinateur fonctionne et accepte des requêtes
Suivre la route des paquets entre deux hôtes
Effectuer des recherches DNS
Configurer une interface réseau
Afficher l’état des interfaces réseau sans fil
Configurer une interface réseau sans fil
Obtenir une nouvelle adresse avec DHCP
Activer une connexion réseau
Désactiver une connexion réseau
Afficher la table de routage IP
Modifier la table de routage IP
Dépanner des problèmes réseau
Conclusion
Chapitre 16 - Travail sur le réseau
Se connecter de façon sécurisée à un autre ordinateur
Se connecter de façon sécurisée à un autre ordinateur sans mot de
passe
Sécuriser le transfert de fichiers entre deux machines
Copier de façon sécurisée des fichiers entre deux hôtes
Transférer et sauvegarder des fichiers de façon sécurisée
Télécharger des fichiers de façon non interactive
Télécharger des sites Web de façon non interactive
Télécharger des fichiers séquentiels et des ressources Internet
Conclusion
Index
Cet ouvrage est dédié aux utilisateurs de Linux,

qu’ils soient anciens ou nouveaux. Soyez les bienvenus !


Remerciements pour la première édition
(2005)

Personne n’apprend le shell Linux en vase clos. Je remercie


les centaines d’auteurs, qui oeuvrent depuis des décennies,
pour m’avoir renseigné sur les formidables possibilités de la
ligne de commande de Linux. Livres, sites Web, blogs,
supports distribués aux réunions des GUL : grâce à tous ces
documents, j’ai pu mieux comprendre bash et la beauté de la
ligne de commande Linux. Je continue à y trouver de l’aide
aujourd’hui. Si je peux rendre ne serait-ce qu’une fraction
de ce que j’en ai tiré, je serai satisfait.
Outre ces individus savants, je voudrais remercier les
personnes (et les animaux) qui m’ont aidé et soutenu
pendant l’écriture de cet ouvrage.
Mon agent, Laura Lewin, qui m’a été utile de si
nombreuses façons que je ne peux les relater.
Mes éditeurs chez Pearson, qui m’ont donné la possibilité
d’écrire ce livre et qui ont été présents chaque fois que
j’avais besoin d’encouragements.
Robert Citek m’a apporté une aide précieuse avec RPM et
a toujours été disponible pour mes questions. Cet homme
connaît Linux.
Jans Carton, mon collègue et ami depuis toujours, m’a
aidé à me concentrer lorsque j’en avais besoin. Il a servi de
cobaye (presque) volontaire pour de nombreuses nouvelles
commandes et options. Qui l’aurait imaginé, quand nous
nous sommes rencontrés en cinquième année ?
Jerry Bryan a relu tout ce que j’ai écrit et a corrigé toutes
les petites erreurs grammaticales et les fautes de frappe
que j’ai commises. Je te le promets Jerry, un jour, je vais
apprendre la différence entre « may » et « might » !
Ma femme, Denise Lieberman, m’a patiemment écouté
babiller avec enthousiasme lorsque je découvrais quelque
chose de sympa, même si elle n’avait absolument aucune
idée de quoi il s’agissait. Tu es un véritable amour. Merci
Denise !
Enfin, merci à mon adorable petite shih tzu, Libby, qui a
toujours su à quel moment poser ses pattes avant sur mes
cuisses et demander à se faire gratter les oreilles et
caresser le ventre.

Remerciements pour la deuxième édition


(2015)

Pour cette deuxième édition, beaucoup de choses ont


changé (malheureusement, Libby est partie dans cette
grande niche au Ciel), mais une a perduré : de nombreuses
personnes m’ont aidé pendant sa rédaction. Elles méritent
ma reconnaissance et ma gratitude.
Mark Taber de Pearson m’a soutenu pendant une très
longue période d’écriture. Je ne saurais trop te remercier,
Mark. C’est grâce à toi que ce livre existe aujourd’hui.
Mon épouse, Robin Woltman, a lu chaque chapitre et a
fait de nombreuses modifications et suggestions
inestimables. Tu as fait un excellent travail, Robin !
Robert Citek a examiné de nombreux chapitres et a
formulé des suggestions et des modifications techniques
toujours parfaites. C’est vers lui que je me tourne quand j’ai
besoin d’aide !
Craig Buchek a relu un chapitre ou deux et a fait de
bonnes propositions. En tant qu’ancien dictateur
bienveillant du groupe d’utilisateurs de Linux de Saint-Louis,
il fallait s’y attendre.
Tom Kirk m’a prêté quelques ordinateurs portables de son
énorme collection pour que je puisse tester certaines parties
concernant le réseau. Tom, tu es une bouée de sauvetage et
le meilleur gars que je connaisse pour le matériel.
Outre mes amis ci-dessus, les personnes suivantes ont
envoyé un courrier électronique pour m’informer des
problèmes rencontrés dans la première édition.
• Joe Hancharik a signalé un problème dans la section «
Les caractères spéciaux et leur signification » du chapitre
1, une erreur très stupide de ma part.
• William H. Ferguson a découvert une autre erreur stupide
que j’ai commise dans la section « Copier des fichiers »
du chapitre 3.
• Brian Greer a signalé un problème que j’aurais dû
remarquer dans la section « Dépanner des problèmes
réseau » du chapitre 15.
Merci messieurs ! Ce sont les lecteurs comme Joe, William
et Brian qui rendent l’écriture intéressante. Les
commentaires sont une bonne chose, même s’il s’agit d’un
rapport de bogue. Si vous constatez une erreur, faites-le
moi savoir afin que je puisse la corriger pour la troisième
édition !
Votre avis

En tant que lecteur de ce livre, vous êtes notre principal


critique et commentateur. Votre avis nous importe et nous
souhaitons savoir ce qui est bien, ce que nous pouvons
améliorer, dans quels domaines vous souhaitez nous voir
publier, ainsi que tout autre message de bon sens que vous
êtes prêt à nous transmettre.
Nous attendons vos commentaires. Vous pouvez envoyer
un e-mail pour nous dire ce que vous avez aimé ou non
dans ce livre, et nous indiquer comment améliorer nos
publications.
Notez toutefois que nous ne pouvons pas vous aider sur
les problèmes techniques qui concernent le sujet de ce livre.
Si vous nous écrivez, n’oubliez pas de préciser le titre du
livre et son auteur, ainsi que votre nom.
E-mail : infos.france@pearson.com
Introduction
L’interpréteur de ligne de commande, ou shell, est sans
doute l’une des fonctionnalités les plus importantes de
Linux. Si vous faites tourner un serveur Linux, votre
interface principale sera très certainement le shell. Si vous
êtes un utilisateur avancé de Linux, une fenêtre de console
est sans doute constamment ouverte sur votre ordinateur.
Si vous découvrez Linux, vous pensez peut-être que vous
n’utiliserez jamais l’interpréteur de ligne de commande,
mais vous devrez pourtant y recourir de temps à autre –
plus vous utiliserez Linux, plus vous emploierez le shell
fréquemment.
Le shell est la clé de la puissance et de la souplesse de
Linux. Grâce à la ligne de commande, vous pouvez faire des
choses qui seraient impossibles à réaliser quelle que soit
l’interface graphique employée. Peu importe la puissance de
KDE ou de GNOME (ou d’IceWM, de XFCE ou de n’importe
quel environnement graphique), vous travaillerez toujours
plus efficacement et plus rapidement en utilisant la console.
Si vous voulez maîtriser Linux, commencez par connaître les
commandes de son shell.
Pour cela, on utilise traditionnellement les pages man.
Malgré leur utilité, elles sont souvent insuffisantes pour la
simple raison qu’elles ne fournissent pratiquement jamais
d’exemple. Certaines en proposent bien, mais les bons
exemples ne sont pas légion. C’est un vrai problème pour
tous les utilisateurs, quel que soit leur niveau. C’est en effet
une chose de pouvoir afficher les options, mais c’en est une
autre de voir comment elles fonctionnent avec des cas
concrets.
Cet ouvrage présente ces exemples qui font tant défaut.
Cela fait plus de vingt ans que j’utilise Linux et je peux sans
rougir prétendre que je maîtrise bien ce système
d’exploitation extraordinaire. En fait, je suis un tel
inconditionnel de la ligne de commande que j’ai toujours
une fenêtre de console ouverte. Pour couronner le tout, les
serveurs Linux présents dans mon entreprise ne disposent
d’aucune interface graphique (exactement ce que j’apprécie
!) et je dois donc employer la console pour les utiliser. Cela
ne m’empêche pas de déplorer, comme mes amis
utilisateurs de Linux, mes relations et les membres des GUL
(Groupe d’utilisateurs de Linux), le manque d’exemples
dans les pages de manuel. Lorsqu’on m’a demandé d’écrire
ce livre, en me précisant qu’il devait regorger d’exemples
illustrant la plupart des commandes Linux importantes, j’ai
immédiatement sauté sur l’occasion.
Vous tenez le résultat de ce travail entre vos mains : un
livre sur les commandes Linux que vous devez connaître,
illustré d’exemples pour chacune d’elles. C’est un ouvrage
de référence qui sera utile aujourd’hui, mais aussi dans les
années à venir. J’espère que vous apprécierez le résultat et
la pointe d’humour que j’ai tenté d’y mettre.

Public visé

J’ai écrit ce livre de manière qu’il soit utile aux débutants –


ces personnes qui assistent aux réunions des GUL en quête
de conseils et d’aide lorsqu’elles commencent à utiliser
Linux – comme aux utilisateurs confirmés qui utilisent la
console pour toutes leurs tâches quotidiennes, de
l’administration système aux jeux, en passant par la
programmation. Si vous débutez avec Linux, il vous aidera à
comprendre le rôle essentiel du shell, ainsi que sa
puissance. Si cela fait des années que vous utilisez Linux,
vous y découvrirez de nouvelles astuces et un rappel de
quelques fonctionnalités que vous avez sans doute oubliées
depuis longtemps.
Il existe de nombreux shells – csh, tcsh, zsh, pour ne
nommer qu’eux – mais le shell par défaut de la plupart des
distributions de Linux est bash (Bourne Again Shell). En plus
d’être très répandu, il est très puissant et très souple. Dès
qu’il vous sera familier, vous pourrez explorer d’autres
shells, mais la connaissance de bash est nécessaire pour
aborder le monde de Linux.
J’ai écrit ce livre en utilisant Debian, qui est une
distribution Linux aussi générique que possible, ainsi que
l’une des plus utilisées. Même si j’ai utilisé Debian, les
commandes décrites doivent fonctionner avec le shell que
vous avez choisi. La seule différence majeure apparaît
lorsque l’on utilise une commande en tant qu’utilisateur
root. Plutôt qu’une ouverture de session root, certaines
distributions, comme Ubuntu, encourage l’utilisation de la
commande sudo : au lieu d’exécuter la commande lsof
firefox en tant que root, un utilisateur Ubuntu emploie
plutôt la commande sudo lsof firefox.

Info
Le lecteur attentif aura remarqué que, dans la première édition
de cet ouvrage, j’utilisais Ubuntu (ou K/Ubuntu, comme je
l’indiquais pour souligner que j’employais KDE avec Ubuntu). Je
suis à présent devenu plus générique et je me sers d’un Debian
conventionnel, une distribution sur laquelle se fonde Ubuntu.

Pour m’adapter au plus grand nombre possible de


lecteurs, je décris les commandes comme si elles devaient
être exécutées en tant que root, sans sudo. Le symbole # en
face d’une commande signifie que celle-ci a été exécutée
par l’utilisateur root : vous devrez donc être connecté
comme root ou utiliser la commande sudo si vous avez choisi
d’employer Ubuntu ou une distribution semblable.
Un dernier mot : pour éviter que cet ouvrage ne soit trop
long, la sortie des commandes a souvent été tronquée. Par
exemple, sur votre ordinateur Linux, la commande ls -l
devrait produire une sortie comparable à la suivante :
-rwxr-xr-x 1 scott admins 1261 Jun 1 2012 script.sh
Vous la rencontrerez parfois ainsi dans cet ouvrage,
lorsque cela est approprié, mais, le plus souvent, elle sera
raccourcie :
-rw-r--r-- 1 scott admins script.sh
J’ai retiré les parties qui, à mons avis, ne sont pas
importantes et qui auraient pu conduire à une présentation
de la sortie sur plusieurs lignes ; vous seriez surpris de la
manière dont ces lignes peuvent s’accumuler. C’est
pourquoi j’ai adopté cette méthode lorsque cela me
semblait approprié (ou lorsque mon éditeur était sur le point
de paniquer au vu du nombre de pages que le livre allait
avoir !).

Astuce
Une grande partie des informations que je fournis sur Linux
dans cet ouvrage peuvent également s’appliquer à d’autres
versions d’Unix, comme BSD et OS X. Vous remarquerez que je
n’ai pas précisé « toutes » ou « la plupart », mais « une grande
partie ». Sous condition que vous gardiez cela à l’esprit, cet
ouvrage se révèlera utile avec ces systèmes d’exploitation.

À propos de la deuxième édition

Lorsque Mark Taber, mon éditeur chez Pearson, m’a proposé


d’écrire une deuxième édition de cet ouvrage, je n’ai pas
hésité une seconde. En fait, je l’utilise souvent comme
référence et, au fil des années, j’ai remarqué quelques
erreurs (déclenchant à chaque fois une grimace) et noté
plusieurs choses que j’aurais aimé modifier, supprimer ou
ajouter.
Mon objectif était que cette deuxième édition devienne
indispensable aux nouveaux lecteurs comme à tous ceux
qui possédaient déjà la première. On est loin d’une nouvelle
version avec juste quelques petits changements, en voici
pour preuve ce qu’elle comporte de nouveau ou de différent
:
• Le chapitre 2 initial, « Les bases », a été divisé en deux
chapitres : les chapitres 2, « Parcours du système de
fichiers » et 3, « Création et destruction ».
L’ancien chapitre 2 était ridiculement long et comprenait
différentes sortes de commandes. Le nouveau découpage
rend les choses plus faciles à appréhender.
• J’ai supprimé les chapitres 6, « Impression et gestion des
tâches d’impression » et 16, « Travail en réseau avec
Windows », car ils ne semblent plus aussi importants qu’il
y a dix ans. Par ailleurs, quiconque a besoin d’imprimer
ou de travailler dans un réseau Windows dispose d’outils
graphiques mieux adaptés à ces tâches. Mais ne soyez
pas désespérés, ces chapitres de la première édition sont
disponibles en anglais sur mon site Web
(www.granneman.com/linux-redaction).
• J’ai ajouté un nouveau chapitre : le chapitre 7, «
Manipulation de fichiers texte avec des filtres » apporte
de nombreuses nouvelles informations importantes que,
j’en suis certain, vous trouverez très utiles !
• J’ai retiré des portions des anciens chapitres 2 (à présent
les chapitres 2 et 3), 3 (à présent 4), 7 (8), 8 (9), 9 (10),
10 (11) et 14 (15). Là encore, vous pourrez les retrouver
sur mon site Web
(granneman.com/writing/books/linux-phrasebook).
• J’ai ajouté de nouvelles parties aux chapitres 1 à 6 et 8 à
13. J’ai pratiquement doublé la taille du chapitre 15 en
conservant les commandes devenues obsolètes
(puisqu’elles existent toujours sur la plupart des
distributions) et en ajoutant les nouvelles.
• J’ai déplacé des sections dans de nouveaux chapitres, là
où elles étaient plus pertinentes, en particulier dans le
chapitre 8.
• J’ai revu le contenu de chaque chapitre. J’ai corrigé des
erreurs, réécrit les parties qui n’étaient pas assez claires,
ajouté des notes et des astuces, et amélioré des
exemples en ajoutant ou en modifiant le contenu.
• Je mentionne au passage de nombreuses autres
commandes, comme ssh-agent, wput, htop, dnf, pandoc,
rename, whoami et iconv.
• J’ai ajouté de petites informations sur plusieurs sujets
qu’il est bon de connaître, comme les variables, les
boucles for, les tâches cron, les arguments et les sources.
Ah oui, les références à H.P. Lovecraft sont toujours plus
nombreuses !
Un dernier conseil : si des liens sont rompus ou ne sont
plus
opérants, essayez de les saisir dans Wayback Machine
sur le site Internet Archive (https://archive.org). Il est fort
probable que vous puissiez encore trouver le contenu
correspondant. Mais n’oubliez pas de me prévenir (voir page
XIII) afin que je corrige ces références dans les prochaines
éditions.
J’espère sincèrement que vous apprécierez cette nouvelle
édition de Linux, Guide de survie !

Conventions utilisées

Dans cet ouvrage, nous avons choisi les conventions


suivantes :
• Police machine est utilisé pour différencier les codes du
texte standard et pour indiquer ce qui doit s’afficher sur
votre écran. Par exemple :
La commande df exprime le résultat en kilo-octets, mais
il est souvent plus facile à interpréter si vous utilisez
l’option -h (ou --human-readable).
On utilise cette police pour représenter ce qui s’affiche à
l’écran.
• Une flèche (➥) au début d’une ligne de code signifie que
celle-ci est trop longue pour tenir sur une seule ligne du
livre. Le lecteur sait ainsi que la ligne est censée
s’afficher sur une seule ligne dans la console.
• Les éléments qui suivent servent à présenter des
informations complémentaires.

Info
Note contenant des informations complémentaires sur le sujet
traité.

Astuce
Les astuces sont des conseils ou des techniques permettant de
faciliter une tâche.

Attention
Ce type de note permet de mettre en évidence des problèmes
potentiels et d’éviter certains désastres.
Chapitre 1
Les commandes : ce qu’il
faut savoir
Avant d’entrer dans le vif du sujet, il faut clarifier quelques
points pour faciliter la lecture de la suite. Il est
indispensable de connaître certains principes de base et
tous ne sont pas évidents. En revanche, dès que vous les
aurez assimilés, vous comprendrez mieux le fonctionnement
de votre ligne de commande.

Tout est fichier

Sur un système Linux, tout est fichier et cela peut sembler


évident à première vue. Un document texte est évidemment
un fichier, tout comme un document OpenOffice.org, une
image, une vidéo ou un MP3.
Mais qu’en est-il des répertoires ? Il s’agit aussi de
fichiers, d’un type particulier, qui contiennent des
informations sur d’autres fichiers. Les lecteurs de disques
sont de gros fichiers. Les connexions réseau sont des
fichiers. Les périphériques matériels sont eux aussi
représentés sous forme de fichiers. Même les processus en
cours d’exécution sont des fichiers. Bref, sous Linux, tout est
fichier.
Pour Linux, un fichier est simplement un flux de bits et
d’octets. Il ne se préoccupe pas de ce que ces bits et ces
octets représentent ; cela ne concerne que les programmes
qui les utilisent. Un document texte et une connexion
réseau sont des fichiers, et c’est votre traitement de texte
qui sait comment gérer les documents texte et vos
applications Internet qui reconnaissent une connexion
réseau.
Tout au long de ce livre, je ferai référence aux fichiers. Si
vous préférez, n’hésitez pas à remplacer ce terme, mais de
façon appropriée, par fichiers, répertoires, sous-répertoires
et tout ce qui se trouve sur le système. La plupart des
commandes dont il sera question fonctionnent pour les
documents comme pour les répertoires. N’hésitez pas à les
tester dans les deux cas de figure.

Info
À strictement parler, tout n’est pas un fichier. Comme Linus
Torvalds l’a souligné, il est plus exact de dire « tout est un flux
d’octets ». Pour de plus amples informations sur ce concept,
consultez les articles « Everything is a file » sur Wikipédia
(http://en.wikipedia.org/wiki/Everything_is_a_file), et « What
‘Everything Is a File’ Means on Linux » sur How-To Geek
(http://www.howtogeek.com/117939/htg-explains-what-
everything-is-a-file-means-on-linux/).

Longueur maximale des noms de fichiers

Ceux d’entre vous qui ont des souvenirs de MS-DOS savent


que les noms de fichiers de ce système ne pouvaient
excéder huit caractères, plus trois lettres pour l’extension,
ce qui donnait des noms de fichiers aussi obscurs que
MSRSUME1.DOC. Avant l’apparition d’OS X, les utilisateurs
de Macintosh étaient limités à 31 caractères. C’était déjà
mieux, mais ça ne suffisait pas à éviter les noms de fichiers
étranges.
Sous Linux (et Unix), les noms de fichiers peuvent
atteindre 255 caractères, mais il est rare qu’ils soient aussi
longs (ou c’est que vous avez tendance à être sacrément
bavard). Vous disposez de suffisamment de caractères pour
être précis dans la description de vos fichiers, mais ne
tombez pas dans l’excès.
Il est conseillé de limiter la longueur des noms de fichiers
à moins de 80 caractères, ce qui correspond à la largeur
moyenne d’affichage des consoles. Avec moins de 80
caractères, les noms de fichiers tiennent sur une ligne sans
qu’il soit nécessaire de passer à la ligne. Ce n’est toutefois
qu’un conseil, non une obligation. Vous êtes libre d’utiliser
plus de 200 caractères, mais faites-le à bon escient.

Les noms sont sensibles à la casse

Contrairement à ce qui se passe sous Windows et Mac OS X,


Linux est sensible à la casse employée dans les noms de
fichiers. Les trois fichiers suivants peuvent donc figurer dans
un même répertoire :
livresaacheter.txt
LivresAAcheter.txt
LiVreSaAchEteR.txt

Pour le système de fichiers Linux, il s’agit de trois fichiers


totalement différents. Sous Mac OS X ou Windows, vous
auriez dû renommer deux fichiers pour les placer tous les
trois dans un même dossier.
Cette sensibilité à la casse signifie également que les
noms de fichiers et de commandes doivent être saisis
exactement comme ils s’écrivent. Si vous souhaitez
supprimer un fichier à l’aide de rm, vous ne pouvez pas taper
RM ou Rm ou rM. La seule syntaxe possible est rm. De même, si
vous voulez supprimer livresaacheter.txt et que vous tapez
rm LivresAAcheter.txt, vous effacerez le mauvais fichier ou il
ne se passera rien du tout.
Linux oblige à être précis, mais la précision a du bon.
Parallèlement, vous bénéficiez d’un niveau de souplesse
introuvable dans un autre système d’exploitation. Cette
combinaison de précision et de souplesse fait de Linux un
outil convivial, mais un peu déroutant pour les nouveaux
utilisateurs.

Les caractères spéciaux à éviter dans les


noms

Chaque système d’exploitation a un jeu de caractères dont


l’utilisation est prohibée dans les noms de fichiers et de
répertoires. Si vous êtes sous Mac OS X, vous ne pouvez pas
utiliser le caractère deux-points (:). Sous Windows, c’est
l’utilisation de l’antislash (\) qui est interdite. Linux ne fait
pas exception et a aussi ses caractères interdits. Avant de
les passer en revue, voyons ceux qui ne posent jamais de
problèmes :
• les chiffres ;
• les lettres (majuscules et minuscules) ;
• les points (.), mais s’il s’agit du premier caractère d’un
nom de fichier ou d’un répertoire, celui-ci n’est pas
visible dans la plupart des environnements de ligne de
commande graphique ;
• les caractères soulignés (_).
Les autres caractères de votre clavier peuvent soit
fonctionner parfaitement, soit fonctionner mais entraîner
des complications, car la ligne de commande peut les
interpréter de diverses façons, soit ne pas fonctionner du
tout.
Le caractère / est réservé car il sert à séparer les noms
des répertoires et ceux des fichiers. Supposons que vous
souhaitiez conserver dans un fichier la liste des ouvrages à
acheter. Imaginons également que vous parveniez par un
moyen quelconque à nommer ce fichier livres/à_acheter.txt
(avec un slash) pour le distinguer de livres/en_prêt.txt et de
livres/perdus.txt. Si vous tentez de vous référer à ce fichier
en écrivant /home/scott/documents/livres/à_ acheter.txt, la
commande ne fonctionnera pas, car l’interpréteur de
commande pensera qu’il existe un répertoire livres dans le
répertoire documents, ce qui n’est pas le cas.
À la place du slash, utilisez un caractère souligné (à
l’instar de la partie à_acheter dans le nom du fichier) ou
groupez les mots (livresAAcheter.txt ou LivresAAcheter.txt).
Vous auriez pu utiliser des traits d’union (livres-à-
acheter.txt), mais les noms me semblent plus faciles à lire
avec des blancs soulignés. Quoi qu’il en soit, si vous voulez
utiliser un trait d’union, ne le placez jamais au début d’un
nom de fichier, comme dans -livres_à_acheter. txt, ou après
une espace comme dans livres - à acheter.txt. Vous le
verrez par la suite, l’invocation des options particulières
d’une commande nécessite qu’elles soient introduites par
un trait d’union. Le chapitre 3, « Création et destruction »
détaille la commande rm qui permet de supprimer des
fichiers. Si vous essayez de taper rm -livres_à_acheter.txt,
vous obtiendrez le message d’erreur suivant :
rm: invalid option -- l
Vous pouvez utiliser des espaces si vous le souhaitez,
comme dans livres à acheter.txt, mais vous devrez informer
l’interpréteur de commande que ces espaces font partie du
nom du fichier car il considère généralement les espaces
comme des séparations entre les paramètres d’une
commande. Si vous essayez de supprimer livres à
acheter.txt, l’interpréteur va comprendre qu’il doit effacer
les fichiers livres, à et acheter. Non seulement vous
n’effacerez pas le fichier souhaité, mais vous risquez en plus
de supprimer accidentellement d’autres fichiers.
Alors, comment utiliser les espaces dans les noms de
fichiers ? Et comment employer les caractères * et ? dont il
est question à la section suivante ? Comment utiliser
également les caractères ’ et “ qui ont des significations
particulières pour l’interpréteur ? Vous avez plusieurs
possibilités. Vous pouvez éviter de les utiliser autant que
possible. Vous pouvez aussi les faire précéder du caractère
d’échappement (\) : il indique au shell que le caractère
suivant doit être considéré comme un caractère standard
sans fonction particulière. Cependant, l’utilisation de ce
caractère peut être fastidieuse, en particulier lorsqu’il s’agit
de contrôler s’il est bien placé :
$ rm Pourquoi\ éviter d\’employer\ \*\ dans\ un\ nom\ \?.txt
Une technique plus simple consiste à englober le nom
entre des guillemets :
$ rm ”Pourquoi éviter d’employer * dans un nom ?.txt”
Cela fonctionne, mais il est pénible de devoir tout le
temps utiliser des guillemets. La meilleure solution consiste
donc à ne pas utiliser ces caractères. Le tableau 1.1
récapitule les caractères « problématiques » et de la façon
de les utiliser.

Tableau 1.1 Comment utiliser les caractères spéciaux dans les noms de
fichiers
Caractère Conseil
/ Ne jamais utiliser. Ne peut être échappé.
\ Doit être précédé d'un caractère d'échappement. À éviter.
- Ne jamais utiliser au début d'un nom de fichier ou de
répertoire.
[] Doit être précédé d'un caractère d'échappement. À éviter.
{} Doit être précédé d'un caractère d'échappement. À éviter.
* Doit être précédé d'un caractère d'échappement. À éviter.
? Doit être précédé d'un caractère d'échappement. À éviter.
' Doit être précédé d'un caractère d'échappement. À éviter.
" Doit être précédé d'un caractère d'échappement. À éviter.
<espace> Doit être précédé d'un caractère d'échappement. Parfois
difficile à éviter, mais il faut essayer.

Les caractères spéciaux et leur


signification

Imaginons que vous ayez les fichiers suivants – douze


images et un fichier texte – dans un répertoire sur votre
ordinateur :
libby1.jpg      libby8.jpg
libby2.jpg      libby9.jpg
libby3.jpg      libby10.jpg
libby4.jpg      libby11.jpg
libby5.jpg      libby12.jpg
libby6.jpg      libby1.txt
libby7.jpg

Vous souhaitez supprimer ces fichiers à l’aide de la


commande rm (voir le chapitre 3) mais leur suppression un à
un serait fastidieuse : après tout, si l’on utilise des
ordinateurs, c’est aussi pour automatiser et simplifier les
tâches rébarbatives. C’est là qu’interviennent les caractères
spéciaux (ou caractères jokers) : ils permettent de traiter
plusieurs fichiers simultanément en effectuant une
recherche de correspondance des caractères de leur nom.
Il existe quatre caractères spéciaux :
• * (astérisque) ;
• ? (point d’interrogation) ;
• [] (crochets) ;
• {} (accolades).

Info
Les accolades sont différentes des autres caractères. Pour bash,
les conversions effectuées par les trois premiers correspondent
à une expansion de nom de fichier, tandis que les accolades
donnent une expansion des accolades. Les trois premiers
effectuent simplement une correspondance avec des fichiers
existants ; les accolades peuvent servir pour une
correspondance avec des fichiers existants, mais également
pour créer de nouveaux fichiers.

L’astérisque remplace un ou plusieurs caractères. Voici


quelques exemples d’utilisation et des sélections qu’il
permet d’effectuer.
Tableau 1.2 Sélections possibles à l'aide du caractère spécial *
Commande Résultat
rm Efface les fichiers libby10.jpg à libby12.jpg, ainsi que
libby1*.jpg libby1.jpg

rm libby*.jpg Efface les fichiers libby1.jpg à libby12.jpg, mais pas


libby1.txt

rm *txt Efface libby1.txt, mais pas les fichiers libby1.jpg à


libby12.jpg

rm libby* Efface les fichiers libby1.jpg à libby12.jpg et libby1.txt


rm * Efface tous les fichiers du répertoire

Le point d’interrogation remplace un seul caractère. Voici


quelques exemples d’utilisation et des sélections qu’il
permet d’effectuer.
Tableau 1.3 Sélections possibles à l'aide du caractère spécial ?
Commande Résultat
rm Efface les fichiers libby10.jpg à libby12.jpg, mais pas
libby1?.jpg libby1.jpg

rm libby?.jpg Efface les fichiers libby1.jpg à libby9.jpg, mais pas


libby10.jpg

rm libby?.* Efface les fichiers libby1.jpg à libby9.jpg et libby1.txt


Les crochets désignent un jeu de caractères uniques
([12], par exemple, qui correspondrait à 1 ou 2 mais pas à 12,
ou [abc], qui correspondrait à a ou b ou c mais pas à ab ni bc
ni abc) ou une plage de caractères dont les extrémités sont
séparées par un trait d’union (comme [1-3], qui
correspondrait à 1, 2 ou 3). Voici quelques exemples
d’utilisation et des sélections qu’ils permettent d’effectuer.
Tableau 1.4 Sélections possibles à l'aide des caractères spéciaux [ ]
Commande Résultat
rm libby1[12].jpg Efface libby11.jpg et libby12.jpg, mais pas libby10.jpg
rm libby1[0- Efface de libby10.jpg à libby12.jpg, mais pas
2].jpg libby1.jpg

rm libby[6-8].jpg Efface de libby6.jpg à libby8.jpg, et aucun d'autre

Les accolades permettent également d’effectuer deux


sortes de correspondance : chaînes de caractère et plages.
Si vous souhaitez employer l’expansion des accolades pour
des chaînes de caractères, séparez la liste par des virgules,
puis bash recense toutes les combinaisons possibles :
$ ls
huan.jpg libby.gif libby.jpg libby.png libby.tiff
$ ls libby.{jpg,png}
libby.jpg libby.png
$ ls {libby,huan}.jpg
huan.jpg libby.jpg

Cependant, la liste des chaînes de caractères doit être


une véritable liste et vous ne pouvez donc pas utiliser
simplement {jpg}.
Dans une note précédente, j’ai indiqué que l’expansion
des accolades permet non seulement d’effectuer une
correspondance avec fichiers mais également d’en générer.
Le chapitre 3 décrira la commande mkdir, qui permet de
créer des répertoires. Dans l’exemple suivant, l’expansion
des accolades est employée pour créer rapidement
plusieurs répertoires :
$ mkdir {dogs,cats,wombats}
$ ls
cats dots wombats

Dans ce cas, nous ne cherchons pas une correspondance


avec des fichiers ou des répertoires existants (ce à quoi se
bornent *, ? et []), mais nous utilisons les accolades pour
indiquer à mkdir les noms des nouveaux répertoires qu’elle
doit créer.
N’oubliez pas que [] effectue une correspondance avec
des caractères uniques, tandis que {} est utilisée pour des
correspondances avec des chaînes de caractères –
cependant, une chaîne peut être constituée d’un seul
caractère ! Cela peut amener une certaine confusion,
comme l’illustre le résultat de la quatrième commande :
$ ls
testa testab testb testbc testc
$ ls test[a,b]
testa testb
$ ls test{a,b}
testa testb
$ ls test[ab,bc]
testa testb testc
$ ls test{ab,bc}
testab testbc

Les deuxième et troisième commandes, correspondant à


test[a,b] et test{a,b}, produisent le même résultat car elles
recherchent toutes deux des caractères uniques. Mais, si
vous oubliez que [] ne manipule que des caractères
uniques, le résultat peut être inattendu. La commande ls
test[ab,bc] n’affiche pas testab et testbc, mais seulement
testa, testb et testc car, en raison de son mode de
fonctionnement, nous lui demandons de rechercher testa,
puis testb, puis test, (test suivi d’une virgule !), puis à
nouveau testb, et enfin testc. Elle trouve trois de ces
éléments (elle ignore la demande en double) et les affiche.
En revanche, puisque {} opère sur des chaînes de
caractères, elle sait que vous souhaitez obtenir testab et
testbc, et les produit donc. Espérons que cet exemple
permette de clarifier un peu les différences entre les
crochets et les accolades.
Dans le cas des plages, cette caractéristique permet de
préciser un début et une fin entre les caractères { et }. Il
peut s’agir de lettres ou de chiffres, mais le mélange est
interdit, séparés par deux points. Voici des exemples avec la
commande touch (décrite au chapitre 3) :
$ touch finny{1..3}
$ ls
finny1  finny2  finny3
$ touch finny{a..c}
$ ls
finny1  finny2  finny3  finnya  finnyb  finnyc

Il est tout à fait possible de combiner deux instances de


l’expansion des accolades. Toutes les combinaisons
possibles seront alors trouvées ou créées :
$ touch finny{1..3}{a..c}
finny1a finny1b finny1c finny2a finny2b finny2c finny3a
➥ finny3b finny3c
Pour clore notre revue des caractères spéciaux, sachez
que vous pouvez tous les combiner. Si vous souhaitez une
correspondance avec libby1.jpg, libby2.jpg et libby1.txt,
mais pas avec libby3.jpg ni libby.jpg, utilisez simplement
libby[1-2].*. Et si vous vouliez Libby1.jpg, libby1.jpg (notez le
L majuscule et le l minuscule – rappelez-vous que, pour
Linux, ces deux fichiers sont différents), libby2.jpg et
Libby3.txt, mais pas libby4.jpg ? Dans ce cas, précisez ?
ibby[1-3].{jpg,txt}.
Vous allez fréquemment utiliser les caractères spéciaux
dans ce livre, il est donc bon de se familiariser avec eux dès
maintenant. Ils facilitent grandement la gestion de fichiers
depuis la ligne de commande. Vous les trouverez bientôt
indispensables.

Fichiers spéciaux qui affectent les


commandes

Tout au long de cet ouvrage, nous ferons référence à des


scripts de démarrage qui sont cachés dans le répertoire
personnel et qui peuvent influencer énormément le
fonctionnement du shell ; ils sont cachés car leur nom
commence par un point, ce pourquoi ils sont souvent
désignés sous le terme dotfiles. Par manque de place, ces
fichiers spéciaux ne seront pas décrits en détails, mais je
vous encourage à vous documenter à leur propos car, vis-à-
vis du shell, les besoins de chaque utilisateur sont différents
et, pour les satisfaire, il faudra adapter ces fichiers.

Info
Si vous souhaitez voir mes dotfiles, consultez mon blog
(http://ChainsawOnATireSwing.com ou
https://github.com/rsgranne/syno-dotfiles). Grâce à GitHub, il
est très facile d’examiner les dotfiles d’autres personnes (plus
d’informations sur http://dotfiles.github.io). Avec peu d’effort et
un petit apprentissage, vous pourrez vous aussi stocker vos
dotfiles sur GitHub !

Avant d’examiner les scripts de démarrage, nous devons


tout d’abord expliquer les différences entre deux manières
de classer les shells : de connexion ou non, et mode
interactif ou non.
Un shell de connexion (login shell) est démarré par le
système d’exploitation lorsque vous ouvrez une session,
que ce soit localement ou via SSH (voir le chapitre 16, «
Travail sur le réseau »). Dans ce cas, bash configure le shell
en lisant /etc/profile, qui s’applique à tous les utilisateurs.
Ensuite, bash recherche les fichiers suivants, dans l’ordre
indiqué, en s’arrêtant au premier trouvé :
• ~/.bash_profile : identique à .profile, mais uniquement
pour bash ;
• ~/.bash_login ;
• ~/.profile : en raison de sa compatibilité avec sh, le shell
Bourne d’origine, tout shell de type Bourne l’utilisera.
Ces fichiers configurent différents éléments, comme les
variables d’environnement, qui sont ensuite transmises à
tous les processus démarrés par le shell de connexion, y
compris les sous-shells (un sous-shell est créé lorsqu’un
shell démarre un autre shell, comme dans le cas d’un script
de shell). Outre les variables d’environnement, ces fichiers
peuvent également faire référence à des programmes de
type shell que vous souhaitez configurer automatiquement
ou lancer à l’ouverture de session, comme ssh-agent (voir le
chapitre 16) et bash-completion (voir http://chnsa.ws/7d).
Un shell qui n’est pas de connexion (nonlogin shell) est
un shell qui ne demande pas l’ouverture d’une session. Par
exemple, un sous-shell est un shell de ce type, tout comme
un shell que vous ouvrez à partir de GNOME, KDE, Unity ou
tout autre environnement de bureau Linux ou gestionnaire
de fenêtres.

Info
Sachez que Mac OS X considère tous les shells comme des shells
de connexion et que vous pouvez donc simplement utiliser
.profile en place de tout le reste.

Nous venons donc de voir que les shells pouvent être de


connexion ou non, mais ils peuvent également interactifs ou
non interactifs.
Un shell interactif répond aux commandes que vous
saisissez – autrement dit, à vos interactions – et envoie le
résultat sur stdout et stderr (voir le chapitre 5, « Création de
blocs de commandes »). Un shell non interactif ressemblera
à celui utilisé par un script de shell, au cours duquel vous ne
saisissez pas réellement des commandes et obtenez
directement le résultat.

Info
Il est tout à fait possible qu’un script de shell travaille avec un
shell interactif, tout comme il est possible qu’un shell non
interactif réponde à des commandes, mais ces situations sont
plutôt rares et nous essayons plutôt de rester général.

Lorsque vous lancez un shell interactif sans ouverture de


session, bash lit et exécute /etc/bash.bashrc, à condition qu’il
existe (variable selon les distributions), ce qui s’applique à
tous les utilisateurs de bash. Ensuite, bash lit le fichier .bashrc
présent dans le répertoire personnel de l’utilisateur. Ce
fichier permet de configurer les paramètres personnels
propres à bash, comme les options (voir
http://chnsa.ws/7c) et les invites de commande (voir
http://chnsa.ws/7b).
Vous pouvez également placer des alias et des fonctions
(voir le chapitre 12, « Le shell ») dans .bashrc, mais, dès que
leur nombre devient relativement important, il est
préférable de les déplacer dans .bash_aliases (et,
éventuellement, .bash_functions, que nous verrons plus loin).
Pour invoquer .bash_aliases, ajoutez les lignes suivantes à
.bashrc :

if [ -f ~/.bash_aliases ]; then
source ~/.bash_aliases
fi

Si le fichier .bash_aliases existe, il sera lu et exécuté ;


dans le cas contraire, il sera ignoré. Vous le verrez tout au
long de cet ouvrage, il est très intéressant de créer et
d’utiliser ce fichier.
Lorsqu’un shell de connexion se termine, bash lit et
exécute ~/.bash_logout, s’il existe. Il est rarement employé,
mais ses adeptes y placent très souvent la commande clear
(voir la section suivante).

Astuce
Si vous souhaitez aller plus loin dans la personnalisation de
votre environnement bash, jetez un œil aux différentes options
de ~/.inputrc. Techniquement, la modification de ~/.inputrc ne
personnalise pas bash. En réalité, vous personnalisez la
bibliothèque Readline que bash utilise pour la modification des
lignes de commande. Quoi qu’il en soit, ce fichier permet des
choses très intéressantes. Pour vous en convaincre, consultez
mon billet publié à l’adresse
www.chainsawonatireswing.com/2012/05/13/fun-with-inputrc-
part-1/ ou les idées excellentes proposées par Brett Terpstra sur
http://brettterpstra.com/2015/07/09/shell-tricks-inputrc-binding-
fun/.

Réinitialiser un écran encombré

clear

Voici votre première commande, que vous utiliserez sans


doute très souvent tout au long de cet ouvrage : clear.
Supposons que vous ayez testé plusieurs commandes,
avec plus ou moins de succès. La fenêtre de la console est à
présent encombrée de commandes, de résultats, d’erreurs
et de divers caractères. Pour faire disparaître tout cela,
saisissez simplement clear. Vous obtenez alors une invite
située dans l’angle supérieur gauche de la fenêtre, comme
si vous repartiez de zéro.
Voilà tout. clear fait partie de ces quelques commandes
Linux qui n’attendent aucun paramètre ni option. Elle est un
moyen simple et rapide de revenir à la case départ.

Info
Au chapitre 12, nous verrons la commande history, qui permet
d’afficher des commandes précédentes et de les exécuter à
nouveau. N’oubliez pas que clear n’a aucun effet sur l’historique
et se contente d’effacer l’écran.

Conclusion

J’ai rappelé ici quelques points sur Linux qui ne sont sans
doute pas évidents pour un nouveau venu, mais ils sont
nécessaires pour comprendre le fonctionnement de
l’interpréteur de ligne de commande. Les informations
contenues dans ce chapitre vous permettront d’éviter des
migraines quand nous aborderons le passage à la pratique.
Vous ne serez pas obligé de vous demander pourquoi vous
ne pouvez pas copier un fichier dont le nom contient un
espace, comment supprimer mille fichiers à l’aide d’une
seule commande ou pourquoi la commande RM
livreàacheter.txt ne fonctionne pas. Ces connaissances de
base vous éviteront bien des erreurs.
Il est temps à présent de découvrir quelques commandes.
Allons-y !
Chapitre 2
Parcours du système de
fichiers
Ce chapitre décrit les commandes de base que vous
utiliserez quotidiennement. Si vous étiez charpentier, elles
seraient vos marteaux, vos tournevis et vos tenailles. Une
fois que vous les aurez assimilées, vous pourrez commencer
à contrôler l’interpréteur de ligne de commande et vous
découvrirez de nombreuses choses intéressantes à propos
des fichiers, des dossiers, des données et de
l’environnement. Vous découvrirez en particulier les
métadonnées – des données qui décrivent vos données –
que Linux doit conserver et vous serez probablement surpris
par leur nombre.

Info
Pour la deuxième édition de cet ouvrage, j’ai retiré les sections
qui concernent mkdir -v (qui affiche les actions effectuées par
mkdir) et rm -v (qui effectue la même chose, mais pour rm). Vous
les retrouverez sur mon site Web
(granneman.com/writing/books/linux-phrasebook). J’ai
également supprimé les sections sur touch, mkdir, cp, mv, rm et rmdir,
pour les placer dans un nouveau chapitre 3 intitulé « Création et
destruction ». Enfin, la section sur su a été déplacée au chapitre
8, « Propriétés et permissions », où elle avait plus sa place.

Lister les fichiers et les dossiers


ls

La commande ls est sans doute parmi les plus utilisées.


Avant de manipuler les fichiers d’un répertoire (n’oubliez
pas que fichier et répertoire sont interchangeables), il faut
connaître son contenu. C’est ce que permet la commande
ls, car elle liste les fichiers et les sous-répertoires d’un
répertoire.

Info
La commande ls peut sembler simple, mais elle dispose de
nombreuses options qui lui confèrent une grande souplesse.

Sans paramètre, elle affiche le contenu du répertoire


dans lequel vous vous trouvez. Lorsque vous accédez pour
la première fois au shell, vous vous trouvez dans votre
répertoire personnel. En saisissant la commande ls, vous
obtenez un résultat semblable à celui-ci :

$ ls

alias  Desktop   iso    pictures  program_files   todo

bin    documents music  podcasts  src            videos

Lister le contenu d’autres répertoires

ls [répertoire]

Il n’est pas nécessaire de se trouver dans le répertoire dont


on souhaite lister le contenu. Imaginons que vous soyez
dans votre répertoire personnel et que vous souhaitiez
afficher le contenu du répertoire music. Tapez ls suivi du nom
du répertoire dont vous souhaitez afficher le contenu. Vous
obtiendrez quelque chose comme :
$ ls music

Buddy_Holly   Clash   Donald_Fagen   new

Dans cet exemple, nous avons utilisé un chemin relatif,


mais les chemins absolus fonctionnent également.

$ ls /home/scott/music

Buddy_Holly   Clash   Donald_Fagen   new

La possibilité d’utiliser des chemins absolus ou relatifs est


très pratique lorsqu’on ne souhaite pas parcourir tout son
système de fichiers pour afficher le contenu d’un répertoire.
Vous ne vous souvenez plus si vous avez encore cette vidéo
d’un tigre du Bengale prise au zoo par votre frère ? Essayez
ceci (~ représente votre répertoire personnel) :

$ ls ~/videos

airhorn_surprise.wmv

apple_knowledge_navigator.mov
b-ball-e-mail.mov

carwreck.mpg

nerdtv_1_andy_hertzfeld

nerdtv_2_max_levchin_paypal

nerdtv_3_bill_joy

tiger.wmv

Ubuntu_Talk-Mark_Shuttleworth.mpeg

Il y a bien un fichier nommé tiger.wmv.

Lister le contenu des répertoires en


utilisant les caractères spéciaux

ls *
Vous venez de voir comment retrouver un fichier dans un
répertoire. Il existe cependant une méthode plus rapide,
mieux adaptée aux répertories qui contiennent de
nombreux fichiers. Si vous savez que la vidéo que vous
recherchez est au format Windows Media, son extension est
donc .wmv. Vous pouvez alors utiliser un caractère spécial
pour afficher tous les fichiers qui portent cette extension.

$ ls ~/videos

airhorn_surprise.wmv

apple_knowledge_navigator.mov
b-ball-e-mail.mov

carwreck.mpg

nerdtv_1_andy_hertzfeld

nerdtv_2_max_levchin_paypal

nerdtv_3_bill_joy

tiger.wmv

Ubuntu_Talk-Mark_Shuttleworth.mpeg

$ ls ~/videos/*.wmv

airhorn_surprise.wmv    tiger.wmv

Il existe une méthode encore plus rapide, également


fondée sur les caractères spéciaux : il suffit de chercher les
fichiers qui contiennent le mot tiger.

$ ls ~/videos/*tiger*

tiger.wmv

Info
Si le caractère spécial produit une correspondance avec un
répertoire, le contenu de celui-ci sera également affiché. Pour
éviter cette correspondance et l’affichage du contenu des sous-
répertoires, ajoutez l’option -d.

Afficher une liste de fichiers dans des


sous-répertoires
ls -R

Il est possible d’afficher le contenu de plusieurs sous-


répertoires à l’aide d’une seule commande. Imaginons que
vous soyez à une convention d’utilisateurs de Linux. Autour
de vous, chacun s’affaire à préparer son ordinateur quand,
tout à coup, quelqu’un demande « Personne n’aurait une
image ISO de la dernière version de Kubuntu ? » Vous vous
souvenez en avoir chargé une il y a quelques jours. Pour le
vérifier, vous saisissez la commande suivante (au lieu de ls
-R, vous pouvez aussi utiliser ls --recursive) :

$ ls -R ~/iso

/home/scott/iso:

debian-6.0.4-i386-CD-1.iso  knoppix  ubuntu

/home/scott/iso/knoppix:

KNOPPIX_V7.2.0CD-2013-06-16-EN.iso

➥KNOPPIX_V7.4.2DVD-2014-09-28-EN.iso

/home/scott/iso/ubuntu:

kubuntu-15.04-desktop-amd64.iso      ubuntu-15.04-desktop-
amd64.iso

ubuntu-14.04.3-server-amd64.iso

L’image se trouve dans ~/iso/ubuntu : kubuntu-15.04-


desktop- amd64.iso. L’option -R parcourt récursivement le
répertoire iso, en affichant son contenu et celui de tous ses
sous-répertoires. Chaque sous-répertoire est désigné par
son chemin relatif par rapport au répertoire courant. On
trouve ensuite un deux-points, puis le nom des fichiers qu’il
contient. Gardez à l’esprit que cette option récursive perd
en intérêt lorsque vous avez de nombreux éléments dans de
nombreux sous-répertoires car la liste des résultats sera
trop longue pour être affichée sur un seul écran, ce qui
complique la localisation du fichier recherché. Bien entendu,
si vous souhaitez uniquement vérifier qu’il existe de
nombreux fichiers et dossiers dans un répertoire, cette
commande sera utile, mais ce cas est plutôt rare.

Afficher une liste sur une seule colonne

ls -1

Jusqu’à présent, vous avez travaillé avec la sortie par défaut


de la commande ls. Vous aurez remarqué que les résultats
sont affichés en colonnes, classées par ordre alphabétique,
avec un minimum de deux espaces entre chaque colonne
pour améliorer la lisibilité. Comment faire pour afficher le
résultat avec une présentation différente ?
Si vous n’aimez pas cet affichage sur plusieurs colonnes,
sachez que vous pouvez obtenior le résultat de la
commande ls sur une seule colonne en utilisant la syntaxe
ls -1 (ou ls --format=single-column).

$ ls -1 ~/bin

Desktop

documents

iso

music

pictures

podcaststodo

videos

Cette liste peut être interminable si le dossier contient de


nombreux éléments. C’est encore plus vrai si vous utilisez
l’option récursive, comme dans ls -1R ~/. Dans ce cas de
figure, tenez-vous prêt à utiliser la combinaison de touches
Ctrl+C pour annuler la commande sans quoi la liste risque
de défiler interminablement.
Afficher le contenu sous forme de noms
séparés par des virgules

ls -m

Pour ceux qui sont allergiques aux colonnes, que ce soit une
ou plusieurs, il existe l’option -m (ou --format=commas) pour
afficher le résultat sous la forme d’une suite de noms
séparés par des virgules.

$ ls -m ~/

alias, bin, Desktop, documents, iso, music, pictures,


podcasts,

➥ program_files, src, todo, videos

Cette option peut aussi être pratique si vous écrivez un


script et que vous avez besoin du contenu d’un répertoire
sous forme de liste de noms séparés par des virgules, mais
il s’agit là d’une utilisation avancée.

Afficher les fichiers et les répertoires


cachés

ls -a

Jusqu’à présent, vous n’avez affiché que les fichiers visibles


dans les répertoires, mais n’oubliez pas que nombre d’entre
eux contiennent des fichiers cachés. Votre répertoire
personnel, par exemple, contient de nombreux fichiers et
répertoires masqués, tous devenus invisibles en raison du
point (.) qui se trouve au début de leur nom. Pour afficher
tous les éléments d’un répertoire, utilisez l’option -a (ou --
all).

$ ls -a ~/

.             .gimp-2.2       .openoffice.org1.9.95

..            .gksu.lock      .openoffice.org1.9

.3ddesktop    .glade2         .openoffice.org2

.abbrev_defs  .gnome          .opera

.acrorc       .gnome2         .padminrc

.adobe        .gnome2_private pictures

alias         .gnome_private  podcasts

[liste coupée en raison de sa longueur]

Signalons plusieurs choses à propos de cette liste. Pour


commencer, ls -a (a signifie all) affiche les éléments cachés
ou non, en conséquence, elle affiche .gnome et pictures.
Ensuite, vous verrez toujours apparaître les éléments . et ..,
car le point seul (.) désigne le répertoire courant, tandis que
le double point (..) désigne son répertoire parent. Ces deux
fichiers masqués existent dans tous les dossiers de votre
système et ne peuvent être supprimés. Vous les verrez
apparaître chaque fois que vous utiliserez l’option -a. Enfin,
en fonction du répertoire, cette option peut entraîner
l’affichage de très nombreux éléments.

Astuce
Nous venons d’expliquer que ls -a affiche tout ce qui débute par
un point, y compris les références aux dossiers . et ... Si vous
ne souhaitez pas voir apparaître ces deux entrées, utilisez
plutôt ls -A.

Afficher le type des fichiers

ls -F
En dehors de leur nom, la commande ls donne peu
d’informations sur les éléments d’un répertoire. Il est donc
difficile de savoir si un élément est un fichier, un répertoire
ou quelque chose d’autre. Pour résoudre ce problème,
utilisez l’option -F (ou --classify).

$ ls -F ~/bin

adblock_filters.txt  fixm3u*         pix2tn.pl*

addext*             flash.xml*      pop_login*

address_book.csv    getip*         procmail/

address_book.sxc    homesize*      programs_usual*

address_book.xls    html2text.py*  quickrename*

backup_to_chaucer*  list-urls.py*

On obtient ainsi un peu plus d’informations. L’astérisque


(*) indique qu’un fichier est exécutable. La barre oblique (/)
désigne un répertoire. Si un élément n’affiche aucun de ces
deux symboles, c’est qu’il s’agit juste d’un fichier classique.
D’autres symboles permettent d’obtenir des informations
supplémentaires, comme le montre le tableau 2.1.

Tableau 2.1 Symboles et types de fichiers


Caractère Signification
* Exécutable
/ Répertoire
Lien symbolique
1 FIFO (ou tube nommé)
= Socket

Afficher le contenu avec des couleurs

ls --color
En plus des symboles liés à l’option -F, vous pouvez aussi
demander au shell d’afficher les éléments à l’aide de
couleurs distinctives en fonction de leur type. Dans de
nombreuses distributions Linux, le shell affiche par défaut
les éléments à l’aide d’un code couleur. Si ce n’est pas le
cas pour votre installation, vous pouvez recourir à l’option --
color.

$ ls --color

adblock_filters.txt      fixm3u         pix2tn.pl

addext                 flash.xml      pop_login

address_book.csv        getip         pnocmail

address_book.sxc        homesize      programs_kill

address_book.xls        html2text.py  programs_usual

backup_ssh_to_chaucer  list-urls.py  quickrename

Dans cette configuration, les éléments en vert sont des


exécutables, ceux en bleu, des dossiers, et ceux en noir
(couleur d’affichage par défaut de mon shell), des fichiers
classiques. Le tableau 2.2 donne la signification de toutes
les couleurs existantes (n’oubliez pas qu’elles peuvent
varier en fonction de la distribution).
Tableau 2.2 Couleurs et types de fichiers
Couleur Signification
Couleur par défaut du shell Fichier standard
Vert Exécutable
Bleu Répertoire
Magenta Lien symbolique
Jaune FIFO
Magenta Socket
Rouge Archive (.tar, .zip. .deb, .rpm)
Magenta Images (.jpg, .gif, .png, .tiff)
Magenta Audio (.mp3, .ogg, .wav)
Astuce
Si vous voulez savoir précisément à quel type de fichier
correspond une couleur donnée sur votre système, saisissez
dircolors --print-database et lisez attentivement le résultat. Vous
pouvez également utiliser la commande dircolors pour modifier
les associations de couleur.

Avec l’utilisation combinée de --color et de -F, vous


pouvez savoir d’un coup d’œil le type des fichiers d’un
répertoire. Sacré progrès !

$ ls -F --color

adblock_filters.txt     fixm3u*        pix2tn.pl*

addext*                 flash.xml*    pop_login*
address_book.csv       getip*        pnocmail/

address_book.sxc       homesize*     programs_kill*

address_book.xls       html2text.py* programs_usual*

backup_ssh_to_chaucer* list-urls.py* quickrename*

Permissions, propriétés et autres

ls -l

Vous avez appris à mettre en forme les résultats de la


commande ls pour afficher plus d’informations sur le
contenu des répertoires. Mais comment avoir des
informations sur les fichiers et les dossiers, comme leur
taille, leur propriétaire et leurs autorisations ? Pour obtenir
ce type d’informations, utilisez l’option -l (ou --format=long).

$ ls -l ~/bin

total 2951

-rw-r--r--  1 scott  scott  15058  2015-10-03  18:49

➥adblock_filters.txt

-rwxr-xr--  1 scott  root      33  2015-04-19  09:45

➥addext

-rw-r--r--  1 scott  scott  84480  2015-04-19  09:45

➥addressbook.xls

-rwxr--r--  1 scott  scott     55  2015-04-19  09:45

➥batchprint_home

drwxr-xr-x  9 scott  scott   1080  2015-09-22  14:42

➥bin_on_bacon

-rwxr-xr--  1 scott  scott    173  2015-04-19  09:45

➥changeext

-rwxr-xr--  1 scott  root     190  2015-04-19  09:45

➥convertsize

drwxr-xr-x  2 scott  scott     48  2015-04-19  09:45

➥credentials

[liste coupée et adaptée en raison de sa longueur]

L’option -l signifie « long ». Vous le constatez, elle


permet d’obtenir de nombreuses informations sur les
éléments d’un répertoire. Étudionsles de droite à gauche.
Tout à droite se trouvent les noms des éléments. Vous
souhaitez que ls affiche plus d’informations à leur sujet ?
Ajoutez l’option -F : ls -lF. Vous pouvez aussi employer
l’option --color : ls -lF --color.
Un peu plus à gauche se trouvent la date et l’heure,
celles de la dernière modification des fichiers. La date est
exprimée sous la forme Année-Mois-Jour et l’heure est sous
un format sur vingt-quatre heures.
On trouve ensuite la taille des éléments en octets, mais
cela se complique un peu avec les répertoires. Le dossier
bin_on_bacon a une taille de 1 080 octets, soit un peu plus de
1 Ko, alors qu’il ne contient que 887 Ko. Le répertoire
credentials fait 48 octets d’après ls -l. Pourtant, il ne
contient rien. Alors, que se passe-t-il ?
Souvenez-vous qu’au chapitre 1 nous avons vu que les
répertoires ne sont rien d’autre que des fichiers spéciaux
possédant une liste de leur « contenu ». Dans le cas
présent, le répertoire credentials ne contient que .., le
répertoire parent, comme tous les dossiers, c’est pourquoi il
fait 48 octets alors qu’il est vide. Le dossier bin_on_bacon
contient 30 éléments et fait 1 080 octets.
Les deux colonnes suivantes indiquent le propriétaire de
l’élément et son groupe. Comme vous pouvez le voir ici,
presque tous les fichiers appartiennent à scott et au groupe
scott, sauf addext et convertsize qui sont la propriété de scott,
mais appartiennent au groupe root.

Info
Ces permissions devront être modifiées. Vous verrez comment
procéder au chapitre 8. Les commandes à employer seront chown
et chgrp.

L’avant-dernière colonne contient un nombre. Lorsque


l’élément est un fichier, il indique combien de liens
physiques pointent vers ce fichier (pour de plus amples
informations, consultez la section « Créer un lien vers un
autre fichier ou répertoire » au chapitre 3). Lorsqu’il s’agit
d’un répertoire, il indique son nombre de sous-répertoires, y
compris les dossiers cachés . (le répertoire courant) et .. (le
répertoire parent) ; cela signifie que si le répertoire ne
comprend aucun sous-répertoire, ce nombre sera 2.
Nous voici maintenant dans la dernière colonne, la plus à
gauche, celle des permissions pour les fichiers et les
répertoires. Ce qui s’affiche peut sembler très ésotérique
mais, en fait, c’est très simple à comprendre une fois que
l’on a les clés appropriées. Il y a dix éléments divisés en
quatre groupes (même si cela ne se remarque pas au
premier coup d’œil). Le premier groupe correspond au
premier caractère, le deuxième, aux caractères 2 à 4, le
troisième, aux caractères 5 à 7, et le quatrième et dernier
groupe, aux caractères 8 à 10. Suivant ce principe, les
autorisations pour le répertoire credentials peuvent être
réparties ainsi : d|rwx|r-x|r-x.
Le premier groupe indique le type de l’élément. Vous
avez déjà vu qu’il était possible d’obtenir de telles
informations à l’aide des options -F et --color, mais avec -l,
la présentation est un peu différente. Le d signifie que
credentials est un répertoire (directory). Un symbole - en
première position signifie qu’on a affaire à un fichier (même
s’il s’agit d’un exécutable, ls -l affiche un - ; les options -F
et --color apportent donc plus de précisions). Cette
première position peut bien entendu être occupée par
d’autres symboles (voir le tableau 2.3).
Tableau 2.3 Caractères de permission et types de fichiers
Caractère Signification
- Fichier classique
- Fichier exécutable
d Répertoire
l Lien symbolique
s Socket
b Périphérique bloc
c Périphérique caractère
p Tube nommé (ou FIFO)

Astuce
Pour afficher une liste de fichiers contenant pratiquement tous
les caractères du tableau précédent, essayez ls -l/dev.

Les neuf caractères suivants, qui composent les groupes


2 à 4, correspondent respectivement aux permissions
données au propriétaire du fichier, au groupe du fichier et à
tous les autres utilisateurs. Dans le cas de addext, les
permissions sont rwxr-xr--, ce qui signifie que le
propriétaire, scott, a les permissions rwx, que le groupe
(scott également) a les permissions r-x et que les autres
utilisateurs ont les permissions r--. Mais qu’est-ce que cela
veut dire ?
Dans chaque cas, r signifie « lecture autorisée », w
signifie « écriture autorisée » et x, « exécution autorisée ».
Le symbole - signifie « action interdite ». Si le - est situé là
où un r devrait figurer, c’est que la lecture est interdite.
Cela vaut aussi pour le w et le x.
Si on regarde l’élément addext et ses permissions, rwxr-xr-
-, il apparaît donc que le propriétaire (scott) peut lire, écrire
et exécuter le fichier, que les membres du groupe (root)
peuvent lire et exécuter le fichier, mais pas le modifier, et
que les autres utilisateurs peuvent lire le fichier, mais ni le
modifier, ni l’exécuter.
Maintenant que vous avez compris à quoi correspondent
les permissions, vous remarquerez que certaines
combinaisons semblent récurrentes. Il est, par exemple,
fréquent de rencontrer la combinaison rw-r--r-- ; elle
signifie que le propriétaire peut lire et modifier le fichier,
mais que tous les autres ne peuvent que le lire. Pour les
programmes, on trouve souvent la combinaison rwxr-xr-x,
qui signifie que tout le monde est autorisé à lire et exécuter
le fichier, mais que seul son propriétaire peut en changer le
contenu.
Le système est un peu différent avec les répertoires. Les
permissions r, w et x sont claires pour les fichiers, elles
permettent de lire, de modifier et d’exécuter un fichier. Mais
que signifie exécuter un répertoire ?
Commençons par le plus facile : r. Il signifie que
l’utilisateur peut afficher le contenu du répertoire à l’aide de
la commande ls. Le w signifie qu’il peut ajouter des
éléments dans le répertoire, renommer ceux qui s’y
trouvent ou les supprimer. Quant au x, il lui donne la
possibilité d’accéder à un répertoire pour y exécuter des
commandes s’appliquant aux fichiers qu’il contient, ou
d’accéder aux sous-répertoires du répertoire auquel la
permission a été attribuée.
L’option -l est donc très puissante, mais elle le devient
encore plus une fois combinée à d’autres. Vous avez déjà vu
l’option -a qui permet d’afficher tous les éléments d’un
répertoire. Vous n’aurez donc aucun mal à comprendre la
fonction de la combinaison -la (ou --format=long --all).

$ ls -la ~/

drwxr-xr-x  2 scott scott   200 2015-07-28 01:31 alias

drwx------  2 root  root     72 2015-09-16 19:14 .aptitude

-rw-------  1 scott scott  8800 2015-10-18 19:55 .bash_history

-rw-r--r--  1 scott scott    69 2015-04-20 11:00 .bash_logout

-rw-r--r--  1 scott scott   428 2015-04-20 11:00 .bash_profile

-rw-r--r--  1 scott scott  4954 2015-09-13 19:46 .bashrc

[liste coupée et adaptée en raison de sa longueur]

Inverser l’ordre d’affichage des éléments

ls -r

Si vous n’aimez pas l’ordre alphabétique par défaut de -l,


vous pouvez l’inverser en ajoutant l’option -r (ou --reverse).

$ ls -lar ~/

-rw-r--r--  1 scott scott  4954 2015-09-13 19:46  .bashrc

-rw-r--r--    1 scott  scott      428  2015-04-


20 11:00  .bash_profile

-rw-r--r--  1 scott scott    69 2015-04-20 11:00  .bash_logout

-rw-------    1 scott  scott    8800  2015-10-


18 19:55  .bash_history

drwx------  2 root  root     72 2015-09-16 19:14  .aptitude

drwxr-xr-x  2 scott scott   200 2015-07-28 01:31  alias

[liste coupée et adaptée en raison de sa longueur]

Info
Souvenez-vous que -r est différent de -R. -r permet d’obtenir un
classement alphabétique inverse, tandis que -R permet
d’afficher la liste des éléments des sous-répertoires. La
confusion est facile.
Lorsqu’on utilise -l, les fichiers et répertoires sont
affichés par ordre alphabétique de leur nom. L’ajout de -r
inverse le classement, mais toujours en tenant compte du
nom des fichiers. Vous pouvez utiliser -r pratiquement
chaque fois que vous employez la commande ls pour
inverser l’ordre d’affichage du résultat de la commande
exécutée.

Trier le contenu par la date et l’heure

ls -t

Vous préférez parfois trier le contenu d’un répertoire en


fonction de la date et de l’heure. Pour cela, utilisez l’option -
t (ou --sort=time) avec l’option -l. Pour inverser l’ordre de
tri, utilisez -tr (ou --sort=time --reverse) avec -l. Le tri en
ordre inverse peut se révéler très pratique. En effet, le
contenu le plus récent va être affiché à la fin de la liste et
sera donc plus facile à voir car c’est là que se trouvera
l’invite lorsque la commande sera terminée.

$ ls -latr ~/

-rw-------      1 scott  scott    8800  2015-10-


18 19:55  .bash_history

drwx------  15 scott scott  1280 2015-10-18 20:07  .opera

drwx------   2 scott scott    80 2015-10-18 20:07  .gconfd

drwxr-xr-x   2 scott scott   432 2015-10-18 23:11  .qt

drwxr-xr-x 116 scott scott  5680 2015-10-18 23:11  .

drwx------   3 scott scott   368 2015-10-18 23:12  .gnupg

drwxr-xr-x  12 scott scott  2760 2015-10-18 23:14  bin

drwx------   4 scott scott   168 2015-10-19 00:13  .Skype

[liste coupée et adaptée en raison de sa longueur]

Tous ces éléments, sauf le dernier, ont été modifiés le


même jour. Le dernier élément se serait affiché en premier
si on avait utilisé l’option -r, ce qui aurait inversé le listing.
Info
Notez que l’on utilise quatre options simultanément dans cette
commande : -latr. On aurait pu utiliser la syntaxe -l -a -t -r,
mais à quoi bon saisir tous ces traits d’union et espaces ? Il est
plus rapide et plus simple de combiner toutes les options. La
version longue des options (celle qui commence par deux traits
d’union suivis d’un mot ou deux) ne peut être combinée et doit
être saisie séparément : -la --sort=time --reverse. Sachez que cette
technique fonctionne avec de nombreuses commandes et
programmes Linux, mais ce n’est pas systématique.

Trier le contenu en fonction de la taille

ls -S

On peut également trier la liste en fonction de la taille des


fichiers en plus de trier alphabétiquement, par extension ou
par la date et l’heure. Pour un tri en fonction de la taille,
utilisez -S (ou --sort=size).

$ ls -laS ~/

-rw-r--r--  1  scott  scott  109587  2015-10-19  11:53  .xsession-


errors

-rw------- 1 scott scott  40122 2015-04-20 11:00 .nessusrc

-rw-r--r-- 1 scott scott  24988 2015-04-20 11:00 .abbrev_defs

-rwxr--r-- 1 scott scott   5465 2015-10-12 15:45 .vimrc

-rw------- 1 scott scott   1794 2015-10-19 10:59 .viminfo

-rw------- 1 scott scott   8757 2015-10-19 08:43 .bash_history

[liste coupée et adaptée en raison de sa longueur]

Lors d’un tri par taille, les éléments les plus volimineux
apparaissent en premier. Pour inverser cet ordre, utilisez
l’option -r.
Exprimer la taille des fichiers en ko, Mo
et Go

ls -h

À la section précédente, la valeur 15465 devant .vimrc


signifie que ce fichier fait environ 15 ko, mais il n’est pas
toujours facile de faire cette conversion mentalement pour
exprimer le poids d’un fichier en kilooctets, mégaoctets ou
gigaoctets. La plupart du temps, il est plus pratique
d’employer l’option -h (ou --human-readable) pour afficher le
résultat.

$ ls -laSh ~/

-rw-r--r--    1  scott  scott  100K  2015-10-19  11:44    .xsession-


errors

-rw-------  1 scott scott  40K 2015-04-20 11:00  .nessusrc

-rw-r--r--  1 scott scott  25K 2015-04-20 11:00  .abbrev_defs

-rwxr--r--  1 scott scott  16K 2015-10-12 15:45  .vimrc

-rw-------  1 scott scott  12K 2015-10-19 10:59  .viminfo

-rw-------  1 scott scott 8.6K 2015-10-19 08:43  .bash_history

[liste coupée et adaptée en raison de sa longueur]

Dans cet exemple, le K signifie kilo-octets. Si les fichiers


avaient été suffisamment gros, vous auriez vu un M pour
mégaoctets et un G pour gigaoctets. Certains d’entre vous
se demandent peut-être pourquoi les 40 122 octets de
.nessusrc sont devenus 40K avec l’utilisation de -h. Souvenez-
vous qu’un kilo-octet fait 1 024 octets, donc si on divise 40
122 par 1 024, on obtient 39,1816406, que -h arrondit à 40
ko. Un mégaoctet vaut 1 048 576 octets et un gigaoctet
vaut 1 073 741 824 octets. Avec toutes ces unités de
mesure, on arrondit la taille réelle du fichier. Si vous
souhaitez des puissances de 10 exactes dans les divisions
(c’est-à-dire des « kibioctets », des « mébioctets », etc. ;
voir le chapitre 6, « Affichage du contenu des fichiers »),
essayez l’option --si.

Info
Dans mon fichier ~/.bashrc, j’ai défini les alias suivants qui me
servent depuis des années. Utilisez ce que vous avez appris
dans cette section pour étendre ces exemples et créer des alias
qui répondent à vos besoins (pour plus d’informations sur les
alias, consultez le chapitre 12).
alias l=’ls -F’

alias l1=’ls -1F

alias la=’ls -aF’

alias ll=’ls -laFh’

alias ls=’ls -F’

Afficher le chemin du répertoire courant

pwd

À force d’afficher le contenu de répertoires un peu partout


sur votre système, vous risquez de ne plus trop savoir où
vous vous trouvez. Comment savoir dans quel répertoire on
travaille actuellement ? Utilisez la commande pwd qui signifie
print working directory (afficher le répertoire de travail).

Info
Le mot print dans l’expression print working directory signifie
afficher à l’écran, non imprimer sur une imprimante.

La commande pwd affiche le chemin complet et absolu du


répertoire de travail courant. Vous ne l’utiliserez pas tout le
temps, mais elle peut se révéler très utile si vous êtes
perdu.
$ pwd

/home/scott/music/new

Vous devez toutefois être conscient d’un point, car il


perturbe souvent les utilisateurs. Le chapitre 3 détaillera la
commande ln (« Créer un lien vers un autre fichier ou
répertoire »). Si vous souhaitez comprendre parfaitement ce
qui suit, n’hésitez pas à lire dès à présent sa description. En
supposant que vous l’ayez fait, examinez les résultats
suivants :

# ls -l

lrwxrwxrwx  scott scott  websites -> /var/www/

$ cd websites

$ pwd

/websites

$ pwd -P

/var/www

Il existe donc un lien symbolique, dont la source est


websites et la cible /var/www. Nous changeons de répertoire
avec cd sur le lien symbolique et saisissons pwd. Nous
obtenons le répertoire logique /websites, la source du lien
symbolique, qui n’est pas le répertoire cible de travail
courant /var/www. Voilà le comportement par défaut de pwd,
ce qui équivaut à exécuter pwd -L (ou --logical).
En revanche, si nous saisissons pwd -P (ou --physical),
nous obtenons la cible du lien symbolique, c’est-à-dire
/var/www.
Je ne connais pas vos préférences, mais lorsque j’utilise
pwd, je souhaite connaître l’emplacement physique réel (la
cible), non l’emplacement logique (la source). L’option -P
doit donc, pour moi, être celle par défaut et je place donc
l’alias suivant dans mon fichier .bash_ aliases (voir la section
« Créer un nouvel alias permanent » au chapitre 12) :

alias pwd="pwd -P"

Vous savez à présent utiliser pwd, ainsi que les quelques


petites difficultés que vous pourriez rencontrer.

Changer de répertoire

cd

On peut consulter le contenu de n’importe quel répertoire


en indiquant simplement son chemin mais, souvent, on
souhaite accéder directement au répertoire en question.
C’est là qu’intervient la commande cd, l’une des plus
employées par les aficionados de l’interpréteur de ligne de
commande.
La commande cd est simple à utiliser : saisissez cd suivi
du nom du répertoire à atteindre. Vous pouvez indiquer un
chemin relatif fondé sur l’emplacement actuel, cd src ou cd
../../, ou un chemin absolu, comme cd /tmp ou cd
/home/scott/bin.

Atteindre le répertoire personnel

cd ~

Il est important de connaître les raccourcis utiles de la


commande cd. Quel que soit l’emplacement où vous vous
trouvez, saisissez cd (sans aucun paramètre) pour accéder
directement à votre répertoire personnel – cela permet de
gagner beaucoup de temps. Si vous préférez, vous pouvez
utiliser la syntaxe cd ~, puisque le symbole ~ désigne le
répertoire personnel.
$ pwd

/home/scott/music

$ cd ~

$ pwd

/home/scott

Atteindre le répertoire précédent

cd -

Autre possibilité intéressante, la commande cd - permet


de revenir au répertoire précédent et exécute la commande
pwd pour afficher le chemin du nouvel emplacement atteint.
Il s’agit, pour le shell, de l’équivalent du bouton Retour d’un
navigateur Web graphique. Voici ce que cela donne en
pratique :

$ pwd

/home/scott

$ cd music/new

$ pwd

/home/scott/music/new

$ cd -

/home/scott

La commande cd - est très pratique lorsqu’on souhaite


atteindre un répertoire, y réaliser une action, puis revenir au
répertoire dans lequel on se trouvait précédemment.
L’affichage d’informations complémentaires grâce à la
commande pwd est la cerise sur le gâteau qui vous permet
de savoir très précisément où vous êtes.

Conclusion
Si ce chapitre avait été un cours de droit, vous auriez appris
ce que sont les infractions, les délits et les crimes. S’il avait
été un cours de maintenance informatique, vous auriez
étudié la RAM, les disques durs et les cartes mères. Puisqu’il
s’agit d’un livre sur le shell de Linux, vous avez découvert
les commandes indispensables pour utiliser efficacement la
ligne de commande : ls, pwd et cd. Maintenant que vous
savez comment parcourir le système de fichiers, il est
temps de vous informer sur deux choses qui régissent
l’univers : la création et la destruction. Non seulement vous
saurez observer votre environnement, mais vous saurez
également le modifier à votre guise. Poursuivez votre
lecture !
Chapitre 3
Création et destruction
Dans chaque culture, des histoires se transmettent de
génération en génération pour expliquer comment le monde
s’est formé (cosmogonie) et comment il finira par
disparaître (eschatologie). Dans la mythologie nordique, les
deux lieux originaux de l’univers sont Muspellsheimr et
Niflheimr, tandis que Ragnarok renvoie à sa fin. Pour le
zoroastrisme, vous lirez le Bundahishn, puis vous vous
documenterez sur frashokereti. Pour les chrétiens, tout
commencerait avec la Genèse et finirait par l’Apocalypse.
Linux n’est pas une religion, mais ses adeptes ont bien la
capacité de créer et de détruire. Poursuivez votre lecture et
servezvous de votre nouveau pouvoir avec sagesse !

Info
Lorsque j’ai actualisé cet ouvrage pour sa deuxième édition, j’ai
retiré les sections qui concernent mkdir -v (qui montre les actions
de mkdir pendant son travail) et rm -v (qui fait de même, mais
pour rm). Vous les retrouverez sur mon site Web
(granneman.com/writing/books/linux-phrasebook).

Appliquer l’heure courante à un fichier

touch

Vous n’utiliserez pas la commande touch tous les jours, mais


vous en aurez besoin plus loin dans cet ouvrage. Il est donc
bon d’examiner dès à présent son fonctionnement. Sa
première raison d’être est de permettre la mise à jour des
dates d’accès et de modification d’un fichier, mais ce n’est
pas à cela que vous l’utiliserez principalement. En général,
elle est employée pour sa fonction secondaire, qui est
indéniablement plus utile que sa principale !

Info
Vous ne pourrez pas utiliser la commande touch pour changer
l’horodatage d’un fichier si vous ne possédez pas les
permissions d’écriture pour ce fichier.

Pour mettre à jour simultanément les dates d’accès et de


modification d’un fichier (ou d’un répertoire), exécutez
simplement la commande touch de base.

$ ls -l ~/

drwxr-xr-x  scott scott 2015-10-18 12:07  todo

drwxr-xr-x  scott scott 2015-10-18 12:25  videos

-rw-r--r--  scott scott 2015-09-10 23:12  wireless.log

$ touch wireless.log

$ ls -l ~/

drwxr-xr-x  scott scott 2015-10-18 12:07  todo

drwxr-xr-x  scott scott 2015-10-18 12:25  videos

-rw-r--r--  scott scott 2015-10-19 14:00  wireless.log

Grâce à touch, les dates d’accès et de modification du


fichier wireless.log ont été changées, même si la commande
ls -l ne permet d’afficher que la date de modification. Le
fichier n’avait pas été utilisé depuis plus d’un mois, mais
grâce à touch on a l’impression qu’on vient juste de le
manipuler.
Vous pouvez être plus spécifique si vous le souhaitez.
Pour ne modifier que l’heure d’accès, utilisez l’option -a (ou
--time=access). Pour ne changer que l’heure de modification,
utilisez l’option -m (ou --time=modify).
Appliquer une date donnée à un fichier

touch -t

Vous n’êtes pas limité à la date et à l’heure courante. Vous


pouvez choisir n’importe quelle date ou heure, tant que
vous respectez la syntaxe -t [[SS]AA]MMJJhhmm[.ss], décrite
au tableau 3.1.

Tableau 3.1 Syntaxe de modification de l’horodatage d’un fichier


Caractères Signification
SS Deux premiers chiffres de l’année
AA Deux derniers chiffres de l’année
• Compris entre 00 et 68, on suppose que les deux
premiers chiffres (SS) sont 20
• Compris entre 69 et 99, on suppose que les deux
premiers chiffres (SS) sont 19
• S’il n’y a rien, on suppose que c’est l’année courante
MM Mois (01-12)

Caractères Signification
JJ Jour (01-31)
hh Heure (01-23)
mm Minutes (00-59)
ss Secondes (00-59)

Il est crucial d’insérer un zéro chaque fois qu’un nombre


que l’on souhaite utiliser n’est pas constitué de deux
chiffres ; sinon la syntaxe n’est pas correcte. Pour vous aider
à y voir plus clair, voici quelques exemples d’utilisation de
l’option -t.
$ ls -l

-rw-r--r--  scott scott 2015-10-19 14:00  wireless.log

$ touch -t 197002160701 wireless.log

$ ls -l

-rw-r--r--  scott scott 1970-02-16 07:01  wireless.log

$ touch -t 9212310000 wireless.log

$ ls -l

-rw-r--r--  scott scott 1992-12-31 00:00  wireless.log

$ touch -t 3405170234 wireless.log

$ ls -l

-rw-r--r--  scott scott 2034-05-17 02:34  wireless.log

$ touch -t 10191703 wireless.log

$ ls -l

-rw-r--r--  scott scott 2015-10-19 17:03  wireless.log

Pour commencer, on constate que la date et l’heure


courantes de wireless.log sont 2015-10-19 14:00. On fait
ensuite un retour dans le passé jusqu’à 1970-02-16 07:01, puis
un petit bond en avant jusqu’à 1992-12-31 00:00. Pour finir, on
se projette dans le futur jusqu’à 2034-05-17 02:34, âge béni
où l’humanité vivra en paix et où tout le monde utilisera des
logiciels open-source. Bien évidemment, on finit par revenir
à la réalité du jour.
Vous pouvez tirer deux enseignements de cette
démonstration. Pour revenir en arrière de trois décennies,
on a indiqué l’année dans sa forme complète à quatre
chiffres (1970), le mois (02), le jour (16), l’heure (07) et la
minute (01). Il n’est pas nécessaire de préciser le nombre de
secondes. Après cette partie du code, on n’a plus jamais
exprimé la date sous forme de nombre à quatre chiffres.
Dans la syntaxe 9212310000, 92 étant compris dans la
plage 69-99, touch suppose que les deux premiers chiffres
de l’année (le siècle) sont 19. 34 dans 3405170234 est
compris entre 00 et 68, touch suppose donc que les deux
premiers chiffres sont 20. Lors de la dernière utilisation de
touch, aucune information relative à l’année n’a été saisie.
On a juste le mois (10), le jour (19), l’heure (17) et la minute
(03). La commande en déduit donc qu’il est question de
l’année courante, 2015. En maîtrisant touch, vous pouvez
modifier l’horodatage des fichiers quand bon vous semble.

Créer un nouveau fichier vide

touch

La modification de l’horodatage n’est pas la première raison


de l’utilisation de touch. Cette commande a un effet
intéressant lorsqu’elle est utilisée sur un fichier qui n’existe
pas : elle crée un nouveau fichier portant le nom spécifié.

$ ls -l ~/

drwxr-xr-x  scott scott 2015-10-19 11:36  src

drwxr-xr-x  scott scott 2015-10-18 12:25  videos

$ touch test.txt

$ ls -l ~/

drwxr-xr-x  scott scott 2015-10-19 11:36  src

-rw-r--r--  scott scott 2015-10-19 23:41  test.txt

drwxr-xr-x  scott scott 2015-10-18 12:25  videos

Pourquoi créer un fichier de cette façon ? Imaginons que


vous souhaitiez créer un fichier et lui donner un contenu
plus tard ou que vous ayez besoin de créer plusieurs fichiers
pour tester une commande que vous venez de découvrir. Ce
sont deux raisons de cette utilisation de la commande touch
et vous en découvrirez d’autres à mesure que vous vous
familiariserez avec le shell.

Créer un nouveau répertoire

mkdir
La commande touch permet de créer un fichier vide, mais
comment créer un nouveau répertoire ? Avec la commande
mkdir, tout simplement.

$ ls -l

drwxr-xr-x  scott scott 2015-10-19 11:36  src

drwxr-xr-x  scott scott 2015-10-18 12:25  videos

$ mkdir test

$ ls -l

drwxr-xr-x  scott scott 2015-10-19 11:36  src

drwxr-xr-x  scott scott 2015-10-19 23:50  test

drwxr-xr-x  scott scott 2015-10-18 12:25  videos

Info
Sur la plupart des systèmes, les propriétaires des nouveaux
répertoires créés avec mkdir se voient attribuer les permissions
en lecture, écriture et exécution, alors que les groupes et les
autres utilisateurs n’ont que les permissions de lecture et
d’exécution. Si vous souhaitez modifier ce comportement, lisez
ce qui concerne la commande chmod au chapitre 8, « Propriétés et
permissions ».

Vous serez sans doute heureux d’apprendre que votre


shell ne vous abandonne pas : si vous tentez de créer un
répertoire portant le même nom qu’un répertoire existant, il
affichera un message d’erreur.

$ mkdir test

mkdir: cannot create directory ‘test’: File exists

Créer un nouveau répertoire et ses sous-


répertoires

mkdir -p
Si vous souhaitez créer un sous-répertoire dans un sous-
répertoire dans un sous-répertoire, la tâche peut sembler
fastidieuse. Il faut créer le premier sous-répertoire, faire un
cd pour y accéder, créer un deuxième sous-répertoire,
refaire un cd, puis créer un troisième sous-répertoire.
Heureusement, mkdir est doté d’une option permettant de
rationaliser ce type de processus : -p (ou --parents).

$ ls -l

drwxr-xr-x  scott scott 2015-10-19 11:36  src

drwxr-xr-x  scott scott 2015-10-18 12:25  videos

$ mkdir -p pictures/personal/family

$ ls -l

drwxr-xr-x  scott scott 2015-10-20 00:12  pictures

drwxr-xr-x  scott scott 2015-10-19 11:36  src

drwxr-xr-x  scott scott 2015-10-18 12:25  videos

$ cd pictures

$ ls -l

drwxr-xr-x  scott scott 2015-10-20 00:12  personal

$ cd personal

$ ls -l

drwxr-xr-x  scott scott 2015-10-20 00:12  family

Copier des fichiers

cp

La copie de fichiers est une tâche récurrente pour tous les


utilisateurs, quel que soit le système qu’ils utilisent. L’une
des commandes les plus vénérables du shell Linux est cp,
qui permet de copier des fichiers et des répertoires. Il suffit
pour cela de saisir cp suivi du nom du fichier à copier, puis
du nouveau nom de la copie. La syntaxe se résume donc à
cp source cible.
$ pwd

/home/scott/libby

$ ls

libby.jpg

$ cp libby.jpg libby_bak.jpg

$ ls

libby_bak.jpg  libby.jpg

Cet exemple est simple car le fichier est copié dans le


même répertoire que le fichier d’origine. Vous pouvez
également le copier dans un autre répertoire ou même
copier un fichier depuis un répertoire dans lequel vous
n’êtes pas actuellement vers un autre répertoire de votre
système de fichiers.

$ ls ~/libby

libby_bak.jpg  libby.jpg

$ cp pictures/dogs/libby_arrowrock.jpg
~/libby/libby_arrowrock.jpg

$ ls ~/libby

libby_arrowrock.jpg  libby_bak.jpg  libby.jpg

Dans cet exemple, on utilise le même nom de fichier,


libby_ arrowrock.jpg, mais cela ne pose pas de problème
puisque la copie se fait entre deux répertoires distincts.
Dans le premier exemple en revanche, on a utilisé un
nouveau nom pour la copie, libby_bak.jpg, car le processus
se déroulait dans le même répertoire.
Si vous souhaitez copier un fichier d’un répertoire vers
votre répertoire de travail courant, utilisez simplement la
notation . (souvenezvous que vous avez vu précédemment
que le symbole « . » désigne le répertoire courant ; vous en
voyez à présent une utilisation pratique). Bien entendu, il
est impossible de changer le nom lorsqu’on utilise la
notation ., car il s’agit d’un raccourci pour le nom de fichier
d’origine.
$ ls

libby_bak.jpg  libby.jpg

$ cp pictures/dogs/libby_arrowrock.jpg .

$ ls

libby_arrowrock.jpg  libby_bak.jpg  libby.jpg

Il n’est pas nécessaire de spécifier un nom de fichier pour


la cible si ce fichier cible doit figurer dans un autre
répertoire. Il suffit de fournir le nom du répertoire.

$ ls -l

drwxr-xr-x  scott scott 2015-10-18 12:35  iso

drwxr-xr-x  scott scott 2015-10-20 12:34  libby

drwxr-xr-x  scott scott 2015-09-29 23:17  music

drwxr-xr-x  scott scott 2015-10-16 12:34  pictures

$ ls libby

libby_arrowrock.jpg  libby_bak.jpg  libby.jpg

$ cp pictures/dogs/libby_on_couch.jpg libby

$ ls libby

libby_arrowrock.jpg  libby_bak.jpg  libby.jpg

➥libby_on_couch.jpg

Dans l’exemple précédent, il faut être certain que le


répertoire nommé libby existe pour que libby_on_couch.jpg
puisse y être copié, sans quoi vous vous retrouverez avec
un fichier nommé libby dans votre répertoire personnel.

Copier des fichiers à l’aide de caractères


spéciaux

cp *

Soyons encore plus paresseux et voyons comment copier


plusieurs fichiers à la fois grâce aux caractères spéciaux. Si
vous avez soigneusement nommé vos fichiers, vous
gagnerez du temps puisque vous pourrez les traiter par
groupes.

$ pwd

/home/scott/libby

$ ls ~/pictures/dogs

libby_arrowrock.jpg  libby_by_pool_03.jpg  libby_on_floor_03.j
pg

libby_by_pool_01.jpg
libby_on_floor_01.jpg  libby_on_floor_04.jpg

libby_by_pool_02.jpg libby_on_floor_02.jpg

$ ls

libby_arrowrock.jpg  libby_bak.jpg         libby.jpg

libby_on_couch.jpg

$ cp ~/pictures/dogs/libby_by_pool*.jpg .

$ ls

libby_arrowrock.jpg  libby_by_pool_02.jpg  libby_on_couch.jpg

libby_bak.jpg        libby_by_pool_03.jpg  libby_by_pool_01.jp
g

libby.jpg

Vous n’êtes pas limité au caractère spécial *. Vous pouvez


identifier plus précisément les fichiers à copier en utilisant
les crochets. Si vous souhaitez copier les trois premières
images libby_on_floor, mais pas la quatrième, c’est très
simple.

$ pwd

/home/scott/libby

$ ls ~/pictures/dogs

libby_arrowrock.jpg  libby_by_pool_03.jpg  libby_on_floor_03.j
pg

libby_by_pool_01.jpg
libby_on_floor_01.jpg  libby_on_floor_04.jpg

libby_by_pool_02.jpg libby_on_floor_02.jpg

$ ls

libby_arrowrock.jpg  libby_bak.jpg  libby.jpg  libby_on_couch.
jpg

$ ls

libby_arrowrock.jpg  libby_bak.jpg  libby.jpg  libby_on_couch.
jpg

$ cp ~/pictures/dogs/libby_on_floor_0[1-3].jpg .

$ ls

libby_arrowrock.jpg  libby_on_couch.jpg    libby_on_floor_03.j
pg

libby_bak.jpg        libby_on_floor_01.jpg

libby.jpg            libby_on_floor_02.jpg

Copier des fichiers en mode bavard

cp -v

L’ajout de l’option -v (ou --verbose) permet d’afficher la


progression des copies durant l’exécution d’une commande
cp.

$ pwd

/home/scott/libby

$ ls ~/pictures/dogs

libby_arrowrock.jpg  libby_by_pool_03.jpg  libby_on_floor_03.j
pg

libby_by_pool_01.jpg
libby_on_floor_01.jpg  libby_on_floor_04.jpg

libby_by_pool_02.jpg libby_on_floor_02.jpg

$ ls

libby_arrowrock.jpg  libby_bak.jpg  libby.jpg  libby_on_couch.
jpg

$ cp -v ~/pictures/dogs/libby_on_floor_0[1-3].jpg .

‘/home/scott/pictures/dogs/libby_on_floor_01.jpg’ ->

➥’./libby_on_floor_01.jpg’

‘/home/scott/pictures/dogs/libby_on_floor_02.jpg’ ->

➥‘./libby_on_floor_02.jpg’

‘/home/scott/pictures/dogs/libby_on_floor_03.jpg’ ->

➥‘./libby_on_floor_03.jpg’

$ ls

libby_arrowrock.jpg  libby_on_couch.jpg    libby_on_floor_03.j
pg

libby_bak.jpg                libby_on_floor_01.jpg    libby.jpg


libby_on_floor_02.jpg

L’option -v sert à savoir précisément quelles sont les


tâches exécutées par la commande cp. Elle permet
d’omettre la dernière commande ls qui ne sert qu’à vérifier
le bon fonctionnement de la copie.

Info
Plus vous gagnerez en expérience avec la ligne de commande
de Linux, plus vous constaterez que de nombreux programmes
utilisent l’option -v pour basculer en mode verbeux. Vous
retrouverez une cohérence similaire avec d’autres options. La
mémorisation des commandes n’est donc pas si difficile !

Empêcher l’écrasement accidentel par


copie de fichiers

cp -i

L’exemple précédent montre quelque chose d’important à


propos de la commande cp. Dans la section « Copier des
fichiers à l’aide de caractères spéciaux », vous avez copié
trois images libby_on_floor dans le répertoire libby ; dans
l’exemple précédent, vous avez de nouveau copié les trois
mêmes images libby_on_floor dans le répertoire libby. Vous
avez donc écrasé des fichiers existants sans que cp ne vous
prévienne, car c’est ainsi que fonctionne Linux : il suppose
que vous savez ce que vous faites et ne vous prévient pas
d’un risque d’écrasement de fichier, sauf si vous le lui
demandez. Pour cela, utilisez l’option -i (ou --interactive). Si
vous essayez de copier de nouveau les mêmes fichiers,
mais avec l’option -i cette fois-ci, vous obtiendrez un
résultat différent.

$ pwd

/home/scott/libby

$ ls ~/pictures/dogs

libby_arrowrock.jpg libby_by_pool_03.jpg
libby_on_floor_03.jpg

libby_by_pool_01.jpg libby_on_floor_01.jpg
libby_on_floor_04.jpg

libby_by_pool_02.jpg libby_on_floor_02.jpg

$ ls

libby_arrowrock.jpg libby_bak.jpg libby.jpg


libby_on_couch.jpg

$ cp -i ~/pictures/dogs/libby_on_floor_0[1-3].jpg .

cp: overwrite ‘./libby_on_floor_01.jpg’?

La commande cp s’interrompt et demande si vous


souhaitez écraser le premier fichier à copier, on_floor_01.jpg.
Si c’est le cas, appuyez sur la touche y de votre clavier,
sinon tapez n. Avec n, la commande cp ne s’interrompt pas
complètement, elle passe au fichier suivant, repose la
question si nécessaire, et ainsi de suite. Le seul moyen
d’annuler complètement tout le processus de copie est
d’utiliser la combinaison de touches Ctrl+C. De même, il
n’est pas possible de répondre oui pour tous les fichiers à
copier. Si vous comptez copier mille fichiers sur mille autres
portant le même nom avec l’option -i, armez-vous de
patience, car le shell vous demandera à chaque fois de
confirmer la copie.

Attention
Pour les utilisateurs standard, le recours à l’option -i n’est
généralement pas nécessaire. En revanche, elle est cruciale
pour les utilisateurs root car ils risquent d’écraser un fichier
système, ce qui peut entraîner un désastre. Il peut donc être
intéressant de créer un alias dans le fichier .bashrc de
l’utilisateur root pour être certain d’exécuter cp -i et non
simplement cp.
alias cp=’cp -i’

Copier des répertoires


cp -R

Vous avez vu comment copier des fichiers, mais il faut


parfois copier un répertoire. Il n’est pas possible d’utiliser cp
répertoire-source répertoire-cible car cela ne fonctionne pas
ainsi. Avec une telle commande, vous copierez le répertoire,
mais pas son contenu.

$ pwd

/home/scott

$ cp libby libby_bak

cp: omitting directory ‘libby’

Pour copier des répertoires, il faut utiliser l’option -r (ou -


R ou --recursive), comme avec la commande ls. Grâce à
cette option, le répertoire et son contenu peuvent être
copiés.

$ pwd

/home/scott

$ ls -l

drwxr-xr-x  scott scott 2015-10-17 14:42  documents

drwxr-xr-x  scott scott 2015-10-18 12:35  iso

drwxr-xr-x  scott scott 2015-10-20 17:16  libby

$ ls libby

libby_arrowrock.jpg    libby_on_couch.jpg   
libby_on_floor_03.jpg

libby_bak.jpg        libby_on_floor_01.jpg libby.jpg

libby_on_floor_02.jpg

$ cp -R libby libby_bak

$ ls -l

drwxr-xr-x  scott scott 2015-10-17 14:42  documents

drwxr-xr-x  scott scott 2015-10-18 12:35  iso

drwxr-xr-x  scott scott 2015-10-20 17:16  libby

drwxr-xr-x  scott scott 2015-10-20 17:17  libby_bak

Copier des fichiers sous forme de


sauvegarde parfaite dans un autre
répertoire

cp -a

Vous vous dites peut-être que la commande cp va être utile


pour sauvegarder des fichiers et vous avez raison (même
s’il existe des outils mieux adaptés, comme rsync (voir au
chapitre 16, « Travail sur le réseau »). Avec quelques lignes
dans un script, cp peut être un moyen très efficace de
sauvegarder divers fichiers et répertoires. Pour cela, l’option
la plus utile est -a (ou --archive), qui revient à combiner -dpR
(ou --no-dereference --preserve --recursive). Avec -a, cp ne
suit pas les liens symboliques (ce qui pourrait augmenter
considérablement le volume de vos copies), préserve les
attributs clés des fichiers, comme l’horodatage et le
propriétaire, et suit la structure des sous-répertoires.

$ pwd

/home/scott

$ ls -l

drwxr-xr-x  scott scott 2015-10-21 11:31  libby

drwxr-xr-x  scott scott 2015-09-29 23:17  music

$ ls -lR libby

libby:

total 312

-rw-r--r--  scott scott 2015-10-20 12:12  libby_arrowrock.jpg

-rw-r--r--  scott scott 2015-04-19 00:57  libby.jpg

drwxr-xr-x  scott scott 2015-10-21 11:31  on_floor

libby/on_floor:

total 764

-rw-r--r--    scott scott 2015-10-20


16:11  libby_on_floor_01.jpg

-rw-r--r--    scott scott 2015-10-20


16:11  libby_on_floor_02.jpg

$ cp -a libby libby_bak

$ ls -l

drwxr-xr-x  scott scott 2015-10-21 11:31  libby/

drwxr-xr-x  scott scott 2015-10-21 11:31  libby_bak/

drwxr-xr-x  scott scott 2015-09-29 23:17  music/

$ ls -lR libby_bak

libby_bak/:

total 312

-rw-r--r--  scott scott 2015-10-20 12:12  libby_arrowrock.jpg

-rw-r--r--  scott scott 2015-04-19 00:57  libby.jpg

drwxr-xr-x  scott scott 2015-10-21 11:31  on_floor

libby_bak/on_floor:

total 764

-rw-r--r--  scott scott 218849 2015-10-20 16:11

➥libby_on_floor_01.jpg

-rw-r--r--  scott scott 200024 2015-10-20 16:11

➥libby_on_floor_02.jpg

Info
Vous l’aurez compris, Libby est ma chienne, une adorable petite
shih-tzu, qui finit toujours par apparaître dans tout ce que
j’écris. Elle a quitté ce bas monde en août 2015.

Déplacer des fichiers et des répertoires

mv

cp permet de copier les fichiers, mais comment faire pour


les déplacer ? Pour cela, on utilise la commande mv (qui
signifie move).
Dans sa forme la plus simple, mv déplace un fichier d’un
point vers un autre du système de fichiers.

$ pwd

/home/scott/libby

$ ls

libby_arrowrock.jpg  libby_bak.jpg  libby.jpg  libby_on_couch.
jpg

➥on_floor

$ ls ~/pictures/dogs

libby_on_floor_01.jpg  libby_on_floor_03.jpg

libby_on_floor_02.jpg  libby_on_floor_04.jpg

$ mv ~/pictures/dogs/libby_on_floor_04.jpg
libby_on_floor_04.jpg

$ ls

libby_arrowrock.jpg  libby.jpg  libby_on_floor_04.jpg

➥libby_bak.jpg  libby_on_couch.jpg  on_floor

$ ls ~/pictures/dogs

libby_on_floor_01.jpg  libby_on_floor_02.jpg  libby_on_floor_0
3. jpg

Comme avec cp, vous pouvez utiliser un point pour faire


référence au répertoire courant, si vous n’avez pas envie de
ressaisir le nom du fichier.

$ pwd

/home/scott/libby

$ ls

libby_arrowrock.jpg    libby_bak.jpg    libby.jpg


libby_on_couch.jpg

➥on_floor

$ ls ~/pictures/dogs

libby_on_floor_01.jpg libby_on_floor_03.jpg

libby_on_floor_02.jpg libby_on_floor_04.jpg

$ mv ~/pictures/dogs/libby_on_floor_04.jpg .

$ ls

libby_arrowrock.jpg  libby.jpg  libby_on_floor_04.jpg

➥libby_bak.jpg  libby_on_couch.jpg  on_floor

$ ls ~/pictures/dogs

libby_on_floor_01.jpg  libby_on_floor_02.jpg  libby_on_floor_0
3. jpg

Si vous déplacez le fichier dans un répertoire et que vous


souhaitez conserver le même nom de fichier, il suffit
d’indiquer le répertoire cible. Le nom du fichier restera le
même.

$ pwd

/home/scott/libby

$ ls

libby_arrowrock.jpg  libby.jpg  libby_on_floor_04.jpg

➥libby_bak.jpg  libby_on_couch.jpg  on_floor

$ pwd

/home/scott/libby

$ ls

libby_arrowrock.jpg  libby.jpg  libby_on_floor_04.jpg

➥libby_bak.jpg  libby_on_couch.jpg  on_floor

$ ls on_floor

libby_on_floor_01.jpg  libby_on_floor_02.jpg  libby_on_floor_0
3. jpg

$ mv libby_on_floor_04.jpg on_floor

$ ls

libby_arrowrock.jpg  libby_bak.jpg  libby.jpg  libby_on_couch.
jpg

➥on_floor

$ ls on_floor

libby_on_floor_01.jpg  libby_on_floor_03.jpg

libby_on_floor_02.jpg  libby_on_floor_04.jpg

Pour indiquer visuellement que on_floor est un répertoire,


il peut être intéressant d’utiliser un / après le nom du
répertoire dans lequel vous souhaitez déplacer les fichiers,
comme ceci : mv libby_on_ floor_04.jpg on_floor/. Si on_floor
n’est pas un répertoire, la commande mv ne fonctionnera
pas, ce qui permet d’éviter d’écraser accidentellement un
fichier.

Info
Les commandes cp et mv ont en commun de nombreuses options,
qui fonctionnent de la même façon. Par exemple, -v permet de
déplacer les fichiers en mode bavard et -i permet de déplacer
les fichiers en mode interactif.
Renommer des fichiers et des répertoires

mv

Comme vous allez le constater, mv peut faire plus que


déplacer un fichier. Même si cela ne semble pas intuitif, cela
devient logique lorsqu’on prend le temps d’y réfléchir.
Il est temps de présenter l’autre fonction intéressante de
mv. Cette commande permet de déplacer les fichiers, comme
son nom l’indique, mais aussi de les renommer. Si vous
déplacez un fichier, il faut lui donner un nom cible. Aucune
règle ne précise que le nom du fichier cible doit être le
même que celui du fichier source. Du coup, les utilisateurs
du shell se servent depuis toujours de la commande mv pour
renommer des fichiers et des répertoires.

$ pwd

/home/scott/libby/by_pool

$ ls -F

libby_by_pool_02.jpg  liebermans/

$ mv liebermans/ lieberman_pool/

$ ls -F

libby_by_pool_02.jpg  lieberman_pool/

Lorsqu’on déplace un répertoire à l’aide de cp, il faut


ajouter l’option -r pour copier le répertoire lui-même. Ce
n’est pas le cas avec mv, qui, comme vous le voyez dans
l’exemple précédent, déplace et renomme les répertoires
sans nécessiter d’option supplémentaire. Cela vient du fait
que mv est fondamentalement une commande plus légère
que cp. En effet, elle ne crée pas de nouveaux fichiers ni ne
les réorganise dans un nouvel emplacement sur le disque
(sauf si vous les déplacez vers un autre système de fichiers
ou partition) ; elle se contente de changer le mot du fichier
ou du répertoire indiqué.
Attention
Vous devez savoir quelque chose d’important qu’il est facile
d’oublier à propos de la commande mv. Si vous déplacez un lien
symbolique qui désigne un réperToire, vous devez faire
extrêmement attention à ce que vous saisissez. Imaginons que
vous ayez un lien symbolique nommé dogs dans votre répertoire
personnel, qu’il pointe sur /home/scott/pictures/dogs et que vous
vouliez déplacer le lien dans le sous-répertoire /home/scott/libby.
La commande suivante ne déplacera que le lien symbolique :
$ mv dogs ~/libby

Celle-ci, en revanche, déplace le répertoire ciblé par le lien


symbolique :
$ mv dogs/ ~/libby

Quelle est la différence ? Une simple barre oblique (/) à la fin du


nom du lien symbolique. Sans la barre oblique, vous déplacez le
lien lui-même ; avec la barre oblique, vous déplacez le
répertoire désigné par le lien symbolique, non le lien. Soyez
prudent !

Comprendre le stockage des fichiers sous


Linux

La prochaine section décrira la commande ln (pour link, ou


lien). Mais avant d’examiner le fonctionnement des liens,
nous devons faire un petit détour par le stockage des
fichiers sur un ordinateur Linux. Au chapitre 1, « Les
commandes : ce qu’il faut savoir », une section était
intitulée « Tout est fichier », et cela reste vrai. Cependant,
les choses sont un peu plus compliquées.
Tout est fichier, mais en quoi un fichier est-il un fichier ?
Je me rends bien compte que mon propos commence à
devenir ontologique, mais restez avec moi. En réalité, ce
que vous voyez comme un fichier est en réalité un pointeur
sur un inode, c’est-à-dire une structure de données qui
stocke des informations sur l’emplacement réel des données
physiques sur l’ordinateur, ainsi que des métadonnées sur
ces données, comme le type du fichier, sa taille, son
propriétaire, ses autorisations, etc. (voir les chapitres 2, «
Parcours du système de fichiers », et 8, « Propriétés et
permissions »). Lorsque vous créez un fichier, il reçoit du
système un numéro d’inode unique et, de vous, un nom.
Ces informations sont stockées dans une table d’inodes sur
le disque. Si vous faites référence à un fichier par son nom,
Linux l’utilise pour retrouver l’inode associé ; dès que Linux
dispose des informations stockées dans l’inode, il peut agir
sur le fichier.
Pour connaître le numéro d’inode associé un fichier,
utilisez la commande ls -i :

$ ls -i

49889 backup_daily.sh

49796 dotfiles/

49795 dotfiles.sh

49886 extra/

49291 wp_upgrade.sh

Voyez-vous les numéros situés à gauche des fichiers et


des répertoires ? Ce sont les numéros d’inode. Notez que les
répertoires ont eux aussi des numéros d’inodes. Pourquoi ?
Au chapitre 1, nous avons écrit : « Mais qu’en est-il d’un
répertoire ? C’est aussi un fichier – un type de fichier
particulier qui contient des informations sur d’autres
fichiers. » Vous comprenez à présent ce que cela signifie :
un répertoire (ou dossier) est un fichier (avec son propre
inode) qui associe les fichiers qu’il contient à leurs inodes.
En théorie, vous disposez d’un espace disque très vaste,
mais, comme la plupart des systèmes de fichiers créent un
nombre figé d’inodes, vous risquez de ne plus pouvoir créer
de fichiers en raison du manque d’inodes (c’est
extrêmement rare, mais cela m’est arrivé une fois). Si vous
voulez connaître le nombre d’inodes de votre système de
fichiers et combien sont disponibles, utilisez la commande
df (voir au chapitre 13, « Surveillance des ressources
système ») avec les options -h (pour lisible par l’utilisateur)
et -i (ou --inodes).

# df -h

Filesystem   Size  Used Avail Use% Mounted on

/dev/sda     4.9G  742M  4.1G  16% /

none         396M  308K  395M   1% /run

/dev/sdb      42G   33G  8.8G  79% /var

$ df -i

Filesystem   Inodes  IUsed   IFree IUse% Mounted on

/dev/sda     327680  40627  287053   13% /

none         505701    826  504875    1% /run

/dev/sdb    2785280 706754 2078526   26% /var

Cet exemple montre que /var occupe 79 % de son


espace, mais seulement 26 % de ses inodes disponibles. Si
vous avez besoin de créer un tas de petits fichiers, n’hésitez
pas ! Maintenant que vous savez ce que sont les inodes,
passons à la commande ln.

Créer un lien vers un autre fichier ou


répertoire

ln

Il peut parfois être utile d’avoir le même fichier dans deux


endroits, ou plus, en même temps, ou bien d’avoir plusieurs
façons de faire référence à un fichier ou à un répertoire.
Dans ce cas, tournez-vous vers la commande ln, une
abréviation de link (lien).
Il existe deux types de liens : matériel (par défaut) et
symbolique (celui que vous utiliserez probablement le plus
souvent). Ils sont très différents l’un de l’autre, comme vous
allez le voir.
Si ce n’est pas déjà fait, lisez la section précédente, car il
vous faut connaître la notion d’inode pour comprendre cette
section. J’attends… Puisque vous savez tout des inodes et
de leur importance, voyons quelques caractéristiques des
liens matériels. Pour créer un tel lien, on utilise ln fichier-
original nom-du-lien.

$ ls -l

drwxr-xr-x 2 root root 4096 melville/

-rw-r--r-- 1 root root   16 moby_dick.txt

$ cat moby_dick.txt

Call my Ishmael

$ ln moby_dick.txt white_whale.txt

$ ls -l

drwxr-xr-x 2 root root 4096 melville/

-rw-r--r-- 2 root root   16 moby_dick.txt

-rw-r--r-- 2 root root   16 white_whale.txt

$ ls -i

40966 melville/

25689 moby_dick.txt

25689 white_whale.txt

$ cat white_whale.txt

Call my Ishmael

Nous avons le répertoire melville et le fichier texte


moby_dick. txt qui contient la phrase « Call my Ishmael » (je
sais, je sais… ne vous énervez pas, vous les lecteurs de
Moby-Dick). Nous utilisons ensuite la commande ln en
précisant tout d’abord le fichier sur lequel va pointer le lien,
puis le nom du lien matériel. Une nouvelle exécution de la
commande ls -l montre que le fichier et le lien matériel ont
exactement la même taille. Notez également que le chiffre 1
associé à moby_dick.txt dans les résultats de la première
commande ls est devenu 2. En effet, ce chiffre indique le
nombre de liens matériels existants pour le fichier (il n’a
aucun rapport avec les répertoires et les inodes car, comme
nous l’avons mentionné au chapitre 2, dans le cas d’un
répertoire, il indique le nombre de sous-répertoires). 1
signifie que le fichier existe, car il y a au moins un lien entre
le fichier et son inode. Lorsque nous créons un nouveau lien
matériel, ce chiffre augmente de 1 et, lorsque nous
détruisons un lien, il diminue de 1. En réalité, c’est ce qui se
passe en utilisant rm (voir la section suivante) : cette
commande coupe le lien entre le fichier et son inode ; arrivé
à 1, elle fait disparaître le fichier.

Info
La commande unlink est une autre manière de supprimer un lien
: unlink moby_dick.txt. Si vous avez fait attention, vous aurez
remarqué que j’ai employé unlink pour supprimer le fichier
original. Cela ne pose pas de problème car white_whale.txt reste
disponible, puisqu’il pointe sur le même inode et donc sur les
mêmes données.

Pour revenir à l’exemple précédent, lorsque nous


exécutons ls -i pour afficher les numéros d’inodes des
fichiers, nous voyons que moby_ dick.txt (le fichier d’origine)
et white_whale.txt (le lien matériel) ont le même numéro
d’inode : 25689. Avec cat white_whale.txt, nous constatons
qu’ils contiennent tous deux le même texte. Autrement dit,
moby_dick.txt et white_whale.txt sont bien le même fichier !

$ echo ”Call me Ishmael” > white_whale.txt

$ cat white_whale.txt

Call me Ishmael

$ cat moby_dick.txt

Call me Ishmael

$ mv moby_dick.txt moby-dick.txt

$ cat while_whale.txt

Call me Ishmael

$ mv moby-dick.txt melville/

$ cat white_whale.txt

Call me Ishmael

Je me rends compte à présent que la première phrase de


Moby-Dick est « Call me Ishmael », non « Call my Ishmael ».
À l’aide de la commande echo (qui renvoie ce que nous
avons saisi), dont la sortie est redirigée (voir la section «
Rediriger la sortie d’une commande vers un fichier » au
chapitre 5) vers le lien matériel, white_whale.txt, je modifie
son contenu. La commande cat permet de vérifier que les
deux fichiers ont le même contenu, ce qui prouve encore
une fois qu’il s’agit bien du même fichier. Le fichier que vous
manipulez importe peu, car vous travaillez en réalité avec
les mêmes données.
Tout aussi intéressant, si vous renommez le fichier
d’origine à l’aide de la commande mv (voir précédemment),
le lien reste opérationnel. En effet, il s’agit du même inode,
qui pointe vers les mêmes données sur le disque. Si vous
utilisez mv pour déplacer le fichier vers un nouvel
emplacement, le lien fonctionne toujours et affiche le même
contenu. Pourquoi ? Reportez-vous à la réponse précédente
!
Aussi puissants que soient les liens matériels, ils
présentent néan-moins quelques limitations. Le plus gros
problème est que vous ne pouvez pas créer de lien matériel
vers un répertoire, en aucune manière (pour cela, vous
devez choisir le lien symbolique, expliqué ci-après). Un
autre vient du fait que le lien matériel et le fichier original
doivent tous deux se trouver sur le même système de
fichiers. Vous ne pouvez donc pas avoir un fichier sur une
partition et un lien matériel sur une partition différente
(rappelez-vous que chaque partition possède ses propres
inodes !). Si vous tentez l’opération, vous obtiendrez le
message d’erreur « Invalid cross-device link ».
Vous connaissez à présent le fonctionnement d’un lien
matériel, alors qu’en est-il de son cousin, le lien symbolique
? Pour créer un lien symbolique, la syntaxe de la commande
est identique, mais nous ajoutons l’option -s : ln -s fichier-
original nom-du-lien.Jetons un œil à l’un de mes serveurs,
puis expliquons ce que nous voyons :

$ ls -l /

drwxr-xr-x 98 4096 etc/

drwxr-xr-x  2 4096 home/

lrwxrwxrwx  1   28 mb -> /var/shared/multiblog/

lrwxrwxrwx  1   18 shared -> /var/shared/

drwxr-xr-x 17 4096 var/

lrwxrwxrwx  1   12 webconf -> /etc/apache2/

lrwxrwxrwx  1    8 www -> /var/www/

[liste coupée en raison de sa longueur]

Il s’agit d’un listing partiel du répertoire racine de ce


serveur. Il contient quatre liens symboliques : mb, shared,
webconf et www. Mes partenaires et moi-même en avions
marre de nous connecter par SSH sur le serveur et de saisir,
par exemple, cd /var/www. Nous avons donc créé un lien
symbolique nommé www qui pointe sur cette cible (cela peut
sembler idiot, mais, à notre place, vous en auriez eu marre
vous aussi !). Il existe plusieurs manières de procéder. Voici
la première :

$ sudo ln -s /var/www /www

Dans cette version, je donne des chemins absolus pour


créer le lien symbolique /www qui pointe vers /var/www (j’utilise
sudo parce qu’un utilisateur normal ne peut pas créer de lien
ni quoi que ce soit d’autre dans /). L’avantage de cette
méthode est que le lien peut être créé quel que soit
l’endroit où je me trouve sur le système de fichiers, car les
chemins sont absolus. Et si j’étais un peu plus paresseux ?

$ cd /

$ sudo ln -s /var/www .

Dans cet exemple, je vais dans le répertoire où je veux


placer le lien, que je crée ensuite. Mais, à la place d’un nom
de lien, j’utilise uniqquement un point (.), qui indique à ln
que je veux donner au lien le nom du fichier ou du dossier
auquel je me lie. Dans ce cas, le nom du lien symbolique
sera donc www, car il s’agit du dernier élément du chemin
d’origine. C’est paresseux (une bonne chose, n’oubliez pas
!). Et si j’étais encore plus paresseux ?

$ cd /

$ sudo ln -s /var/www

Avec cette méthode, je vais dans le répertoire dans lequel


je souhaite mettre le lien symbolique, puis je le crée. À la
place d’un nom de lien, je ne mets rien du tout. ln comprend
alors que je veux que le nom du lien soit identique à celui
du fichier ou du dossier auquel je me lie.
Dans cet exemple, tout comme le précédent, le nom du
lien symbolique sera www, car il s’agit du dernier élément du
chemin d’origine. Là c’est vraiment paresseux !
Quelle que soit la méthode employée, un lien symbolique
fonctionne comme le fichier ou le dossier qu’il cible (pwd et
pwd -P sont décrits dans la section « Afficher le chemin du
répertoire courant » du chapitre 2).

$ pwd

/home/scott

$ ln -s /var/www

$ ls -l

lrwxrwxrwx  1  8 www -> /var/www/

$ cd www

$ pwd -P

/var/www

$ ls -l

lrwxrwxrwx  1  8 notes -> /home/scott/notes.txt

$ cat notes

Notes about websites go here.

Le premier lien symbolique créé pointe vers un répertoire.


En utilisant cd sur ce lien, nous arrivons dans ce répertoire
ciblé. Ensuite, un cat sur le lien qui pointe vers un fichier
permet d’afficher le contenu de ce fichier ciblé. Si le lien
symbolique était ouvert dans un éditeur de texte, les
modifications concerneraient le contenu du fichier d’origine.
Vous savez maintenant créer des liens symboliques et
comprenez leur fonctionnement. Mais en quoi sont-ils
différents des liens matériels ? Oh, à bien des égards !
Examinons tout d’abord les résultats de certaines
commandes ls, en supposant que le répertoire concerné
comporte à la fois des liens matériels et des liens
symboliques.

$ ls -l

-rw-r--r--  2 moby_dick.txt

lrwxrwxrwx 12 webconf -> /etc/apache2/

-rw-r--r--  2 white_whale.txt
$ ls -i

25689 moby_dick.txt

25372 webconf

25689 white_whale.txt

$ ls -i /etc

59948 apache2/

Commençons par les informations obtenues avec ls -l.


La première colonne contient un l (pour lien) s’il s’agit d’un
lien symbolique, mais un symbole - (représentant un fichier
« normal ») lorsqu’il s’agit d’un lien matériel. Pour quelle
raison ? Simplement parce que, pour le système de fichiers,
les liens matériels ne sont que des fichiers normaux qui
partagent des inodes. Vous voyez également que ls -l
affiche un pointeur sur le fichier ou le dossier ciblé par le
lien symbolique ; plutôt pratique. Cela n’a pas sens pour un
lien matériel, car il n’y a aucune différence entre le fichier
d’origine et tous les liens physiques qui mènent à ce fichier.
Pour le système d’exploitation, ils sont parfaitement
identiques et rien ne distingue l’original et ses liens. En
outre, alors qu’un lien symbolique ne peut pointer que vers
un fichier ou un dossier, il est possible d’avoir de nombreux
liens matériels vers le fichier. Alors, sur lequel pointerait-il ?
Effectivement, ce serait un véritable désordre, et le système
d’exploitation n’essaie même pas.
La deuxième commande, ls -i, montre également
certaines différences essentielles entre les liens matériels et
les liens symboliques. Les liens matériels ont le même
numéro d’inode, évidemment, contrairement aux liens
symboliques et aux fichiers qu’ils ciblent, qui ont des
numéros différents, car ils sont complètement différents. Si
les liens matériels constituent un même fichier, les liens
symboliques utilisent un nom pour cibler des fichiers et des
répertoires, et le fichier qui porte ce nom possède son
propre inode. En d’autres termes, un lien symbolique a son
propre inode qui pointe vers l’inode du fichier d’origine, qui
pointe ensuite vers les données réelles sur le disque !
Voici quelques autres différences. Les liens symboliques
peuvent pointer vers des fichiers ou des dossiers, alors que
les liens matériels ne peuvent pointer que sur des fichiers.
Contrairement à un lien matériel, un lien symbolique et le
fichier sur lequel il pointe ne doivent pas nécessairement se
trouver sur le même système de fichiers. Si vous supprimez
ou déplacez le fichier d’origine, le lien symbolique est
rompu, mais il reste possible de modifier son nom. Le
tableau 3.2 compare les liens matériels et les liens
symboliques afin de mettre en exergue ce qui rend chacun
unique.
Tableau 3.2 Liens matériels et liens symboliques
Lien matériel Lien symbolique
Cible du lien Inode Nom
Lien vers un répertoire Non Oui
Lien entre systèmes de Non Oui
fichiers
Fichier source déplacé Lien opérationnel Lien rompu
Nom de la cible modifié Lien opérationnel Lien rompu
Lien supprimé Cible toujours Cible toujours
présente1 présente

Inode du lien Identique à celui de Différent de celui de


la cible la cible
Espace de stockage Aucun ~4 ko
utilisé

Les liens matériels et les liens symboliques ont tous deux


leurs fonctions et peuvent se révéler merveilleusement
utiles lorsque vous en avez besoin.

Supprimer des fichiers

rm

La commande rm (pour remove) permet de supprimer des


fichiers. Elle les supprime vraiment ; ils disparaissent.
L’interpréteur de ligne de commande ne dispose pas de
fonction semblable à la Corbeille de Windows ou d’OS X. Il
faut donc l’utiliser avec précaution.
On peut déplorer l’absence de commande permettant
d’annuler une suppression, mais tout n’est pas totalement
perdu si vous effacez un fichier. Si vous cessez de travailler
à l’instant où vous réalisez que vous avez fait une erreur, si
le système d’exploitation n’a pas écrit par-dessus les
secteurs du fichier effacé et si vous parvenez à utiliser un
logiciel de restauration de fichiers, il y a des chances pour
que vous récupériez le fichier. Mais cela n’aura rien d’une
sinécure et vous allez perdre un temps considérable. Il est
donc préférable d’être particulièrement prudent.
Astuce
De nombreuses personnes ont tenté de développer une sorte de
filet de sécurité pour la commande rm, en la remplaçant par une
corbeille temporaire
(http://blogs.adobe.com/cantrell/archives/2012/03/stopusing-rm-
on-the-command-line-before-its-too-late.html) ou en créant une
commande trash pour la remplacer
(https://github.com/andreafrancia/trash-cli).

Si vous voulez être certain que personne ne puisse restaurer


vos fichiers supprimés (pas même les hommes en noir d’une
quelconque agence gouvernementale), utilisez la commande
shred à la place de rm. Elle écrase le fichier vingt-cinq fois (une
valeur ajustable avec l’option -n #), afin de rendre sa
restauration impossible. Avant d’utiliser shred, consultez sa page
de manuel car son succès dépend en grande partie du système
de fichiers utilisé.

L’utilisation de rm est simple, trop simple diront certains.

$ pwd

/home/scott/libby/by_pool/lieberman_pool

$ ls

libby_by_pool_01.jpg      libby_by_pool_03.jpg

libby_by_pool_01.jpg_bak  libby_by_pool_03.jpg_bak $

rm libby_by_pool_01.jpg_bak

$ ls

libby_by_pool_01.jpg  libby_by_pool_03.jpg

➥libby_by_pool_03.jpg_bak

Supprimer plusieurs fichiers à la fois


grâce aux caractères spéciaux

rm *

Les caractères spéciaux, comme *, permettent de supprimer


simultanément plusieurs fichiers. Mais faites attention, car
vous pourriez très facilement effacer beaucoup de choses
importantes !

$ pwd

/home/scott/libby/by_pool/lieberman_pool

$ ls

libby_by_pool_01.jpg      libby_by_pool_03.jpg

libby_by_pool_01.jpg_bak  libby_by_pool_03.jpg_bak

$ rm *_bak

$ ls

libby_by_pool_01.jpg  libby_by_pool_03.jpg

Attention
Faites très très attention lorsque vous supprimez des fichiers à
l’aide des caractères spéciaux, car vous risquez de supprimer
beaucoup plus de choses que prévu. L’exemple classique est
l’exécution de rm * txt au lieu de rm *txt (avec une espace, dans
le premier cas, entre le * et txt). Au lieu d’effacer tous les
fichiers texte (ce qui se passe dans le second cas), l’astérisque
implique que tous les fichiers seront supprimés et rm cherchera
ensuite à détruire un fichier nommé txt. Oups !

Empêcher la suppression accidentelle de


fichiers

rm -i

L’option -i (ou --interactive) permet de bénéficier d’une


petite protection contre les suppressions accidentelles en
demandant la confirmation de la suppression de chaque
fichier. C’est une option particulièrement pratique lorsqu’on
travaille en tant que root. En pratique, de nombreux
administrateurs système créent un alias de rm avec rm -i
pour cette unique raison ; c’est vraiment une très bonne
idée !
$ pwd

/home/scott/libby/by_pool/lieberman_pool

$ ls

libby_by_pool_01.jpg      libby_by_pool_03.jpg

libby_by_pool_01.jpg_bak  libby_by_pool_03.jpg_bak

$ rm -i *_bak

rm: remove regular file ‘libby_by_pool_01.jpg_bak’? y

rm: remove regular file ‘libby_by_pool_03.jpg_bak’? y

$ ls

libby_by_pool_01.jpg  libby_by_pool_03.jpg

Lorsque rm vous demande quoi faire, y signifie supprimer


et n ne pas supprimer. La commande repose la question
pour chaque fichier à supprimer.

Supprimer un répertoire vide

rmdir

La suppression d’un fichier est simple, mais qu’en est-il pour


les répertoires ?

$ pwd

/home/scott/libby/by_pool

$ ls

libby_by_pool_02.jpg  lieberman_pool  lieberman_pool_bak

$ ls lieberman_pool_bak

libby_by_pool_01.jpg      libby_by_pool_03.jpg

libby_by_pool_01.jpg_bak  libby_by_pool_03.jpg_bak

$ rm lieberman_pool_bak

rm: cannot remove ‘lieberman_pool_bak/’: Is a directory

Après quelques recherches, vous découvrez la commande


rmdir, spécialement conçue pour la suppression de
répertoires. Alors vous l’essayez.
$ rmdir lieberman_pool_bak

rmdir: ‘lieberman_pool_bak/’: Directory not empty

Cela ne fonctionne pas non plus, car la commande rmdir


supprime uniquement des répertoires vides. Dans cet
exemple, le dossier lieberman_pool_bak ne contient que quatre
fichiers et il ne devrait donc pas être très difficile de le vider
avec rm lieberman_pool_bak/*, puis de le supprimer avec rmdir.
Mais comment faire pour supprimer un dossier contenant
dix sous-répertoires contenant chacun dix autres sous-
répertoires contenant chacun vingt-cinq fichiers ? Le vidage
d’un tel dossier prendrait une éternité, il doit bien y avoir
une autre solution. Rien de plus simple, lisez ce qui suit !

Supprimer des fichiers et des répertoires


non vides

rm -rf

Il existe un moyen plus simple d’effacer un répertoire qui


contient des fichiers. Utilisez la combinaison des options -r
(ou -R ou --recursive) et -f (ou --force). L’option -r demande
à la commande de supprimer tous les fichiers de tous les
sous-répertoires du répertoire cible. L’option -f force la
commande à ne pas demander de confirmation.

$ pwd

/home/scott/libby/by_pool

$ ls

libby_by_pool_02.jpg  lieberman_pool  lieberman_pool_bak

$ ls lieberman_pool_bak

libby_by_pool_01.jpg      libby_by_pool_03.jpg

libby_by_pool_01.jpg_bak  libby_by_pool_03.jpg_bak

$ rm -rf lieberman_pool_bak

$ ls

libby_by_pool_02.jpg  lieberman_pool

Voici un bon moyen de se débarrasser d’un répertoire et


de tout son contenu.

Attention
La commande rm -rf peut détruire des fichiers importants et
votre système avec. Vérifier à deux fois ce que vous supprimez
avant d’exécuter rm -rf !

Le conseil classique est de ne jamais utiliser rm -rf /* en tant


que root. Oui, vous allez effacer votre système. Non, ce ne sera
pas cool. Oui, vous vous sentirez stupide.

De manière générale, faites attention lorsque vous utilisez des


caractères spéciaux avec rm -Rf. Il y a une différence
considérable entre rm -rf libby* et rm -rf libby *. La première
commande efface tout ce qui commence par libby dans le
répertoire courant ; la seconde efface tout fichier ou dossier
nommé exactement libby, puis efface tout le reste dans le
répertoire courant.

Vous pouvez aussi provoquer accidentellement une catastrophe


en saisissant rm -rf ~/libby /* à la place de rm -rf ~/libby/*. Dans ce
cas, le répertoire ~/libby est effacé, puis tous les fichiers
système.

Voici une autre erreur commise par un de mes amis. Ne


saisissez jamais rm -rf .*/* pour supprimer un répertoire
commençant par . car la commande prendra aussi en compte ..
et effacera tout ce qui se trouve au-dessus du répertoire
courant. Aïe !

Faites attention lorsque vous utilisez rm -rf en tant qu’utilisateur


normal et soyez hypervigilant si vous travaillez en tant que root
!

Suppression de fichiers pouvant poser


problème
Avant de passer à autre chose, voyons deux particularités
propres à la relation entre rm et certains fichiers de votre
système. Pour commencer, vous ne parviendrez jamais à
supprimer les répertoires . et .. car ils sont indispensables à
la hiérarchie du système de fichiers. Cela dit, qui voudrait
les supprimer ?
Comment supprimer un fichier dont le nom contient un
espace ? La technique classique consiste à invoquer rm suivi
du nom du fichier, mais cela ne fonctionnera pas car rm aura
l’impression que vous parlez de deux fichiers différents.
Pour supprimer une photo du cousin Harold, il suffit de
placer le nom du fichier entre guillemets.

$ ls

cousin harold.jpg  -cousin_roy.jpg  cousin_beth.jpg

$ rm cousin harold.jpg

rm: cannot remove ‘cousin’: No such file or directory

rm: cannot remove ‘harold.jpg’: No such file or directory

$ rm "cousin harold.jpg"

$ ls

-cousin_roy.jpg  cousin_beth.jpg

Voici un autre casse-tête : comment effacer un fichier


dont le nom commence par - ?

$ ls

-cousin_roy.jpg  cousin_beth.jpg

$ rm -cousin_roy.jpg

rm: invalid option -- c

Try ‘rm --help’ for more information.

La commande lit le trait d’union et pense qu’il s’agit de


l’introduction d’une option, mais elle ne connaît pas d’option
commençant par c. Elle continue, lit ousin_roy.jpg et ne sait
pas quoi faire.
Vous avez deux possibilités. Vous pouvez faire précéder le
nom de -- (deux tirets) pour indiquer à la commande que ce
qui suit ne doit pas être considéré comme une option, mais
comme le nom d’un fichier ou d’un répertoire.

$ ls

-cousin_roy.jpg  cousin_beth.jpg

$ rm -- -cousin_roy.jpg

$ ls

cousin_beth.jpg

Vous pouvez aussi utiliser un . dans le chemin, ce qui


permet d’ignorer l’espace avant le - qui provoque l’erreur
de la commande rm et l’amène à penser que le nom de
fichier est en fait une option.

$ ls

-cousin_roy.jpg  cousin_beth.jpg

$ rm ./-cousin_roy.jpg

$ ls

cousin_beth.jpg

Vous voyez à quel point les utilisateurs de Linux sont


ingénieux. Cela dit, pour éviter ce genre de soucis, ne faites
pas commencer vos noms de fichiers par un trait d’union.

Conclusion

Ce chapitre me fait penser à mon jeune fils : il adore créer


des créatures fantastiques avec ses Legos et leur donner
des noms incroyables, mais il les démolit assez vite en
rigolant. De même, vous avez appris à créer des fichiers et
des répertoires (touch, mkdir et cp), à modifier leur
emplacement ou leur nom (mv), à créer des liens vers eux
(ln) et enfin à les détruire (rm et rmdir). Avec ces commandes
essentielles dans votre boîte à outils, vous êtes prêt à
apprendre comment en apprendre davantage sur les
commandes. Cela vous semble-t-il bizarre ? Vous n’avez
encore rien vu.

1 Sauf si le lien supprimé était le dernier ou si un processus en cours


d’exécution a ouvert le fichier.
Chapitre 4
Informations sur les
commandes
Au chapitre 2, « Parcours du système de fichiers », vous
avez découvert certaines commandes de base. Vous avez
fait du chemin, mais la route est encore longue. La
commande ls est un outil incroyablement puissant, avec
beaucoup plus d’options que celles présentées. Comment
en apprendre davantage sur cette commande et sur
d’autres qui vous intéressent ? Ou comment découvrir des
commandes si vous ne connaissez même pas leur nom ?
C’est le rôle de ce chapitre. Vous allez apprendre ici à en
savoir plus sur les commandes que vous connaissez déjà,
celles dont vous avez entendu parler mais que vous ne
connaissez pas, et même celles dont vous ignorez
totalement l’existence !
Nous commencerons par les poids lourds, man et info.
Nous verrons ensuite d’autres commandes plus petites et
plus précises qui, pour la plupart, exploitent les données
réunies par man. Lorsque vous aurez fini ce chapitre, vous
serez à même de découvrir par vous-même l’incroyable
diversité des outils proposés par le shell.

Info
Dans la deuxième édition de ce livre, j’ai retiré les informations
qui concernent man -u (reconstruction de la base de donnée des
commandes utilisée par man) et man -t (impression de pages de
manuel). Par ailleurs, whatis a été déplacée dans man -f, tandis
que apropos a rejoint man -k. Vous retrouverez les descriptions
d’origine sur mon site Web
(granneman.com/writing/books/linux-phrasebook).

Trouver des informations sur une


commande grâce à man

man

Vous avez besoin d’informations à propos d’une commande


Linux ? Rien n’est plus simple ! Disons que vous avez besoin
d’informations sur la commande ls. Saisissez man ls et la
page man (raccourci pour « manuel ») relative à cette
commande s’affiche, pleine de nombreux renseignements
sur ses différents aspects. Essayez la même chose avec une
autre commande : il existe des pages de manuel pour
(pratiquement) toutes les commandes.
Bien qu’utiles, ces pages peuvent poser un problème car
il faut connaître le nom de la commande qu’on souhaite
employer pour obtenir des informations à son sujet (même
s’il y a des moyens de contourner ce problème). De plus, les
pages man ne sont pas toujours à jour car certaines options
nouvellement ajoutées peuvent ne pas être documentées,
et toutes les commandes n’ont pas nécessairement leur
page de manuel. Pire encore, vous pouvez trouver une page
man à jour pour la commande qui vous intéresse, mais ses
informations peuvent se révéler quasiment inexploitables.
Ce sont généralement les auteurs des commandes qui
rédigent les pages man. La plupart des développeurs qui
écrivent des applications fournies avec Linux sont
d’excellents programmeurs, mais pas toujours de bons
pédagogues : ils savent comment fonctionnent les choses,
mais oublient trop souvent que ce n’est pas aussi clair et
intuitif pour les utilisateurs.
Malgré tout, les pages man restent une excellente
ressource pour tous les utilisateurs de Linux, quel que soit
leur niveau d’expérience. Si vous comptez exploiter Linux
depuis le shell, vous devez apprendre à les utiliser.
Nous l’avons dit, cette commande est simple d’utilisation.
Il suffit de saisir man suivi du nom de la commande
concernée.

$ man ls

LS(1)                  User Commands                  LS(1)

NAME

       ls - list directory contents

SYNOPSIS

       ls [OPTION]... [FILE]...

DESCRIPTION

       List information about the FILEs (the current directory


by

➥default). Sort entries alphabetically if none of -cftuvSUX


nor

➥--sort is specified.

       Mandatory arguments to long options are mandatory for

➥short options too.

       -a, --all

              do not ignore entries starting with .

       -A, --almost-all

              do not list implied . and ..

La liste des informations affichées par man peut être


longue (plus de 200 lignes pour ls). Bien entendu, toutes les
commandes ne produisent pas autant d’informations, mais
certaines en produisent beaucoup plus. Votre travail
consiste à lire les différentes parties des pages man, qui
sont généralement les suivantes :
• NAME. Nom de la commande et brève description.
• SYNOPSIS. Syntaxe de base de la commande.
• DESCRIPTION. Description plus détaillée du fonctionnement
de la commande.
• OPTIONS. Liste des options disponibles pour la commande
avec une courte explication pour chacune d’elles.
• FILES. Autres fichiers utilisés par la commande.
• AUTHOR. Nom du créateur de la commande et informations
de contact.
• BUGS. Bogues recensés et techniques pour soumettre un
nouveau bogue.
• COPYRIGHT. Informations de copyright.
• SEE ALSO. Renvoi à des commandes connexes.
Pour faire défiler une page man ligne par ligne, utilisez les
touches fléchées : Flèche bas pour descendre et Flèche haut
pour monter. Pour passer à la page suivante, appuyez sur la
barre d’espace ou la touche f (forward). Pour reculer d’une
page, appuyez sur la touche b (backward). Lorsque vous
atteignez la fin d’un document, man peut quitter de luimême
en vous ramenant au shell. Il peut aussi s’arrêter sans
quitter. Dans ce cas, appuyez sur la touche q (qui permet
aussi de quitter man à tout moment).
Il est parfois difficile de trouver une information précise
dans une page man. On doit alors faire une recherche : dans
la page man, après son ouverture, tapez / suivi de l’objet de
la recherche et appuyez sur la touche Entrée. Si le terme
existe, la page défilera pour l’afficher. Appuyez de nouveau
sur Entrée (ou n) pour atteindre l’occurrence suivante du
mot recherché. Pour atteindre l’occurrence précédente,
utilisez Maj+n.

Info
Par défaut, man affiche le contenu des pages de manuel avec less
(voir au chapitre 6). Les touches qui permettent de naviguer
dans ce contenu sont celles de less ; pour en savoir plus sur ces
touches, saississez man less. Si vous souhaitez utiliser un autre
outil que less, modifiez simplement la variable d’environnement
ou PAGER. Pour de plus en plus d’informations sur ce sujet,
MANPAGER
effectuez une recherche !

Astuce
Sur la plupart des distributions, les pages man sont en anglais.
Heureusement pour vous, il existe de nombreuses traductions
de ces pages en français sur Internet. Vous pouvez, entre
autres, consulter le site http://jp.barralis.com/linuxman/. Cela
dit, les versions anglaises seront toujours les plus à jour et
certaines traductions françaises sont incomplètes.

Déterminer rapidement la fonction d’une


commande grâce à son nom

man -f

whatis

Si vous connaissez le nom d’une commande, mais ignorez


sa fonction, il existe un moyen rapide et moins orthodoxe de
savoir à quoi elle sert sans ouvrir une page man. Utilisez
l’option -f ou --whatis, ou la commande whatis (équivalente à
man --whatis), suivie du nom de la commande pour faire
apparaître son synopsis.

$ man -f ls

ls (1)               - list directory contents

$ whatis ls

ls (1)               - list directory contents

Quelle commande devez-vous utiliser ? Ma préférence


personnelle va à whatis car je la retiens plus facilement ;
certains de mes amis ont choisi man –f car sa saisie est plus
courte.
La commande whatis a l’avantage d’accepter les
expressions régulières et les caractères spéciaux. Pour
effectuer une recherche dans les pages de manuel en
utilisant ces caractères, utilisez l’option -w (ou --wildcard).

$ whatis -w ls*

ls (1)    - list directory contents

lsb (8)   - Linux Standard Base support for Debian

lshal (1) - List devices and their pro perties

lshw (1)  - list hardware

lskat (6) - Lieutnant Skat card game for KDE

La recherche avec les caractères spéciaux peut être un


peu plus lente que sans option, mais la différence est
négligeable avec les ordinateurs rapides d’aujourd’hui.
Il est également possible d’utiliser des expressions
régulières grâce à l’option -r (ou --regex).

$ whatis -r ^rm.*

rm (1)    - remove files or directories

rmail (8) - handle remote mail received via uucp

rmdir (1) - remove empty directories

rmt (8)   - remote magtape protocol module

Astuce
La place manque dans ce livre pour traiter des expressions
régulières. Pour plus d’informations sur le sujet, vous pouvez
lire Sams Teach Yourself Regular Expressions in 10 Minutes
(ISBN : 0672325667), de Ben Forta (non traduit) ou les ouvrages
disponibles en français dans toute bonne librairie. Je vous
conseille fortement d’apprendre à les utiliser car elles sont
réellement très pratiques (rendez-vous sur http://xkcd.com/208/
!).

Rechercher une commande selon sa


fonction
man -k

apropos

Avec un peu de pratique, vous prendrez vite l’habitude de


naviguer dans les pages man pour trouver ce que vous
cherchez, à condition, bien sûr, de savoir quelle page
afficher. Comment faire si vous savez deux ou trois choses
sur une commande dont vous ignorez le véritable nom ? En
ce cas, utilisez l’option -k (ou --apropos) avec man ou
servezvous simplement de la commande apropos, et
recherchez un mot ou une phrase qui décrit le type de
commande que vous souhaitez trouver. Vous obtiendrez
ainsi une liste de toutes les commandes dont le nom ou le
synopsis correspond aux termes de la recherche.

$ man list

No manual entry for list

$ man -k list

last (1) - show listing of last logged in users

ls (1)   - list directory contents

lshw (1) - list hardware

lsof (8) - list open files

[liste coupée en raison de sa longueur]

Faites attention avec l’option -k car elle peut générer une


liste de résultats très longue et vous risquez de passer à
côté de ce que vous cherchez. N’hésitez pas à utiliser
différents critères de recherche si cela peut vous aider à
trouver la commande désirée.

Astuce
Si les résultats sont particulièrement longs et si vous ne
parvenez pas à trouver ce que vous cherchez, essayez de
rediriger man –k vers grep. (La redirection fera l’objet du prochain
chapitre, tandis que grep sera détaillé au chapitre 10, «
Recherche d’éléments ».) Pour le moment, voici un exemple
d’utilisation : man -k list | grep hardware. Vous pouvez aussi
essayer apropos.

La commande apropos équivaut à man -k, à une exception


près : à l’instar de whatis (décrite dans la section
précédente), vous pouvez utiliser les options -w (ou --
wildcard) ou -r (ou --regex) dans les recherches. Plus
intéressante, l’option -e (ou --exact) permet d’effectuer une
recherche précise sur un mot ou une phrase sans exception.
Par exemple, dans le listing précédent, la recherche sur list
a fait apparaître la commande last car le mot listing figure
dans sa description. Procédons à la même recherche, mais
avec l’option -e.

$ apropos -e list

ls (1)   - list directory contents

lshw (1) - list hardware

lsof (8) - list open files

Cette fois-ci, last n’apparaît plus car on a fait une


recherche précise sur le mot list, ce qui exclut listing. La
recherche sur list sans l’option -e donne 80 résultats ; avec,
elle n’en donne plus que 55, ce qui facilite la localisation de
la commande recherchée.

Afficher une page man spécifique

man [1-8]

Vous avez peut-être remarqué dans le listing précédent que


la première ligne de la page man pour ls indique LS(1) et
que, lorsque vous avez employé l’option -k, tous les noms
de commandes étaient suivis de chiffres entre parenthèses.
La plupart du temps, ce chiffre est 1 mais, dans le cas de
lsof, c’était un 8. À quoi correspondent-ils ?
Les pages man sont classées en sections numérotées de
1 à 8, qui se répartissent comme suit (ne vous inquiétez pas
si vous ne reconnaissez pas certaines commandes,
quelques-unes sont très spécialisées) :
1. Commandes générales. Exemples : cd, chmod, lp, mkdir et
passwd.
2. Appels système de bas niveau fournis par le noyau.
Exemples : gettimeofday, fork et chmod.
3. Fonctions de la bibliothèque C. Exemples : beep,
HTML::Parser et Mail::Internet.
4. Fichiers spéciaux, comme les périphériques figurant dans
/dev. Exemples : console, lp et mouse.
5. Formats de fichiers et conventions. Exemples : apt.conf,
dpkg. cfg, hosts et passwd.
6. Jeux. Exemples : atlantik, bouncingcow, kmahjongg et rubik.
7. Divers, dont les paquetages de macros. Exemples : ascii,
samba et utf-8.
8. Commandes d’administration système, généralement
utilisées par root. Exemples : mount et shutdown.
Presque toutes les commandes que nous avons vues
jusqu’à présent entrent dans la catégorie 1, ce qui n’est pas
surprenant puisque nous nous sommes limités aux bases de
Linux. Vous remarquerez que certaines appartiennent à
plusieurs catégories. C’est le cas de chmod qui appartient aux
catégories 1 et 2, et de passwd qui figure dans les catégories
1 et 5.
Par défaut, si vous saisissez man passwd dans votre shell,
man affiche la page appartenant à la plus petite catégorie.
Vous obtiendrez donc la section 1 des pages man pour la
commande passwd, ce qui ne vous sera pas d’une grande
utilité si vous souhaitez des renseignements sur le fichier
passwd. Pour afficher la page man du fichier passwd, faites
suivre man du numéro de la section contenant les données à
afficher.
$ man passwd

PASSWD(1)                                User Commands                               


PASSWD(1)

NAME

      passwd - change user password

SYNOPSIS

      passwd [-f|-s] [name]

      passwd [-g] [-r|-R] group

      passwd [-x max] [-n min] [-w warn] [-i inact] login

      passwd {-l|-u|-d|-S|-e} login

DESCRIPTION

      passwd changes passwords for user and group accounts. A


➥normal user...

[liste coupée en raison de sa longueur]

$ man 5 passwd

PASSWD(5)                File Formats and Conversions               


PASSWD(5)

NAME

      passwd - The password file

DESCRIPTION

      passwd contains various pieces of information for each


user ➥account.

[liste coupée en raison de sa longueur]

Trouver des informations sur une


commande grâce à info

info

La commande man et les pages qu’elle génère sont simples à


utiliser, même si le contenu affiché n’est pas
nécessairement toujours aussi clair qu’on le souhaiterait.
Pour simplifier les choses, le GNU Project, qui est impliqué
dans la création de bon nombre de commandes abordées
dans ce livre, a créé son propre format de pages
d’informations qui repose sur la commande info.
Les pages info sont souvent mieux écrites, plus claires et
emploient une terminologie abordable, mais les pages man
sont beaucoup plus simples à utiliser. Une page man n’est
qu’une page alors que les pages info sont organisées en
sections appelées nœuds qui peuvent contenir des sous-
sections nommées sous-nœuds. La difficulté d’utilisation est
liée à la navigation dans les pages, mais aussi dans les
nœuds et les sous-nœuds. Lors des premières utilisations, la
navigation et la recherche dans les pages info peuvent donc
être déroutantes. En fait, le système conçu pour trouver une
alternative plus conviviale aux pages man pour les
utilisateurs débutants est, dans la pratique, bien plus
compliqué à utiliser, paradoxal, non ?

Info
Personnellement, je n’aime pas vraiment les pages info. Si je
suis obligé d’en utiliser une, car il n’existe aucune bonne page
man, je me tourne habituellement vers Google.

info présente de nombreuses facettes (c’est un


euphémisme !). Pour accéder au « mode d’emploi » d’info,
saisissez la commande qui suit :

$ info info

Elle ouvre la page info de la commande info (ensuite,


essayez juste avec info pour voir le résultat). Vous devez à
présent apprendre à parcourir ce nouveau monde
d’informations.

Naviguer dans info


Dans une section donnée, pour descendre ou monter une
ligne à la fois, utilisez les touches Flèche haut et Flèche bas.
Lorsque vous atteignez la fin de la section, le curseur
s’arrête et ne peut pas descendre plus bas.
Pour faire défiler les informations écran par écran, utilisez
les touches Page suivante et Page précédente. Elles ne
permettent pas de quitter la section dans laquelle on se
trouve.
Si vous avez atteint la fin d’une section et souhaitez
revenir au début, appuyez sur la touche b (beginning). Pour
atteindre la fin du document, utilisez la touche e (end).
Si au cours de votre navigation dans une page info, vous
rencontrez des caractères étranges ou distordus, servez-
vous de la combinaison de touches Ctrl+l pour forcer le
rafraîchissement de l’écran.
Maintenant que vous savez naviguer dans une section ou
un noeud, voyons comment naviguer entre les nœuds. Si
vous ne souhaitez pas utiliser les touches Page suivante et
Page précédente pour avancer ou reculer dans une section,
vous pouvez employer la barre d’espace pour avancer et la
touche Retour arrière ou Suppr pour reculer. Ces touches
présentent un avantage supplémentaire : lorsque vous
atteignez la fin d’un noeud, vous passez automatiquement
au noeud suivant, s’il existe, en passant par les sous-
nœuds, s’il y en a également. En remontant, vous accédez
au noeud précédent en passant par ses sous-nœuds. Grâce
à la barre d’espace et aux touches Retour arrière et Suppr,
vous pouvez naviguer rapidement dans toutes les pages
info d’une même commande.
Si vous souhaitez moins utiliser les touches de votre
clavier, vous pouvez presser la touche n (pour next) pour
atteindre le noeud suivant au même niveau. Si vous lisez un
noeud qui possède des sous-nœuds et appuyez sur n, vous
sautez ces sous-nœuds et atteignez le noeud suivant situé
au même niveau que le noeud courant. Si vous lisez un
sous-noeud et appuyez sur la touche n, vous atteignez le
sous-noeud suivant. Si n permet d’atteindre le sous-noeud
suivant au même niveau, la touche p (pour previous) permet
d’atteindre le précédent, toujours au même niveau.
Si vous souhaitez descendre d’un noeud ou d’un sous-
noeud, utilisez la touche ]. Si vous lisez un noeud et
appuyez sur la touche ], vous atteignez le premier sous-
noeud de ce noeud, s’il existe. Dans le cas contraire, vous
atteignez le noeud suivant situé au même niveau que le
noeud courant. Pour revenir en arrière selon les mêmes
principes, utilisez la touche [.
Si vous souhaitez remonter d’un noeud, vers le parent du
noeud que vous lisez actuellement, utilisez la touche u (pour
up). Faites attention, car on a vite fait de remonter au-delà
de la page d’accueil du noeud courant et d’atteindre le
noeud baptisé Directory, qui est le noeud racine qui mène à
tous les autres nœuds. Pour atteindre rapidement le noeud
Directory, il suffit d’appuyer sur la touche d.
Le noeud Directory est un exemple du type de page que
vous trouverez dans info, c’est une page de menu qui
énumère des nœuds et des sous-nœuds. Lorsque vous êtes
dans une page de type menu, vous pouvez atteindre
rapidement les sous-nœuds proposés grâce à deux
techniques. Appuyez sur la touche m (pour menu) et
saisissez à la suite le nom du sous-noeud à atteindre. Voici,
par exemple, la page qui s’affiche lorsqu’on tape info sur la
ligne de commande :

File: dir,      Node: Top       This is the top of the INFO


tree

  This (the Directory node) gives a menu of major topics.

  Typing "q" exits, "?" lists all Info commands, "d" returns

➥here,

  "h" gives a primer for first-timers,

  "mEmacs<Return>" visits the Emacs manual, etc.

* Menu:

Basics

* Common options: (coreutils)Common options.

* Coreutils: (coreutils). Core GNU (file, text, shell)


utilities.

* Date input formats: (coreutils)Date input formats.

* Ed: (ed). The GNU line editor

Pour atteindre le noeud Coreutils, tapez m suivi de Core.


Vous pouvez saisir le reste (utils) ou appuyer sur la touche
Tab et laisser info compléter le reste du nom du menu en
fonction des caractères que vous avez commencé à saisir. Si
info signale que vous avez mal tapé quelque chose ou que
ce que vous avez saisi peut correspondre à plusieurs
éléments de menu, corrigez la saisie ou prolongez-la de
sorte qu’il n’y ait plus de confusion possible. Si vous
changez finalement d’idée, appuyez sur Ctrl+g pour annuler
la commande et revenir au noeud précédent.
Vous pouvez aussi utiliser les touches fléchées pour
atteindre un élément de menu. Une fois l’élément
sélectionné, appuyez sur la touche Entrée. Les deux
méthodes sont valables.
Pour effectuer une recherche dans les pages info, vous
avez deux possibilités : rechercher à partir du titre des
nœuds ou à partir du texte de tous les nœuds associés à
une commande donnée. Dans le premier cas, tapez i
(index) suivi du terme de la recherche et appuyez sur la
touche Entrée. Si le terme recherché existe dans le titre
d’un noeud, vous accédez directement à ce noeud. Pour
atteindre l’occurrence suivante de la recherche, appuyez sur
la touche virgule (,).
Dans le second cas, à partir du texte, saisissez s (search)
suivi du critère de recherche et appuyez sur la touche
Entrée. Pour accéder à l’occurrence suivante, pressez la
touche s de votre clavier suivi immédiatement de la touche
Entrée.
Si vous vous sentez perdu dans les pages info, vous
pouvez appuyer sur la touche ? pour afficher les raccourcis
de navigation dans la partie inférieure de la console.
Déplacez-vous dans cette aide à l’aide des touches que
vous connaissez déjà. Pour la quitter, appuyez sur la touche
l.
Pour quitter les pages info, appuyez simplement sur la
touche q (quit).

Localiser les chemins de l’exécutable


d’une commande, de ses sources et de
ses pages man

whereis

La commande whereis apporte une fonctionnalité


incroyablement utile : connaître les chemins de l’exécutable
d’une commande, de ses fichiers source (s’ils existent) et de
ses pages man. Voici, par exemple, ce qu’on obtient pour
KWord, le traitement de texte de KOffice (en supposant, bien
entendu que les exécutables, les fichiers sources et les
pages man soient installés).

$ whereis kword

kword: /usr/src/koffice-1.4.1/kword /usr/bin/kword

➥/usr/bin/X11/kword usr/share/man/man1/kword.1.gz

La commande indique d’abord que les fichiers source


sont : /usr/ src/koffice-1.4.1/kword. Elle informe ensuite de
l’emplacement des exécutables : /usr/bin/kword et
/usr/bin/X11/kword. KWord figure donc à deux emplacements
sur cette machine, ce qui est un peu inhabituel, mais pas
étonnant. Pour finir, elle indique où se trouvent ses pages
man : /usr/share/man/man1/kword.1.gz. Armé de ces
informations, vous savez maintenant que le programme est
installé et vous savez comment le lancer.
Pour ne rechercher que les exécutables, utilisez l’option -
b.

$ whereis -b kword

kword: /usr/bin/kword /usr/bin/X11/kword

Pour rechercher uniquement les pages man, utilisez


l’option -m.

$ whereis -m kword

kword: /usr/share/man/man1/kword.1.gz

Enfin, pour limiter la recherche aux fichiers sources,


utilisez l’option -s.

$ whereis -s kword

kword: /usr/src/koffice-1.4.1/kword

La commande whereis est très pratique pour quiconque


souhaite obtenir des informations sur les programmes
installés sur sa machine. Vous l’utiliserez plus souvent que
vous ne le pensez.

Déterminer quelle version d’une


commande s’exécutera

which

Vous vous souvenez de ce qu’a produit la commande whereis


avec l’option -b sur KWord pour n’afficher que les
exécutables.
$ whereis -b kword

kword: /usr/bin/kword /usr/bin/X11/kword

L’exécutable de KWord figure à deux emplacements. Au


lancement du programme, lequel des deux va donc être
exécuté en premier ? Pour le déterminer, utilisez la
commande which.

$ which kword

/usr/bin/kword

La commande which permet de savoir quelle version d’un


programme sera lancée si vous tapez simplement son nom.
En d’autres termes, si vous saisissez kword et appuyez sur
Entrée, votre shell exécute le fichier qui se trouve dans
/usr/bin. Pour lancer la version qui se trouve dans
/usr/bin/X11, vous devez changer de répertoire à l’aide de la
commande cd et saisir ./kword ou utiliser le chemin absolu de
la commande, /usr/bin/X11/kword.
La commande which est également un moyen rapide de
déterminer si une commande est installée sur un système.
Dans l’affirmative, et sous condition qu’elle se trouve aussi
dans votre PATH, le résultat indiquera son emplacement.
Dans le cas contraire, vous serez ramené à la ligne de
commande sans qu’il se passe quoi que ce soit.

$ which arglebargle

Pour connaître tous les emplacements d’une commande


(comme si vous utilisiez whereis -b), essayez l’option -a
(pour all).

$ which -a kword

/usr/bin/kword

/usr/bin/X11/kword

Découvrir comment une commande sera


interprétée

type

La commande type montre comment les commandes que


vous exécutez seront interprétées par bash. Vous
comprendrez mieux ce que cela signifie avec quelques
exemples.
Commençons par examiner ce qui se passe quand nous
utilisons type :

$ type ls

ls is aliased to ‘/bin/ls -F --color’

$ type cd

cd is a shell builtin

$ type whereis

whereis is /usr/bin/whereis

$ type mark

mark is a function

mark ()

   mkdir -p "$MARKPATH";

   ln -s "$(pwd)" "$MARKPATH/$1"

$ type do

do is a shell keyword

Les résultats de type montre comment bash voit chacune


de ces commandes. Cinq réponses sont possibles :
• alias : lien symbolique que vous avez créé, y compris la
cible de l’alias. Cela ne fonctionne pas avec les liens
matériels et rien ne sera affiché (pour de plus amples
informations sur le lien, consulter le chapitre 3, «
Création et destruction »).
• builtin : une commande intégrée à bash et qui s’exécute
directement dans l’interpréteur de commande, a
contrario d’un appel à un programme externe. alias, cd,
echo, history, source et type sont des exemples de
commandes intégrées.
• file : une commande qui n’est pas intégrée au shell et
qui est donc invoquée de manière externe. whereis et
whatis, vues dans ce chapitre, en sont des exemples.
• function : une fonction (voir au chapitre 12, « Le shell »)
créé par Linux, un logiciel ou vous-même. Comme pour
un alias, type affiche également le contenu réel de la
fonction.
• keyword : un mot réservé, utilisé uniquement par bash,
comme do, for, if, then, while et !.
Pour savoir uniquement celle des cinq possibilités qui
s’applique à une commande, sans autre information, utiliser
l’option -t.

$ type -t ls

alias

$ type -t cd

builtin

$ type -t mark

function

Clair et net ! L’option -a est un peu plus bavarde, car elle


indique non seulement le type de la commande, mais
également tous ses emplacements.

$ type -a ls

ls is aliased to ‘/bin/ls -F --color’

ls is /bin/ls

Nous savons donc que ls est un alias et connaissons sa


cible, ainsi que le chemin de la commande d’origine.
La commande type n’a pas un usage quotidien, mais si
vous vous demandez pourquoi une commande n’agit pas
comme attendu, elle vous aidera à en comprendre la raison.
Conclusion

Le titre de ce chapitre est « Informations sur les commandes


» et c’est bien ce dont il a été question ici. Vous avez vu
qu’il existe de nombreuses façons d’obtenir plus
d’informations sur une commande donnée. Dans cette
catégorie, les deux poids lourds sont man et info avec toutes
les données qu’ils renferment à propos de pratiquement
toutes les commandes Linux. Souvenez-vous aussi que les
commandes whereis, which et type peuvent être utiles, en
particulier si vous souhaitez obtenir rapidement une
information sans vous perdre dans les pages man ou info.
Parfois, vous serez quand même obligé de remonter vos
manches et de vous plonger dans la lecture des pages de
manuel. C’est un peu comme les brocolis, vous n’aimez pas
ça, mais c’est bon pour votre santé.
Il est vrai que la plupart des commandes de ce chapitre
se recoupent dans une certaine mesure. man -k, par
exemple, équivaut à apropos, man -f, à whatis, et whereis -b, à
which -a. C’est à vous de choisir ce qui vous convient le
mieux. Il est intéressant de connaître toutes ces
commandes, ne serait-ce que pour pouvoir déchiffrer des
scripts écrits par d’autres. Avec Linux, tout est diversité et
choix, même pour des choses apparemment aussi
insignifiantes que l’exécution de commandes dans le shell.
Chapitre 5
Création de blocs de
commandes
Lorsque vous étiez petit, vous avez découvert les nombres
et la façon de les combiner à l’aide de symboles, comme +,
–, × et =. Jusqu’à présent, vous avez découvert des
commandes, mais vous les avez exécutées chaque fois de
façon isolée, une par une. Dans la pratique, ces commandes
peuvent être combinées de diverses façons à l’aide de
symboles tels que |, >, >> et <, et même < et > réunis. En fait,
cette possibilité d’associer des commandes à l’aide de ces
symboles explique en grande partie la puissance d’Unix.
Dans ce chapitre, vous allez voir comment créer des blocs
de commandes pour utiliser plus efficacement les
commandes présentées jusqu’ici, mais aussi celles que vous
découvrirez dans le reste du livre.

Exécuter plusieurs commandes


séquentiellement

Comment devez-vous procéder pour exécuter une suite de


commandes, dont certaines peuvent prendre du temps, et
que vous ne souhaitez pas rester planté devant votre
ordinateur à attendre la fin de l’exécution d’une commande
pour lancer la suivante ? Imaginons, par exemple, que vous
ayez une grande quantité de MP3 de John Coltrane dans une
archive zippée et que vous souhaitiez les décompresser
tous, les placer dans un nouveau répertoire et supprimer
l’archive. Normalement, vous devriez exécuter ces
commandes une par une, comme ceci :

$ ls -l /home/scott/music

-rw-r--r-- 1 scott scott 1437931 2005-11-07 17:19

➥John_Coltrane.zip

$ unzip /home/scott/music/John_Coltrane.zip

$ mkdir -p /home/scott/music/coltrane

$ mv /home/scott/music/John_Coltrane*.mp3

➥/home/scott/music/coltrane/

$ rm /home/scott/music/John_Coltrane.zip

John_Coltrane.zip est un fichier de 1,4 Go : même avec


une machine rapide, la décompression de ce monstre
prendra du temps et vous avez sans doute mieux à faire
qu’attendre devant votre ordinateur. C’est là que l’exécution
séquentielle d’une suite de commandes peut être utile.
Le chaînage de commandes place toutes les commandes
à exécuter sur une ligne du shell, séparées par un point-
virgule (;). Chacune est alors exécutée de façon
séquentielle et doit se terminer, que ce soit avec succès ou
en échec, avant que la suivante ne s’exécute. C’est une
technique très simple à mettre en oeuvre et qui peut vous
faire gagner beaucoup de temps.
Avec le chaînage de commandes, la série de commandes
précédentes ressemblera donc à ceci :

$ ls -l /home/scott/music

-rw-r--r-- 1 scott scott 1437931 2005-11-07 17:19

➥John_Coltrane.zip

$ unzip /home/scott/music/John_Coltrane.zip ;

➥mkdir -p /home/scott/music/coltrane ;

➥mv /home/scott/music/John_Coltrane*.mp3

➥/home/scott/music/coltrane/ ;

➥rm /home/scott/music/John_Coltrane.zip

Cette technique se révélera très pratique si l’exécution de


chaque étape d’une séquence prend beaucoup de temps.
Pour éviter de rester devant l’ordinateur en attendant de
pouvoir saisir la commande suivante, enchaînez-les avec
des points-virgules (;) et laissez l’ordinateur travailler tout
l’après-midi, passant automatiquement d’une commande à
l’autre. Pendant que votre ordinateur devient un dispositif
d’économie de travail, allez regarder un film, manger ou
vaquer à tout autre occupation productive.
Bien entendu, vous pouvez également utiliser cette
méthode pour créer de courtes pauses lors de l’exécution
des commandes. Si vous souhaitez créer une capture
d’écran de ce qui s’affiche sur votre moniteur, exécutez la
commande suivante (en supposant que le paquetage
ImageMagick soit installé, ce qui est le cas avec presque
toutes les distributions de Linux) :

$ sleep 3 ; import -frame window.tif

Dans cet exemple, la commande sleep crée une pause de


trois secondes pendant laquelle une capture d’écran est
prise avec import. Ce délai vous laisse le temps de réduire la
fenêtre de la console et de placer au premier plan celle que
vous voulez faire figurer sur la capture. Le symbole ; permet
de séparer logiquement des commandes pour exploiter leur
potentiel au maximum.

Attention
Faites attention avec le chaînage des commandes, en particulier
lorsqu’il s’agit de déplacer ou de supprimer des fichiers. Vérifiez
que ce que vous avez tapé correspond bien à ce que vous
souhaitez faire, car les commandes vont s’exécuter les unes
après les autres et vous risquez d’obtenir un résultat
surprenant.
Exécuter des commandes uniquement en
cas de succès des précédentes

&&

Dans l’exemple précédent, vous avez vu que le symbole ;


permettait d’enchaîner des commandes :

$ unzip /home/scott/music/John_Coltrane.zip ;

➥mkdir -p /home/scott/music/coltrane ;

➥mv /home/scott/music/John_Coltrane*mp3

➥/home/scott/music/coltrane/ ;

➥rm /home/scott/music/John_Coltrane.zip

Que va-t-il se passer si la saisie de la commande est


erronée :

$ unzip /home/scott/John_Coltrane.zip ;

➥mkdir -p /home/scott/music/coltrane ;

➥mv /home/scott/music/John_Coltrane*mp3

➥/home/scott/music/coltrane/ ;

➥rm /home/scott/music/John_Coltrane.zip

À la place de unzip /home/scott/music/John_Coltrane.zip,


vous avez accidentellement saisi unzip
/home/scott/John_Coltrane. zip. Vous n’avez pas remarqué
l’erreur dans le chemin du fichier zippé, vous avez appuyé
sur la touche Entrée et vous êtes parti vaquer à vos
occupations. Votre ordinateur ne peut décompresser
/home/scott/ John_Coltrane.zip puisque ce fichier n’existe pas.
Il passe donc à la commande suivante (mkdir) qu’il exécute
sans problème. La troisième commande (mv) ne peut être
exécutée, car il n’y a pas de MP3 à déplacer puisque le
fichier n’a pu être décompressé. Pour finir, la quatrième
commande est exécutée et supprime le fichier zip (notez
que cette fois, le chemin est correct) sans vous donner la
possibilité de le récupérer et de recommencer l’opération.
Aïe !

Info
Vous ne croyez pas qu’un tel enchaînement d’événements
puisse se produire ? La chose m’est arrivée il y a quelques
années et je me suis senti particulièrement stupide.

C’est le problème lorsqu’on utilise le symbole ;. Les


commandes s’exécutent les unes à la suite des autres,
qu’elles réussissent ou qu’elles échouent. Une méthode plus
intéressante consiste à séparer les commandes par &&, qui
permet aussi l’exécution séquentielle des commandes, mais
interrompt la chaîne lorsqu’une commande n’a pas réussi
(techniquement, une commande doit renvoyer un état 0
pour que la suivante soit exécutée). Si une commande
échoue, l’exécution de la chaîne de commandes est
interrompue.
En utilisant && à la place de ;, le code précédent devient
celui-ci :

$ unzip /home/scott/John_Coltrane.zip &&

➥mkdir -p /home/scott/music/coltrane &&

➥mv /home/scott/music/John_Coltrane*mp3

➥/home/scott/music/coltrane/ &&

➥rm /home/scott/music/John_Coltrane.zip

Puisque la première commande unzip ne peut pas être


exécutée avec succès, le processus s’arrête. De retour de
votre promenade, vous constaterez que la série de
commandes n’a pu être exécutée, mais le fichier
John_Coltrane.zip sera encore là. C’est beaucoup mieux !
Voici deux autres exemples qui illustrent l’utilité de &&. Au
chapitre 14, « Installation de logiciels », vous allez découvrir
apt, un moyen très simple de mettre à jour votre distribution
Debian ou assimilée. Lorsqu’on utilise apt, on met à jour la
liste des logiciels disponibles, puis on cherche s’il existe des
mises à jour les concernant. Si la liste des logiciels ne peut
pas être actualisée, on ne souhaite bien évidemment pas
rechercher de mises à jour. Pour être sûr que le second
processus ne soit pas exécuté inutilement, séparez les
commandes par && :

# apt-get update && apt-get upgrade

Second exemple, vous souhaitez convertir un fichier


PostScript en PDF en utilisant la commande ps2pdf, imprimer
le PDF, puis supprimer le fichier PostScript. La meilleure
solution consiste à séparer les commandes par && :

$ ps2pdf foobar.ps && lpr foobar.pdf && rm foobar.ps

Si vous utilisez des ; à la place et que ps2pdf échoue, le


fichier PostScript sera détruit sans que vous puissiez
bénéficier d’un PDF imprimé.
Maintenant, êtes-vous convaincu que && est souvent le
meilleur moyen de parvenir à ses fins ? S’il n’y a aucun
risque de suppression de fichier, ; peut faire l’affaire, mais si
l’une des commandes de la chaîne fait appel à rm ou à une
autre fonction qui ne peut pas être annulée, préférez-lui &&.

Exécuter une commande uniquement en


cas d’échec de la précédente

||

&& permet d’exécuter une séquence de commandes


uniquement si chaque commande aboutit à un succès. Le
symbole || fait l’inverse : si une commande échoue (si elle
renvoie un état différent de 0), alors la commande suivante
est exécutée. C’est une sorte de commutateur l’un ou
l’autre – on exécute la première commande ou, sinon, la
seconde.
Le symbole || sert souvent à envoyer une alerte à un
administrateur lorsqu’un processus s’interrompt. Par
exemple, pour déterminer si un ordinateur donné est allumé
et fonctionne, un administrateur peut l’interroger
constamment avec une commande ping (voir le chapitre 15,
« Connectivité »). Si un ping échoue, un message
électronique peut être envoyé à l’administrateur pour le
prévenir.

ping -c 1 -w 15 -n 8.8.8.8 ||
{

    echo "Server down" | mail -s ‘Server down’


admin@website.com

Info
Vous vous demandez ce qu’est ce symbole | (avec une seule
barre) ? Consultez la section « Utiliser la sortie d’une commande
comme entrée d’une autre » dans la suite de ce chapitre pour
découvrir sa fonction.

En réfléchissant un tout petit peu, vous comprendrez


rapidement le nombre de services que peut vous rendre le
symbole ||. *C’est un outil puissant qui peut être très
pratique.

Relier la sortie d’une commande à une


autre commande

$()
La substitution de commande prend la sortie d’une
commande et l’insère dans une autre commande, comme si
vous aviez saisi manuellement le résultat de la première
commande directement dans la suivante. La première
commande, celle dont on souhaite réutiliser la sortie
ailleurs, doit être entre parenthèses, comme ceci : $().
Prenons un exemple pour être plus clair.
Vous revenez d’un repas familial, connectez votre
appareil photo numérique à votre ordinateur Linux, en
extrayez les images et souhaitez les placer dans un dossier
portant la date du jour.

$ pwd

/home/scott/photos/family

$ ls -1F

2015-11-01/

2015-11-09/

2015-11-15/

$ date "+%Y-%m-%d"

2015-11-24

$ mkdir $(date "+%Y-%m-%d")

$ ls -1F

2015-11-01/

2015-11-09/

2015-11-15/

2015-11-24/

Dans cet exemple, date “+%Y-%m-%d” est exécutée en


premier, puis la sortie de cette commande, 2015-11-24, est
utilisée comme nom par mkdir pour créer le nouveau
répertoire. Cela revient à avoir tapé mkdir 2015-11-24. Voilà
un outil puissant. Si vous étudiez des scripts de shell (que
l’on trouve aisément sur Internet), vous constaterez que la
substitution de commande est omniprésente.

Info
Autrefois, on était supposé englober la commande initiale dans
une paire d’apostrophes inversées (symbole `). Aujourd’hui, il
est conseillé d’employer la syntaxe utilisée dans le code
précédent : $(). Il est possible d’imbriquer $(), c’est-à-dire avoir
$() à l’intérieur d’un autre $(), alors qu’il est beaucoup plus
complexe d’utiliser des apostrophes inversées dans d’autres
apostrophes inversées. Par ailleurs, $() est beaucoup plus
visible !

Comprendre les flux d’entrée-sortie

Pour exploiter les informations de ce chapitre, vous devez


comprendre que le shell Linux utilise trois flux d’entrée-
sortie : l’entrée standard, la sortie standard et l’erreur
standard. Chacun d’eux possède un descripteur de fichier
(ou identifiant numérique), une abréviation et une valeur
par défaut usuelle.
Lorsque vous tapez quelque chose sur votre clavier, par
exemple, vous envoyez des informations à l’entrée
standard, dont le nom abrégé est stdin et qui est identifiée
par le chiffre 0. Lorsque votre ordinateur affiche son résultat
sur le terminal, c’est sur la sortie standard abrégée en stdout
et identifiée par le chiffre 1. Enfin, si le système veut vous
signaler une erreur, il l’affiche également sur le terminal, qui
est aussi la sortie d’erreur standard, abrégée en stderr et
identifiée par le chiffre 2.
Voyons comment fonctionnent ces flux avec la
commande ls. Lorsque vous saisissez ls sur votre clavier,
vous utilisez stdin. Après avoir tapé ls et appuyé sur la
touche Entrée, vous voyez s’afficher la liste des dossiers et
des fichiers, grâce à stdout. Si vous essayez d’utiliser ls avec
un dossier qui n’existe pas, un message d’erreur s’affiche
dans votre console grâce à stderr.
Le tableau 5.1 vous aidera à mémoriser ce qu’il faut
retenir sur ces flux.

Tableau 5.1 Les trois flux d’entrée-sortie


Nous allons apprendre ici à rediriger les sorties et les
entrées. Au lieu d’afficher une sortie dans la console, par
exemple, vous pouvez la rediriger vers un autre programme.
Au lieu de récupérer une entrée à partir du clavier, il est
aussi possible d’aller la chercher dans un fichier. Une fois
que vous aurez compris le principe, vous pourrez jouer avec
stdin et stdout et exploiter toute leur puissance.

Utiliser la sortie d’une commande comme


entrée d’une autre

Unix est fait de petits éléments étroitement imbriqués et


rien ne correspond mieux à ce principe que le concept de
tube (pipe). Un tube est représenté par le symbole | sur
votre clavier ; lorsqu’il est placé entre deux commandes, il
permet de relier la sortie de la première à l’entrée de la
seconde. En d’autres termes, | redirige le stdout de la
première commande vers le stdin de la suivante.
Voici un exemple simple pour clarifier ce concept. Vous
connaissez déjà ls et découvrirez en détail less au chapitre
6, « Affichage du contenu des fichiers ». Pour l’instant,
sachez simplement que less permet de faire défiler des
fichiers texte page par page. Si vous exécutez ls sur un
répertoire contenant de nombreux fichiers, comme /usr/bin,
le résultat va défiler trop vite à l’écran pour que vous
puissiez le lire. Si, en revanche, vous utilisez un pipe pour
relier la sortie de ls à l’entrée de less, vous pourrez afficher
le résultat page par page.

$ pwd

/usr/bin

$ ls -1

zipinfo

zipnote

zipsplit

zsoelim

zxpdf

[liste coupée en raison de sa longueur - 2318 lignes !]

$ ls -1 | less

7z

a2p

acidrip

aconnect

Les pages du résultat s’affichent une par une lorsque


vous créez un tube entre la sortie de ls -l et l’entrée de
less, ce qui facilite beaucoup la lecture des informations.
Voici un autre exemple plus poussé, qui utilise deux
commandes dont il sera question plus tard, ps et grep. Au
chapitre 10, « Recherche d’éléments », vous découvrirez
que ps permet de lister les processus actifs et, au chapitre
13, « Surveillance des ressources système », que grep
permet de rechercher dans des fichiers les lignes
correspondant à certains motifs. Imaginons que Firefox se
comporte bizarrement et que vous soupçonniez que
plusieurs copies du programme s’exécutent en arrière-plan.
La commande ps énumère tous les processus en cours
d’exécution sur votre ordinateur, mais cette liste peut être
longue et ne s’affiche qu’un court instant. Si vous reliez la
sortie de ps à l’entrée de grep et faites une recherche sur
firefox, vous saurez instantanément si Firefox est toujours
actif.
$ ps ux

1504  0.8 4.4   75164  46124 ?      S   Nov20  1:19 kontact

19003 0.0 0.1    3376   1812 pts/4  S+  00:02  0:00 ssh

➥admin@davidhart.com

21176 0.0 0.0       0      0 ?      Z   00:14  0:00

➥[wine-preloader] <defunct>

24953 0.4 3.3   51856  34140 ?      S   00:33  0:08 08

➥kdeinit: kword /home/scott/documents/clientele/current

[liste coupée en raison de sa longueur]

$ ps ux | grep firefox

8272  4.7 10.9 184072 112704 ?      Sl  Nov19 76:45

➥/opt/firefox/firefox-bin

On est passé de 58 lignes en sortie à une seule, ce qui


simplifie évidemment la lecture.

Info
La plupart des programmes peuvent fonctionner avec des tubes,
mais pas tous. L’éditeur de texte vim (ou pico, nano ou emacs), par
exemple, a un contrôle total du shell et tout ce qui est saisi au
clavier est donc redirigé vers vim. Les sorties, elles, s’affichent
dans le programme. vim ayant un contrôle total sur le shell, il est
impossible de rediriger sa sortie. Vous apprendrez à reconnaître
les programmes qui ne peuvent être utilisés avec des tubes à
mesure que vous emploierez le shell.

Rediriger la sortie d’une commande vers


un fichier

>

En principe, la sortie est dirigée vers l’écran, aussi appelé


stdout. Si vous ne souhaitez pas que le résultat aille sur
l’écran et préférez le stocker dans un fichier, servez-vous du
caractère > (supérieur à).
$ pwd

/home/scott/music

$ ls -1F

Hank_Mobley/

Horace_Silver/

John_Coltrane/

$ ls -1F Hank_Mobley/ > hank_mobley.txt

$ cat hank_mobley.txt

1958_Peckin’_Time/

1960_Roll_Call/

1960_Soul_Station/

1961_Workout/ 1963_No_Room_For_Squares/

$ ls -1F

Hank_Mobley/

hank_mobley.txt

Horace_Silver/

John_Coltrane/

Notez que le fichier hank_mobley.txt n’existait pas avant


l’utilisation de >. Il a été créé lorsque vous avez utilisé > pour
établir une redirection vers un fichier inexistant. C’est là
qu’il faut faire attention : s’il avait existé, il aurait été
écrasé.

Attention
Faites attention lorsque vous utilisez des redirections, car vous
pouvez détruire le contenu de fichiers importants.

Empêcher l’écrasement de fichiers lors


d’une redirection

set -o noclobber

Il existe cependant un moyen d’empêcher l’écrasement de


fichiers lors d’une redirection : l’option noclobber. Si vous
activez noclobber, bash empêche l’écrasement de fichiers lors
d’une redirection s’il n’a pas votre permission explicite. Pour
activer noclobber, utilisez la commande suivante :
$ set -o noclobber

Désormais, si vous souhaitez utiliser la redirection et


autoriser l’écrasement de fichiers, utilisez >| à la place de >,
comme ceci :

$ pwd

/home/scott/music

$ ls -1F

Hank_Mobley/

hank_mobley.txt

Horace_Silver/

John_Coltrane/

$ ls -1F Hank_Mobley/ > hank_mobley.txt

ERROR

$ ls -1F Hank_Mobley/ >| hank_mobley.txt

$ cat hank_mobley.txt

1958_Peckin’_Time/

1960_Roll_Call/

1960_Soul_Station/

1961_Workout/

1963_No_Room_For_Squares/

Pour désactiver noclobber si cette méthode ne vous


convient pas, utilisez la commande :
 
$ set +o noclobber
 
(Vous avez bien lu, -o signifie actif et +o, inactif. Ne vous
inquiétez pas, vous ne devenez pas fou. Dans ce cas, c’est
bash qu’il faut blâmer.)
Pour activer noclobber de façon permanente, ajoutez set -
o noclobber dans votre fichier .bashrc.

Ajouter la sortie d’une commande à un


fichier
>>

Vous l’avez vu, le caractère > redirige la sortie de stdout vers


un fichier. Vous pouvez, par exemple, rediriger la sortie de la
commande date vers un fichier :

$ date

Mon Nov 21 21:33:58 CST 2015

$ date > hank_mobley.txt

$ cat hank_mobley.txt

Mon Nov 21 21:33:58 CST 2015

Souvenez-vous que > entraîne la création du fichier si le


fichier indiqué n’existe pas déjà, et le remplacement du
fichier s’il existe. Si vous utilisez >> à la place de >, la sortie
de la commande est ajoutée à la fin du fichier concerné (et
si le fichier n’existe pas, il est créé).

$ cat hank_mobley.txt

Mon Nov 21 21:33:58 CST 2015

$ ls -1F Hank_Mobley/ >> hank_mobley.txt

$ cat hank_mobley.txt

Mon Nov 21 21:33:58 CST 2015

1958_Peckin’_Time/

1960_Roll_Call/

1960_Soul_Station/

1961_Workout/

1963_No_Room_For_Squares/

Attention
Faites attention avec >>. Si vous saisissez > par erreur, vous
n’ajouterez pas la sortie de la commande au fichier mais
l’écraserez.

Utiliser un fichier comme entrée d’une


commande
<

Normalement, c’est le clavier qui fournit les entrées pour les


commandes, d’où le nom stdin. De même que vous pouvez
rediriger stdout vers un fichier, vous pouvez rediriger stdin
de manière qu’il provienne d’un fichier, non du clavier. C’est
utile car certaines commandes ne peuvent pas ouvrir des
fichiers directement et, dans ce cas, le symbole < (inférieur
à) est la solution. Très souvent, vous constaterez que cette
méthode est indispensable dans les scripts, mais ce sujet
mérite d’y consacrer un livre entier.
Par exemple, la commande tr (voir la section « Remplacer
des caractères choisis par d’autres » au chapitre 7)
n’accepte pas les fichiers en entrée et ne lit qu’à partir de
stdin. Si vous devez utiliser un fichier avec tr, c’est possible,
il suffit de rediriger stdin.
Supposons que mon éditeur m’envoie un fichier texte
avec la liste des commandes qu’il souhaite voir dans cet
ouvrage. J’y jette un œil dessus et, horrifié, je constate qu’il
les a toutes écrites en majuscule ! Corrigeons cette
maladresse grâce à tr et une redirection de stdin :

$ cat commands.txt

CP

LS

MKDIR

RM

TR

$ tr ‘A-Z’ ‘a-z’ < commands.txt

cp

ls

mkdir

rm

tr

Le fichier commands.txt est utilisé comme entrée et tr


accomplit son travail. Cependant, notez que tr affiche ses
résultats sur stdout, non dans un fichier. Il fallait s’y
attendre, mais, dans mon cas, ce n’est pas très pratique. Je
veux récupérer cette sortie et la placer dans un fichier. La
manière de procéder est décrite un peu plus loin.

Rediriger l’entrée et la sortie

[commande] < [fichier] > [sortie]

À la section précédente, nous avons employé la commande


tr pour passer le texte d’un fichier de majuscule en
minuscule. Mais tr envoie par défaut sa sortie sur stdout.
Dans ce cas, comment pouvez-vous enregistrer les résultats
dans un nouveau fichier contenant le texte avec la bonne
casse ? En utilisant une commande semblable à la suivante
:
tr ‘A-Z’ ‘a-z’ < commands.txt > commands_lower.txt
Étudions son fonctionnement sur un fichier très court.

$ ls

commands.txt

$ cat commands.txt

CP

LS

MKDIR

RM

TR

$ tr ‘A-Z’ ‘a-z’ < commands.txt > commands_lower.txt

$ ls

commands_lower.txt commands.txt

$ cat commands_lower.txt

cp

ls

mkdir

rm

tr

Vous pouvez évidemment utiliser immédiatement mv pour


donner au nouveau fichier le nom de l’ancien. De manière
plus intelligente, vous pouvez aussi utiliser && pour
enchaîner cette commande mv à l’opération réalisée avec tr.
Mais vérifiez que le nouveau fichier contient la sortie
appropriée avant de supprimer l’ancien !
Il faut que j’appelle mon éditeur ! Des commandes Unix
en majuscule ! Doux Jésus...

Info
Vous pensez peut-être pouvoir procéder de la manière suivante
:
tr ‘A-Z’ ‘a-z’ < commands.txt > commands.txt

Cela ne fonctionne pas, car, en raison de l’ordre des redirections


dans bash, cette commande produira un fichier totalement vide
(des explications détaillées sont données dans l’article «
Illustrated Redirection Tutorial » à l’adresse http://wiki.bash-
hackers.org/howto/redirection_tutorial). Voilà pourquoi la sortie
doit être redirigée vers un fichier différent.

Diriger la sortie à la fois vers un fichier et


stdout

tee

Dans ce chapitre, nous avons vu différentes manières


d’écrire sur la sortie standard. Dans les précédents, nous
avons vu de nombreuses façons d’écrire le résultat d’une
commande dans un fichier (nous en verrons d’autres dans
les chapitres à venir). Mais comment pouvonsnous écrire en
même temps sur stdout et dans un fichier ? Une chose aussi
folle est-elle possible ? Bien sûr ! Avec la commande tee !
La commande tee divise la sortie en deux flux simultanés
: l’un va sur stdout, l’autre sur un fichier (d’où son nom : la
sortie est divisée en deux, comme avec un raccord en T
pour la plomberie).
Dans l’exemple simple suivant, nous affichons le contenu
d’un dossier et le plaçons en même temps dans un fichier.

$ ls -1 ~/music/Hank_Mobley/ | tee hank_mobley.txt

1958_Peckin’_Time

1960_Roll_Call

1960_Soul_Station

1961_Workout

1963_No_Room_For_Squares

$ ls

hank_mobley.txt

$ cat hank_mobley.txt

1958_Peckin’_Time

1960_Roll_Call

1960_Soul_Station

1961_Workout

1963_No_Room_For_Squares

Les résultats de la commande ls sont visibles sur stdout


et, en même temps, tee fait en sorte qu’ils soient aussi
écrits dans un fichier.
N’oubliez pas que si le fichier d’écriture existe déjà, son
contenu sera écrasé par les nouvelles données venant de
tee. Si vous préférez ajouter la sortie à ce fichier, utilisez
l’option -a :
ls -1 ~/music/Hank_Mobley/ | tee -a hank_mobley.txt

Vous pouvez également envoyer les résultats produits par


tee vers une autre commande, par exemple sort (décrite
dans la section « Trier le contenu d’un fichier »au chapitre 7)
; l’option -r inverse les résultats produits.

$ ls -1 ~/music/Hank_Mobley/ | tee hank_mobley.txt |

➥sort -r > hank_mobley_reverse.txt

1958_Peckin’_Time

1960_Roll_Call

1960_Soul_Station

1961_Workout 1963_No_Room_For_Squares

$ ls

hank_mobley_reverse.txt hank_mobley.txt

$ cat hank_mobley_reverse.txt

1963_No_Room_For_Squares

1961_Workout

1960_Soul_Station

1960_Roll_Call

1958_Peckin’_Time

Si vous comprenez cela, vos possibilités sont infinies.

Conclusion

Au début du livre, vous avez découvert les commandes de


base. Maintenant, vous savez comment les combiner pour
obtenir des résultats plus intéressants et des codes plus
performants. À mesure que vous progresserez dans cet
ouvrage, les choses deviendront plus complexes, mais vous
acquerrez davantage de maîtrise, notamment grâce aux
éléments capitaux présentés au cours de ce chapitre. En
route pour la suite !
Chapitre 6
Affichage du contenu des
fichiers
Une chose intéressante avec Linux, c’est que tous les
fichiers de configuration système, les journaux et les fichiers
d’information sont au format texte. Aujourd’hui, ces fichiers
sont essentiellement encodés au format UTF-8, conforme à
Unicode et remplaçant l’ancienne norme ASCII (en
informatique, 45 ans et plus, c’est très vieux !). Puisque les
fichiers texte sont à la base d’Unix depuis ses débuts, il
existe une multitude de commandes logicielles qui
permettent d’afficher leur contenu (s’il ne s’agit pas de
fichiers texte, vous pouvez quand même obtenir certaines
informations à leur sujet). Ce chapitre examine les
commandes pour manipuler les fichiers texte, et autres.

Déterminer le type de fichier

file

La plupart du temps, vous connaissez pertinemment le type


du fichier que vous manipulez. S’il se termine par txt, il
s’agit d’un fichier texte ; par jpg, c’est une image ; par html,
une page web. Toutefois, les choses ne sont pas toujours
aussi claires qu’elles le devraient. Dans Unix, les suffixes
des noms de fichiers (les extensions) ne sont pas
obligatoires ; elles n’existent que par courtoisie et par effet
secondaire d’autres systèmes d’exploitation. Dans ce cas,
comment connaître le type d’un fichier s’il n’a pas
d’extension ? Et si cette extension est erronée (ce que j’ai
rencontré bien trop souvent) ? Et si c’est une extension
inconnue ? Dans toutes ces situations, la commande file
viendra à votre secours.
La commande file réalise différents tests sur les fichiers
que vous lui indiquez afin de déterminer leur type (ces tests
sont décrits dans la page man de file). Elle affiche ensuite
sa meilleure détermination (presque toujours correcte) sur
la sortie standard. Voici un exemple avec une collection
hétéroclite de fichiers que, je l’espère, vous ne placeriez
jamais dans le même répertoire !

$ ls -1F

838005x.docx

event.h

Lovecraft/

mtr*

Outline.md

Paper.doc

test

test.sh*

tix.jpg

www@

Yeats.txt

$ file *

838005x.docx: Zip archive data, at least v2.0 to extract

event.h:      ASCII C program text

Lovecraft:    directory

mtr:          ELF 64-bit LSB executable, x86-64, version 1

➥(SYSV), dynamically linked (uses shared libs), for GNU/Linux

➥2.6.8, stripped

Outline.md:   UTF-8 Unicode English text

Paper.doc:    CDF V2 Document, Little Endian, Os: Windows,

➥Version 5.1, Code page: 1252, Author: JohnDoe, Template:

➥Normal, Last Saved By: John,Revision Number: 14, Name of

➥Creating Application: Microsoft Office Word, Total Editing


Time:

➥30:00, Create Time/Date: Mon Mar 26 11:35:00 2012, Last Saved

➥Time/Date: Tue Mar 27 11:54:00 2012, Number of Pages: 9,


Number

➥of Words: 2101, Number of Characters: 11978, Security: 0

test:         HTML document text

test.sh:      Bourne-Again shell script text executable

tix.jpg:      JPEG image data, JFIF standard 1.01

www:          symbolic link to ‘/var/www’

Yeats.txt:    ASCII English text

Ces résultats révèlent plusieurs choses intéressantes.


Prenons tout d’abord les fichiers texte créés avec un
éditeur de texte simple : event.h, Outline.md, test, test.sh et
Yeats.txt. Vous remarquerez que file est capable de les voir
comme des fichiers texte de types différents et même d’en
préciser la nature : event.h est un fichier d’en-tête C, test est
un fichier HTML (pourtant l’extension est absente ; en
général, même sans l’extension, file est en mesure de
déterminer le type de fichier), et test.sh est un script de
shell bash.

Info
J’aurais préféré que Outline.md soit identifié comme un fichier
Markdown, mais ce n’est pas le cas. Cela dit, les fichiers
Markdown ne sont que des fichiers texte contenant Markdown.
file a donc raison, même s’il manque de précision. Pour de plus
amples informations sur Markdown, consultez Wikipédia
(https://fr.wikipedia.org/wiki/Markdown), Pandoc, un
convertisseur de document universel qui reconnaît Markdown
(http://johnmacfarlane.net/pandoc/index.html), et mes propres
articles sur ce sujet (www.chainsawonatireswing.com/?
s=markdown).

Ensuite, les exécutables Linux sont identifiés en tant que


tels, qu’il s’agisse de programmes compilés (mtr) ou de
scripts du shell (test. sh). La commande file est capable de
faire la distinction entre les scripts du shell bash et les scripts
écrits en Perl, Python et bien d’autres langages.
Les répertoires et les liens symboliques (et les autres
types de fichiers « spéciaux » identifiés par la commande ls
-F) ne causent aucune difficulté à file. Les images sont
même accompagnées d’informations supplémentaires,
comme la version de la norme graphique (par exemple,
dans le cas d’un fichier GIF, file afficherait des informations
comme GIF image data, version 89a, 500 x 500).
Enfin, 838005x.docx et Paper.doc ont tous les deux été créés
avec Word, mais vous pouvez constater combien les
résultats donnés sont différents. Pour Paper.doc, enregistré
dans un format Word ancien par l’un de mes étudiants, les
informations sont extrêmement détaillées et comprennent
l’auteur, la version de Windows, le modèle, le nombre de
mots et des dates. En revanche, 838005x.docx a été
enregistré dans le nouveau format de Word, qui est en
réalité une archive Zip contenant des documents XML. Avec
l’option -z, file essaie d’entrer dans l’archive Zip pour
déterminer son contenu :

$ file -z 838005x.docx

838005x.docx: XML document text (Zip archive data, at least


v2.0

➥to extract)

Si vous avez des questions sur un fichier, posez-les à file


!

Afficher des fichiers sur stdout

cat

Les utilisateurs de DOS disposent de la commande type pour


afficher le contenu des fichiers texte à l’écran. Les
utilisateurs de Linux se servent de cat qui assure la même
fonction.
$ cat Yeats_-_When_You_Are_Old.txt

WHEN you are old and grey and full of sleep,

And nodding by the fire, take down this book,

And slowly read, and dream of the soft look

Your eyes had once, and of their shadows deep;

How many loved your moments of glad grace,

And loved your beauty with love false or true,

But one man loved the pilgrim soul in you,

And loved the sorrows of your changing face;

And bending down beside the glowing bars,

Murmur, a little sadly, how Love fled

And paced upon the mountains overhead

And hid his face amid a crowd of stars.

La commande cat affiche le contenu du fichier à l’écran


puis revient à la console. Si le fichier est trop long pour tenir
sur un écran, vous devrez faire défiler l’écran vers le haut
pour lire ce qui s’est affiché trop rapidement.
C’est le gros problème avec cat : si le document que vous
affichez est long, il défile à toute allure et est donc difficile à
lire. Imaginez ce que donnerait la commande suivante : cat
Melville_moby_dick. txt. La solution réside dans la commande
less, qui sera présentée plus loin à la section « Afficher des
fichiers texte page par page ».

Concaténer des fichiers vers stdout

cat fichier1 fichier2

cat est le raccourci de concaténer, qui signifie « mettre bout


à bout », « joindre ». L’objectif original de cette commande
était de permettre le regroupement de deux fichiers, ou
davantage, en un fichier unique. Le fait que cat utilisé sur un
seul fichier permette son affichage à l’écran n’est
finalement qu’un « bonus ». Imaginons, par exemple, que
vous ayez deux petits poèmes de A. E. Housman et que
vous souhaitiez les afficher l’un à la suite de l’autre.

$ cat With_rue.txt Oh_when_I_was_in_love.txt

WITH rue my heart is laden

  For golden friends I had,

For many a rose-lipt maiden

  And many a lightfoot lad.

By brooks too broad for leaping

  The lightfoot boys are laid;

The rose-lipt girls are sleeping

  In fields where roses fade.


OH, when I was in love with you

  Then I was clean and brave,


And miles around the wonder grew

  How well did I behave.

And now the fancy passes by

  And nothing will remain,

And miles around they’ll say that I

  Am quite myself again.

Vous pouvez constater que cat ne sépare pas les deux


fichiers par une ligne horizontale, des pointillés ou quoi que
ce soit. Les deux fichiers sont collés bout à bout et affichés
tels quels à l’écran. Si vous souhaitez bénéficier d’une
séparation entre les fichiers après concaténation – par
exemple, la dernière ligne de « With rue my heart is laden »
collée à la première ligne de « Oh, when I was in love with
you » rend la lecture difficile –, pensez à toujours laisser une
ligne vierge à la fin de chacun d’eux.

Concaténer des fichiers dans un autre


fichier
cat fichier1 fichier2 > fichier3

Dans l’exemple précédent, nous avons concaténé deux


fichiers et les avons affichés à l’écran. Si vous concaténez
plusieurs fichiers, vous aurez peut-être intérêt à enregistrer
le résultat dans un fichier unique, que vous pourrez
réutiliser par la suite. Pour cela, il suffit de rediriger la sortie
de stdout vers un fichier, comme vous avez appris à le faire
au chapitre 5, « Création de blocs de commandes ».

$ ls

Oh_when_I_was_in_love.txt With_rue.txt

$ cat With_rue.txt Oh_when_I_was_in_love.txt > Housman.txt

$ ls

Housman.txt Oh_when_I_was_in_love.txt With_rue.txt

Vous pouvez maintenant faire ce que vous voulez de


Housman.txt. Si vous voulez lui ajouter d’autres poèmes, il
suffit d’utiliser une commande semblable à celle qui suit :
$ cat Loveliest_of_trees.txt >> Housman.txt

Notez l’utilisation de >> pour ajouter le nouveau poème à


la suite de Housman.txt sans écraser son contenu. La
commande qui suit n’aurait pas fonctionné :
$ cat Loveliest_of_trees.txt Housman.txt > Housman.txt

Si vous tentez de concaténer un fichier avec lui-même,


un message d’erreur s’affiche expliquant que votre requête
est impossible :
cat: Housman.txt: input file is output file

Concaténer des fichiers et numéroter les


lignes
cat -n fichier1 fichier2

Lorsqu’on travaille avec des poèmes, mais surtout avec des


codes source, il peut être intéressant de numéroter les
lignes de manière à pouvoir s’y référer aisément. Si vous
souhaitez générer des numéros de ligne, utilisez cat avec
l’option -n (ou --number).

$ cat -n With_rue.txt Oh_when_I_was_in_love.txt

     1  WITH rue my heart is laden

     2    For golden friends I had,

     3  For many a rose-lipt maiden

     4    And many a lightfoot lad.

     5

     6  By brooks too broad for leaping

     7    The lightfoot boys are laid;

     8  The rose-lipt girls are sleeping

     9    In fields where roses fade.

    10

    11  OH, when I was in love with you

    12    Then I was clean and brave,

    13  And miles around the wonder grew

    14    How well did I behave.

    15

    16  And now the fancy passes by

    17    And nothing will remain,

    18  And miles around they’ll say that I

    19    Am quite myself again.

La numérotation des lignes peut être très utile et cat est


un moyen rapide d’ajouter des numéros dans un fichier.

Info
tac est une alternative intéressante à cat. Il s’agit bien de cat à
l’envers, et ce pour une bonne raison : tac permet de concaténer
des fichiers dans l’ordre inverse de cat.

Afficher des fichiers texte page par page


less

La commande cat est utile, mais pas avec les longs fichiers
qui ne peuvent tenir sur un écran, car ils défilent trop vite
pour être lisibles. Si vous souhaitez afficher à l’écran un
fichier de plusieurs pages, utilisez non pas cat, mais less.
La commande less est un exemple de pager, un
programme affichant des fichiers texte page par page. Il en
existe d’autres, comme more, pg et most. En fait, less est une
version améliorée de more qui date de 1985. Pas de doute,
less is more, comme disent les anglophones.
Rien n’est plus facile que d’ouvrir un énorme fichier texte
avec less :
$ less Milton_-_Paradise_Lost.txt

La commande less occupe tout l’écran et on utilise donc


le clavier pour naviguer dans le document affiché. Il faut
également quitter less pour revenir à l’interpréteur de ligne
de commande. Pour naviguer dans less, servez-vous des
touches présentées au tableau 6.1 :

Tableau 6.1 Principales commandes de less


Touche Action
Page suivante, e ou Espace Avancer d'une page
Page précédente ou b Reculer d'une page
Entrée, e, j ou Flèche bas Avancer d'une ligne
y, k ou Flèche haut Reculer d'une ligne
G ou p Atteindre la fin du fichier
1G Atteindre le début du fichier
Échap-) ou Flèche droite Défilement vers la droite
Échap-( ou Flèche gauche Défilement vers la gauche
q Quitter

Comme vous pouvez le constater, vous avez de


nombreuses possibilités pour chaque commande. Les deux
commandes que vous utiliserez le plus fréquemment sont
sans doute celles qui permettent de faire défiler le
document d’une page vers le bas et celle qui permet de
quitter.
Pour afficher des informations sur le fichier pendant que
vous êtes dans less, appuyez sur la touche =. Des données
semblables à ce qui suit s’afficheront en bas de votre écran
:
Paradise_Lost.txt lines 7521-7560/10762 byte 166743
➥/237306 70% (press RETURN)
Le programme vous invite à appuyer sur la touche Entrée
pour faire disparaître ces informations et continuer à utiliser
less.
Il est possible de demander à less d’afficher des numéros
de ligne (comme avec cat). Ces numéros ne s’affichent bien
sûr que lors de l’utilisation de less. Dès que vous appuyez
sur la touche q, la numérotation disparaît. Pour afficher vos
fichiers avec une numérotation de ligne, utilisez l’option -N
(ou --LINE-NUMBERS, tout en majuscules) :
$ less -N Milton_-_Paradise_Lost.txt

Astuce
Voici une opération qui pourrait vous poser des problèmes :
vous utilisez ls --color (voir la section « Afficher le contenu avec
des couleurs » au chapitre 2) en redirigeant la sortie vers less,
avec le résultat suivant:
$ ls

Burroughs Howard Lovecraft

$ ls --color | less

ESC[0mESC[01;34mBurroughsESC[0m

ESC[01;34mHowardESC[0m

ESC[01;34mLovecraftESC[0m

Mais que se passe-t-il ? Le problème vient du fait que bash utilise


des caractères de contrôle invisibles pour afficher les couleurs
et que, lorsque vous redirigez ls vers less, ce dernier est
perturbé par ces caractères de contrôle. Pour résoudre ce
problème, il suffit d’utiliser l’option -R (ou --RAW-CONTROLCHARS) avec
less :

$ ls --color | less -R

Burroughs

Howard

Lovecraft

Vous n’êtes peut-être pas concerné, car vous n’utilisez pas ls --


color. Tout comme moi, enfin pas directement. En effet, mes alias
(voir les chapitres 5 et 15, « Connectivité ») pour ls contiennent
--color et il m’est donc facile d’oublier que j’utilise
systématiquement cette option ! Si vous employez ls --color
directement ou dans un alias, n’oubliez pas d’ajouter -R à less
lorsque c’est nécessaire.

Effectuer des recherches dans votre


pager

Si vous utilisez less pour afficher un fichier volumineux,


vous aurez peut-être des difficultés à localiser le passage
qui vous intéresse plus particulièrement. Comment faire, par
exemple, si vous souhaitez savoir si Milton a utilisé le mot
apple dans Paradise Lost pour décrire le fruit mangé par
Adam et Eve ? Dans less, appuyez sur la touche / et
saisissez ensuite les termes de votre recherche (vous
pouvez même utiliser des expressions régulières si vous le
souhaitez). Ensuite, appuyez sur Entrée et patientez, le
temps que less atteigne la première occurrence de la
recherche. Si aucune occurrence n’est trouvée, less vous
préviendra :
Pattern not found (press RETURN)

Après la localisation d’une première occurrence, la


recherche peut être poursuivie vers le haut ou vers le bas.
Le tableau 6.2 décrit les principales commandes utiles pour
conduire une recherche dans less :

Tableau 6.2 Les commandes de recherche de less


Commande Action
/termes Effectue une recherche des termes à trouver en utilisant
des expressions régulières
n Recherche de l'occurrence suivante
N Recherche de l'occurrence précédente

Info
Non, Milton ne désigne jamais explicitement le fruit défendu
comme une pomme, c’est juste un « fruit ». Oui, j’ai travaillé sur
un doctorat en littérature anglaise du e siècle. Non, je ne l’ai
jamais fini, ce qui explique pourquoi j’écris un livre sur Linux et
non sur Milton.

Modifier les fichiers affichés par un pager

less n’est pas un éditeur ; il sert simplement à afficher le


contenu de fichiers texte. En revanche, il est possible
d’envoyer ce qui est affiché par less vers un éditeur de
texte, comme vim ou nano. Pour cela, il suffit d’appuyer sur la
touche v dans less. Essayez ! Au bout d’une seconde ou
deux, less disparaît et un traitement de texte plein écran
s’affiche à la place. Faites vos modifications, quittez
l’éditeur et vous revenez dans less avec les changements
effectués.
Si vous n’êtes pas satisfait de l’éditeur qui s’affiche, vous
pouvez choisir celui qui vous convient. Si vous souhaitez
utiliser vim, par exemple, saisissez la commande qui suit
avant de lancer less :
$ export EDITOR=vim

Il n’est nécessaire de saisir cette commande qu’une fois


par session du shell : chaque fois que vous ouvrirez less,
c’est vim qui lui sera désormais associé. En revanche, si vous
mettez fin à la session, vous devrez de nouveau utiliser la
commande export, ce qui peut être assez fastidieux à la
longue. Il est donc préférable d’ajouter la ligne suivante à
votre fichier .bashrc afin que cette commande s’applique
automatiquement :
export EDITOR=vim

Info
J’aime beaucoup vim qui, avec son ancêtre vi, se trouve sur
pratiquement tous les systèmes Unix. S’il n’est pas décrit dans
cet ouvrage c’est simplement parce qu’il mérite son propre livre
! Les débutants peuvent commencer par l’ouvrage Learning the
vi and Vim Editors, pour ensuite passer à sa maîtrise grâce au
site http://zzapper.co.uk/vimtips.html.

Afficher les dix premières lignes d’un


fichier

head

Si vous voulez n’afficher que les dix premières lignes d’un


fichier, il n’est pas nécessaire d’utiliser cat ou less. Servez-
vous plutôt de head qui est conçu pour afficher les dix
premières lignes des fichiers texte, puis pour revenir à la
console.
$ head Canterbury_Tales.txt

Here bygynneth the Book of the Tales of Caunterbury

General Prologue

Whan that Aprill, with his shoures soote

The droghte of March hath perced to the roote

And bathed every veyne in swich licour,

Of which vertu engendred is the flour;

Whan Zephirus eek with his sweete breeth

Inspired hath in every holt and heeth

La commande head est très utile pour avoir un aperçu du


contenu d’un fichier texte, même s’il est énorme. En une
seconde, vous pouvez afficher suffisamment de texte pour
déterminer si le fichier est intéressant ou non.

Afficher les dix premières lignes de


plusieurs fichiers

head fichier1 fichier2

Vous pouvez aussi utiliser head pour afficher les dix


premières lignes de plusieurs fichiers à la fois. C’est un peu
comme avec cat sauf, qu’en plus, head indique de lui-même
le point de séparation entre les fichiers, ce qui facilite leur
identification.

$ head Canterbury_Tales.txt Paradise_Lost.txt

==> Canterbury_Tales.txt <==

Here bygynneth the Book of the Tales of Caunterbury

General Prologue

Whan that Aprill, with his shoures soote

The droghte of March hath perced to the roote

And bathed every veyne in swich licour,

Of which vertu engendred is the flour;

Whan Zephirus eek with his sweete breeth

Inspired hath in every holt and heeth

==> Paradise_Lost.txt <==

Book I

Of Man’s first disobedience, and the fruit

Of that forbidden tree whose mortal taste

Brought death into the World, and all our woe,

With loss of Eden, till one greater Man

Restore us, and regain the blissful seat,

Sing, Heavenly Muse, that, on the secret top

Of Oreb, or of Sinai, didst inspire

That shepherd who first taught the chosen seed,

La commande head sépare automatiquement les deux


extraits avec une ligne vierge et un titre, ce qui facilite
l’identification des fichiers affichés.

Afficher un nombre de lignes donné pour


un ou plusieurs fichiers

head -n

Vous pouvez indiquer à head le nombre de lignes qu’il doit


afficher en utilisant l’option -n suivie d’un chiffre, comme 5
par exemple (ou --lines=5). Si vous demandez l’affichage de
plusieurs fichiers, chacun d’eux sera affiché avec le nombre
de lignes indiqué.

$ head -n 5 Canterbury_Tales.txt Paradise_Lost.txt

==> Canterbury_Tales.txt <==

Here bygynneth the Book of the Tales of Caunterbury

General Prologue

Whan that Aprill, with his shoures soote

==> Paradise_Lost.txt <==

Book I

Of Man’s first disobedience, and the fruit

Of that forbidden tree whose mortal taste

Brought death into the World, and all our woe,

Notez que les lignes vides sont comptées dans les cinq
lignes demandées. Cinq lignes, c’est cinq lignes, quel que
soit leur contenu.
Vous pouvez tout aussi facilement indiquer --lines=100
(par exemple) pour en voir plus que les 10 lignes par défaut.

Afficher les premiers octets, kilo-octets


ou mégaoctets d’un fichier

head -c

L’option -n permet d’indiquer le nombre de lignes à afficher,


mais comment faire si vous souhaitez afficher un certain
nombre d’octets ? Ou de kilo-octets ? Ou de mégaoctets (ce
qui est un peu stupide car le document défilerait presque
indéfiniment) ? Ou même de gigaoctets ou de téraoctets (ce
qui est totalement stupide, sauf si vous redirigez la sortie) ?
Il suffit pour cela d’utiliser l’option -c (ou --bytes=).
Pour afficher les cent premiers octets des Contes de
Canterbury, utilisez cette ligne de code :

$ head -c 100 Canterbury_Tales.txt

Here bygynneth the Book of the Tales of Caunterbury

General Prologue

Whan that Aprill, with his sh


Cent octets, ni plus ni moins, ce qui explique que la
phrase soit tronquée au milieu d’un mot.
Pour afficher les cent premiers ko des Contes de
Canterbury, on utilisera le code qui suit :

$ head -c 100KB Canterbury_Tales.txt

Here bygynneth the Book of the Tales of Caunterbury

General Prologue

Whan that Aprill, with his shoures soote

The droghte of March hath perced to the roote

And bathed every veyne in swich licour,

Of which vertu engendred is the flour;

Whan Zephirus eek with his sweete breeth

Inspired hath in every holt and heeth

Et pour afficher les cent premiers Mo des Contes de


Canterbury, on utilisera :
$ head -c 100MB Chaucer_-_Canterbury_Tales.txt

Je vous épargne le résultat, l’affichage des cent premiers


Mo serait plus long que le reste de ce livre.
MB ici signifie 1 000 000 octets, ou 1 000 × 1 000. Je
vous entends presque vous exclamer « Quoi ! 1 mégaoctet
ce n’est pas 1 000 kilooctets, mais 1 024 ! »
Je ne pense pas que le mot mégaoctet signifie ce que
vous pensez. Depuis l’an 2000, nous sommes supposés
employer un nouveau jeu de préfixes (Wikipédia propose
une page très complète sur ce sujet,
https://fr.wikipedia.org/wiki/Octet). Le tableau 6.3
récapitule les anciens et les nouveaux préfixes ainsi que
leur signification.
Tableau 6.3 Préfixes et multiples d'octets
Donc, ce que beaucoup d’entre vous (et moi le premier !)
pensez être un mégaoctet – 1 024 kilo-octets – est en fait
censé s’appeler un mébioctet ; c’est véritablement 1 024
kibioctet. Pour ce nouveau disque dur de trois téraoctets
que j’ai acheté, je suis supposé dire « Hé, regarde ma
nouvelle commande à trois tébioctets ! ». À l’oreille, ça
sonne vraiment étrange. Au-delà de la confusion des
nouveaux termes, un téraoctet m’a toujours semblé
puissant et cool. Un tébioctet ? Je marche dessus sans
m’arrêter.
Avec cela à l’esprit, vous connaissez maintenant les
différentes valeurs que vous pouvez utiliser avec head -c. Si
vous souhaitez voir les valeurs en multiple de 1 000, utilisez
kB, MB, GB, etc. Si, au contraire, vous voulez voir les valeurs
en multiples de 1 024, utilisez K, M, G, etc. (KiB, MiB et GiB ne
sont pas reconnus). Vous ne vous y attendiez peutêtre pas,
mais il faut le savoir.

Afficher les dix dernières lignes d’un


fichier

tail
Si la commande head permet d’afficher les dix lignes de
début d’un fichier, tail commence à l’autre extrémité, en
permettant l’affichage des dix dernières.

$ tail Paradise_Lost.txt

To the subjected plain—then disappeared

They, looking back, all the eastern side beheld

Of Paradise, so late their happy seat,

Waved over by that flaming brand; the gate

With dreadful faces thronged and fiery arms.

Some natural tears they dropped, but wiped them soon;

The world was all before them, where to choose

Their place of rest, and Providence their guide.

They, hand in hand, with wandering steps and slow,

Through Eden took their solitary way.

Quel peut bien être l’intérêt de la commande tail ? La


plupart du temps, on l’utilise pour afficher la fin d’un fichier
journal afin de vérifier ce qui cloche avec une application
sur un système. Pour ce cas de figure, il existe une option
très utile que vous souhaiterez très certainement employer,
comme nous le verrons un peu plus loin, à la section «
Afficher les dernières lignes d’un ou plusieurs fichiers avec
mise à jour régulière ».

Afficher les dix dernières lignes de


plusieurs fichiers

tail fichier1 fichier2

Il est possible d’afficher simultanément les dix dernières


lignes d’un ou de plusieurs fichiers.

$ tail Paradise_Lost.txt Miller’s_Tale.txt

==> Paradise_Lost.txt <==

To the subjected plain—then disappeared

They, looking back, all the eastern side beheld

Of Paradise, so late their happy seat,

Waved over by that flaming brand; the gate

With dreadful faces thronged and fiery arms.

Some natural tears they dropped, but wiped them soon;

The world was all before them, where to choose

Their place of rest, and Providence their guide.

They, hand in hand, with wandering steps and slow,

Through Eden took their solitary way.

==> Miller’s_Tale.txt <==

With othes grete he was so sworn adoun

That he was holde wood in al the toun;

For every clerk anonright heeld with oother.

They seyde, "The man is wood, my leeve brother";

And every wight gan laughen at this stryf.

Thus swyved was this carpenteris wyf,

For al his kepyng and his jalousye;

And Absolon hath kist hir nether ye;

And Nicholas is scalded in the towte.

This tale is doon, and God save al the rowte!

Comme head, tail crée un titre de séparation entre les


différents fichiers.

Astuce
tail a beau être capable d’afficher plusieurs fichiers, multitail est
bien meilleur à cette tâche. En effet, au lieu de concaténer les
résultats et de les ressortir en masse comme le fait tail, multitail
affiche les dernières lignes des fichiers indiqués en même
temps, chacun dans sa propre petite sous-fenêtre de console.
Vous pouvez le télécharger depuis le dépôt de logiciels de votre
distribution (voir le chapitre 14, « Installation de logiciels ») ou
le récupérer sur www.vanheusden.com/multitail/. Pour en savoir
plus sur ce petit programme très pratique, consultez l’article «
Monitoring logs and command output » de William von Hagen
(https://www.ibm.com/developerworks/aix/library/au-monitor-
logs/).

Afficher les n dernières lignes d’un ou


plusieurs fichiers
tail -n

Comme pour head, il est possible de préciser à tail le


nombre de lignes à afficher au lieu d’employer la valeur par
défaut. Pour cela, on utilise l’option -n (ou --lines=). Si vous
souhaitez afficher plusieurs fichiers, énumérez-les
simplement à la suite de la commande.

$ tail -n 4 Paradise_Lost.txt Miller’s_Tale.txt

==> Paradise_Lost.txt <==

The world was all before them, where to choose

Their place of rest, and Providence their guide.

They, hand in hand, with wandering steps and slow,

Through Eden took their solitary way.

==> Miller’s_Tale.txt <==

For al his kepyng and his jalousye;

And Absolon hath kist hir nether ye;

And Nicholas is scalded in the towte.

This tale is doon, and God save al the rowte!

Si vous souhaitez visualiser plusieurs fichiers journaux,


cette commande se révélera utile, mais sans être parfaite. À
la place, mieux vaut employer celle décrite à la section
suivante.

Afficher les dernières lignes d’un ou


plusieurs fichiers avec mise à jour
régulière

tail -f

Les fichiers journaux changent constamment à mesure que


des événements surviennent sur votre système. Il est
possible d’en afficher le contenu avec tail, mais cette
commande ne montre qu’un instantané d’un fichier, puis
revient à la ligne de commande. Pour afficher de nouveau le
journal et contrôler ses nouvelles entrées, il faut relancer
tail, encore, encore et encore. Ce n’est pas très pratique !
Grâce à l’option -f (ou --follow), tail ne se ferme pas. La
commande affiche les dix dernières lignes du fichier (ou un
autre nombre de lignes, si vous avez utilisé l’option -n) en
les réactualisant à chaque modification. Vous pouvez ainsi
observer les événements consignés dans un journal à
mesure qu’ils surviennent. C’est l’outil idéal lorsqu’on
cherche à comprendre ce qui se passe sur un système ou
dans un programme.
Le journal d’un serveur web peut ressembler à ceci :

$ tail -f /var/log/httpd/ d20srd_org _log_20151201

"GET /srd/skills/bluff.htm HTTP/1.1"...

"GET /srd/skills/senseMotive.htm HTTP/1.1"...

"GET /srd/skills/concentration.htm HTTP/1.1"...

"GET /srd/classes/monk.htm HTTP/1.1"...

"GET /srd/skills/escapeArtist.htm HTTP/1.1"...

C’est difficile à représenter dans un livre, mais ce fichier


ne se ferme jamais. tail reste ouvert et affiche chaque
modification apportée au fichier, qui continue à défiler
jusqu’à ce que vous appuyiez sur Ctrl+C, ce qui stoppe la
commande et vous ramène à l’interpréteur.
Faites le test avec l’un de vos fichiers journaux, comme
/var/log/ syslog. Ajoutez l’option -n pour n’afficher qu’un
certain nombre de lignes pour commencer, puis essayez
avec deux fichiers, comme /var/ log/syslog et
/var/log/messages. Observez ce qui se passe. (Le résultat est
comparable à celui obtenu à la section « Afficher les dix
premières lignes de plusieurs fichiers », mais les mises à
jour sont permanentes.)
L’option --retry est également très intéressante,
notamment lorsque le fichier peut disparaître ou être
temporairement inaccessible. Il peut s’agir, par exemple,
d’un fichier de /tmp ou d’un fichier modifié puis détruit dans
un script de shell. En associant -f et --retry, vous pouvez
garder un œil sur pratiquement n’importe quel fichier,
même s’il peut disparaître et revenir !

Astuce
En connaissant le PID du processus qui génère le fichier
examiné avec tail, nous pouvons nous servir de la commande
tail -f --pid=PID#. Voici son avantage : lorsque le processus
identifié par le PID meurt, tail arrête sa surveillance. Par
exemple, en supposant que le PID d’apache soit 2112, la
commande suivante permet d’examiner le fichier généré par ce
processus :
$ tail -f --pid=2112 /var/log/apache2/error.log
À l’arrêt du processus apache, tail termine son suivi du fichier
error.log. Pour profiter de cette commande, vous devez connaître
le fichier et le PID qui le génère (ps nous servira à cela !).

Conclusion

Vous avez découvert cinq nouvelles commandes dans ce


chapitre : file, cat, less, head et tail. La première affiche le
type du fichier indiqué, ce qui permet de connaître les
commandes qui permettront de le manipuler. Les quatre
autres affichent des fichiers texte en lecture seule, mais de
différentes façons. cat affiche les fichiers en une fois alors
que less permet leur affichage page par page. head et tail
sont deux faces d’une même pièce. La première permet de
visualiser le début d’un fichier ; la seconde, la fin. Ces
commandes permettent d’afficher aisément n’importe
quelle partie d’un fichier texte.
Chapitre 7
Manipulation de fichiers
texte avec des filtres
Toutes les commandes décrites dans ce chapitre sont des
filtres. Un filtre prend une entrée, souvent l’entrée standard,
la traite, puis écrit les résultats sur la sortie standard. Très
souvent, des tubes interviennent pour faciliter le transfert
de l’entrée et de la sortie d’un filtre à l’autre, formant un «
pipeline » (stdin, stdout et les tubes font l’objet du chapitre
5, « Création de blocs de commandes »).
Dans ce chapitre, nous présentons wc, nl, cut, sort, uniq,
tr, sed et awk. La page Wikipédia
https://en.wikipedia.org/wiki/Filter_(software) fournit
une liste de filtres Unix plus complète, dont la plupart sont
décrits dans cet ouvrage. Vous trouverez notamment tee au
chapitre 5, cat, head, less, more, tac et tail au chapitre 6, «
Affichage du contenu des fichiers », compress chapitre 9, «
Archivage et compression », et grep (dans le détail !) au
chapitre 10, « Recherche d’éléments ».
En lisant ce chapitre, vous constaterez, notamment si
vous avez lu les informations sur les filtres dans les autres
chapitres, que les fonctions de ces commandes se
recoupent souvent. La commande sort est capable
d’opérations réalisables avec uniq, et, alors que sed et awk
peuvent effectuer ce que beaucoup d’autres commandes
font, tr a souvent la possibilité d’accomplir le même travail
que sed et awk, plus rapidement. Et ainsi de suite.
Nous avons donc souvent plusieurs manières de réaliser
une tâche et ce n’est pas un problème. Plus vous en
apprendrez sur les filtres, plus vous serez en mesure de
choisir l’outil adapté à votre besoin. De grandes
connaissances sont toujours une bonne chose, en particulier
quand il s’agit de Linux et de ses commandes.

Dénombrer les mots, les lignes et les


caractères dans un fichier

wc

La commande wc est un dinosaure : son existence remonte à


la première édition d’Unix, en 1971. Elle reste néanmoins
très utile aujourd’hui ; je l’ai utilisée juste avant de
commencer à écrire cette section ! Voilà une commande qui
approche de la cinquantaine et qu’il faut néanmoins
connaître et utiliser ; en un mot, c’est l’un des côtés
merveilleux d’Unix (et de Linux, évidemment).
Quelle est la fonction de wc ? Parfois, je dois compter le
nombre de mots que contient un document. Plus souvent
encore, je dois compter son nombre de lignes. De temps en
temps, il me faut connaître son nombre de caractères. Pour
réaliser ces trois opérations, il existe heureusement une
commande : wc.

$ wc "The Call of Cthulhu.txt"

192  11863  70246 The Call of Cthulhu.txt

Dans l’ordre, les résultats indiquent le nombre de lignes,


de mots et de caractères dans la nouvelle de H.P. Lovecraft
(L’Appel de Cthulhu). Il est très facile d’obtenir uniquement
le nombre de mots.

$ wc -w "The Call of Cthulhu.txt"

11863 The Call of Cthulhu.txt


L’option -l (ou --lines) indique le nombre de lignes, -w (ou
--words) indique le nombre de mots, et -m (ou --chars)
indique le nombre de caractères. Contrairement à ce que
l’on aurait pu imaginer, -c ne donne pas le nombre de
caractère mais le nombre d’octets du document (-c ou --
bytes). Pourquoi faire simple quand on peut faire compliqué
?
Si vous avez deux documents, wc devient encore plus
pratique !

$ wc "Beyond the Walls of Sleep.txt" "The Call of Cthulhu.txt"

 62  4307 24953 Beyond the Walls of Sleep.txt

192 11863 70246 The Call of Cthulhu.txt

254 16170 95199 total

Nous obtenons le nombre de lignes, de mots et de


caractères de chaque nouvelle de Lovecraft, ainsi que le
total.
Tout cela est assez utile, mais nous pouvons aller au-delà
du nombre de lignes, de mots et de caractères d’un
document. Nous pouvons également dénombrer ces
éléments dans un texte qui provient d’une autre commande
via un tube (rappelez-vous, nous parlons de filtres).
Par exemple, j’ai eu besoin de savoir combien de fois un
robot d’indexation Web nommé JerkyJerks sollicitait mon
serveur avant de le bloquer (pour être gentil je ne donnerai
pas son vrai nom). Je me suis servi de grep (voir le chapitre
10) pour rechercher JerkyJerks dans le fichier d’un journal,
puis j’ai employé wc -l pour savoir combien de fois cet
abruti avait dérangé mon ordinateur.

$ grep JerkyJerks server_access.log | wc -l

15428

Quoi ! Bloqué !
Voici un autre exemple, que nous reverrons dans la
section « Mettre fin à un processus » du chapitre 13 :

$ ps aux | grep [/]usr/bin/cronolog | wc -l

83

Je souhaite savoir combien d’instances de cronolog sont


en cours d’exécution. Je commence donc par obtenir la liste
de tous les processus à l’aide de ps aux (voir le chapitre 13,
« Surveillance des ressources système »), j’y recherche
ensuite avec grep le chemin de la commande cronolog, et,
pour finir, j’exécute wc -l pour déterminer ce nombre
d’instances : 83. C’est parfait.

Info
Si vous vous demandez pourquoi j’ai placé des crochets autour
de la première barre oblique ([/]usr/bin/cronolog), lisez la section «
Rechercher des mots spécifiques dans la sortie d’autres
commandes » du chapitre 10.

Voici un dernier exemple, qui révèle un aspect important


de wc. Dans son comptage des lignes, wc prend en compte
les lignes vides. En effet, cette commande recherche en
réalité le nombre de caractères de passage à la ligne dans
le document.
Pour que les lignes vides n’interviennent pas dans les
résultats de wc, utilisez sed (voir plus loin dans ce chapitre)
afin de retirer toutes les lignes vides du document, avant de
passer le résultat à wc -l.

$ sed ‘/^$/d’ "The Call of Cthulhu.txt" | wc -l

103

Dans le jargon de sed, ‘/^$/d’ signifie « rechercher toutes


les lignes qui ne contiennent aucun caractère entre leur
début (indiqué par ^) et leur fin (indiquée par $), et les
supprimer (rôle de d) ». Notre premier comptage des lignes
de « The Call of Cthulhu » avait donné 192 ; sans les lignes
vides, nous obtenons 103. Une différence non négligeable !

Info
La section « Activer et désactiver la permission suid » du
chapitre 8 donne un autre exemple de redirection d’une sortie
vers wc.

Numéroter les lignes d’un fichier

nl

Lorsque nous travaillons sur des programmes, il est


essentiel que les lignes du code soient numérotées pour
servir de guide. C’est pourquoi la quasi-totalité des éditeurs
de code affichent les numéros des lignes.
Mais comment pouvons-nous insérer des numéros de
lignes dans un texte comme L’Appel de Cthulhu pour que
tous les membres du groupe de discussion sur H.P. Lovecraft
puissent avoir le même point de référence ? Dans ce cas, la
commande nl va venir à notre secours (dans l’exemple
suivant, les points de suspension indiquent que les lignes
trop longues ont été tronquées).

$ nl "The Call of Cthulhu.txt"

1 The Call of Cthulhu by H.P. Lovecraft

2 (Found Among the Papers of the Late Francis…

3 "Of such great powers or beings there may be…

4 —Algernon Blackwood.

5 I.

6 The Horror in Clay.

[liste coupée en raison de sa longueur — 192 lignes !]

En y regardant attentivement, vous noterez que les lignes


vides ne sont pas numérotées. Il s’agit du comportement
par défaut de nl, et celui activé par l’option -b t. L’option -b
indique à nl le type de lignes qui doivent être numérotées et
doit être suivie de ce type : t (lignes non vides) ou a (toutes
les lignes). Il en existe d’autres, mais vous n’en aurez
probablement pas besoin ; dans le cas contraire, consultez
la page de manuel.
Voici comment numéroter toutes les lignes et pas
uniquement celles qui ne sont pas vides :

$ nl -b a "The Call of Cthulhu.txt"

1 The Call of Cthulhu by H.P. Lovecraft

3 (Found Among the Papers of the Late Francis…

5 "Of such great powers or beings there may be…

6 —Algernon Blackwood.

8 I.

9 The Horror in Clay.

Pour enregistrer la sortie résultante, nous pouvons utiliser


une redirection (voir au chapitre 5) afin de créer un nouveau
fichier :

$ nl "The Call of Cthulhu.txt" > "Cthulhu numbered.txt"

Je ne sais pas ce que vous en pensez, mais je trouve que


nl -b fait partie des options de commande les plus
énigmatiques que je connaisse. Si elle n’est pas la seule, je
la trouve particulièrement obscure et difficile à mémoriser.
Sélectionner une colonne complète de
données dans un fichier délimité

cut

Voilà une autre commande relativement ancienne, conçue à


une époque où les fichiers au contenu délimité par une
tabulation étaient    omniprésents. Nous en rencontrons
encore quelques-uns, mais nous avons aujourd’hui bien
d’autres manières de présenter des données dans des
fichiers. Cela dit, même si nous n’employons pas les
tabulations pour délimiter les données contenues dans des
fichiers, nous nous servons assez souvent d’autres
symboles    : virgules, pointsvirgules, deux-points et points,
par exemple. La commande cut permet de sélectionner
certaines colonnes dans un fichier dont le contenu utiliser
un symbole de séparation et de les envoyer sur la sortie.
Commençons par des tabulations, puisque il s’agit du
symbole recherché par défaut par cut. Nous disposons d’un
fichier nommé cool_movies.txt et contenant des informations
séparées par un caractère de tabulation (la présence de la
tabulation, le point important, fait que les colonnes ne sont
pas parfaitement alignées) :

Movie  Genre    Hero    Year  

Die Hard        Action  John McClane    1988

Star Wars       Sci-Fi  Luke Skywalker  1977

John Wick       Action  John Wick       2014

Aliens  Sci-Fi  Ellen Ripley    1986

The Thing       Horror  MacReady        1982

Voici comment extraire la première et la troisième


colonnes de données :
$ cut -f 1,3 cool_movies.txt

Movie  Hero

Die Hard       John McClane

Star Wars      Luke Skywalker


John Wick      John Wick

Aliens  Ellen Ripley

The Thing      MacReady

L’option -f (ou --fields) précise à cut les colonnes à


sélectionner. Dans cet exemple, nous lui demandons
d’extraire les colonnes 1 et 3 avec -f 1,3. Pour obtenir les
colonnes 1 à 3, il suffit d’utiliser -f 1-3 ; -f 1,3-4 permet de
conserver toutes les colonnes à l’exception de la deuxième.
Voici un exemple qui pourrait vous étonner si vous ne
savez pas à quoi vous attendre. Le nom d’hôte de l’un de
mes serveurs est wu.images.granneman.com. Je souhaite extraire
le domaine de premier niveau (com), celui de deuxième
niveau (granneman) et celui de troisième niveau (images), mais
pas le quatrième (wu) :

$ echo wu.images.granneman.com | cut -d ‘.’ -f 2-4

images.granneman.com

Vous le constatez, j’ai pu extraire les domaines de


premier, deuxième et troisième niveaux alors qu’ils étaient
séparés par un . à la place d’une tabulation. En effet, j’ai
indiqué que le séparateur était un . et j’ai donc obtenu en
retour les champs séparés par ce même caractère.
Si vous souhaitez un autre caractère de séparation en
sortie, comme une virgule, il suffit de le préciser à l’aide de
l’option --output-delimiter.

$ cut -f 1,3 --output-delimiter=’,’ cool_movies.txt

Movie,Hero

Die Hard,John McClane

Star Wars,Luke Skywalker

John Wick,John Wick

Aliens,Ellen Ripley

The Thing,MacReady

Dans le fichier cool_movies.txt, le séparateur est une


tabulation. S’il s’agit d’un autre caractère, il faut le préciser
avec l’option -d (ou --delimiter).
Voici un exemple simple. Sur les systèmes Linux, $HOSTNAME
est une variable d’environnement qui contient le nom d’hôte
de l’ordinateur, comme perseus.websanity.com. Dans certains
scripts, nous avons uniquement besoin du nom réel de
l’ordinateur (perseus, dans ce cas) sans le nom de domaine
(websanity.com). Puisque les parties du nom de domaine sont
séparées par des points, nous nous en servons comme
délimiteur :

$ echo $HOSTNAME

perseus.websanity.com

$ echo $HOSTNAME | cut -d ‘.’ -f 1

perseus

Info
Je fais preuve d’une certaine approximation lorsque j’écris «
nom réel de l’ordinateur » et « nom de domaine », mais, dans ce
cas, cela convient. Pour de plus amples informations sur le DNS
et ses différents aspects, pouvez consulter la page
https://fr.wikipedia.org/wiki/Nom_de_domaine.

Si nous avons une URL comme


http://www.granneman.com/writing/books/ et voulons extraire
uniquement le nom de domaine complet (www.granneman.com),
nous précisons à cut un autre délimiteur, dans ce cas la
barre oblique (/) :

$ echo http://www.granneman.com/writing/books/ | cut -d ‘/’ -f


3

www.granneman.com

Avec -d ‘/’, nous indiquons à cut que le séparateur est /


et, avec -f 3, lui demandons de retourner le troisième
champ. Toutefois, en examinant    l’URL, il peut paraître
curieux de demander le troisième champ. Le premier champ
est celui qui se trouve avant la première barre oblique,
c’est-à-dire http:. Le deuxième champ est celui placé avant
le deuxième caractère / et qui vient immédiatement après
le premier / (autrement dit, c’est //). Par conséquent, le
deuxième champ est nul, sans contenu. Enfin, le troisième
champ se trouve avant le troisième /, ce qui donne
www.granneman.com. Ça marche !

Trier le contenu d’un fichier

sort

La commande sort permet de trier le contenu de fichiers.


Supposons que le contenu du fichier cool_movies.txt soit
séparé par des caractères de tabulation :

Movie  Genre    Hero    Year

Die Hard        Action  John McClane    1988

Star Wars       Sci-Fi  Luke Skywalker  1977

John Wick       Action  John Wick       2014

Aliens  Sci-Fi  Ellen Ripley    1986

The Thing       Horror  MacReady        1982

Nous souhaitons trier ces informations en fonction du


titre du film :

$ sort cool_movies.txt

Aliens  Sci-Fi  Ellen Ripley 1986

Die Hard        Action  John McClane    1988

John Wick       Action  John Wick       2014

Movie   Genre   Hero    Year

Star Wars       Sci-Fi  Luke Skywalker  1977

The Thing       Horror  MacReady        1982

Le résultat n’est pas probant. L’en-tête de colonne est


considéré comme un titre de film, ce que nous ne
souhaitons pas. Heureusement, nous pouvons employer la
commande sed (voir plus loin dans ce chapitre) et l’option 1d
pour retirer la première ligne et envoyer la sortie obtenue
vers sort.

$ sed 1d cool_movies.txt | sort

Aliens  Sci-Fi  Ellen Ripley 1986

Die Hard        Action  John McClane    1988

John Wick       Action  John Wick       2014

Star Wars       Sci-Fi  Luke Skywalker  1977

The Thing       Horron  MacReady        1982

Nous voulons à présent effectuer le tri non pas sur le nom


des films, mais sur leur année de sortie. Dans ce cas, nous
passons l’option -k (ou --key) afin de choisir une autre
colonne pour l’opération de tri (dans cet exemple, le
quatrième champ). Toutefois, la commande sort utilise par
défaut l’espace comme séparateur. Nous devons donc lui
préciser qu’elle doit rechercher les tabulations.

$ sed 1d cool_movies.txt | sort -t ‘ ‘ -k 4

Star Wars       Sci-Fi  Luke Skywalker  1977

The Thing       Honnon  MacReady        1982

Aliens  Sci-Fi  Ellen Ripley   1986

Die Hard        Action  John McClane    1988

John Wick       Action  John Wick       2014

Pour indiquer la tabulation après -t, la solution la plus


simple consiste à saisir une apostrophe ('), d’appuyer sur
Ctrl-v puis sur Tab, et de terminer par une apostrophe.
Pour effectuer un tri en sens inverse, par exemple sur la
date, nous ajoutons l’option -r (ou --reverse).
$ sed 1d cool_movies.txt | sort -t ‘ ‘ -k 4 -r

John Wick       Action  John Wick       2014

Die Hard        Action  John McClane    1988

Aliens  Sci-Fi  Ellen Ripley    1986

The Thing       Honnon  MacReady        1982

Star Wars       Sci-Fi  Luke Skywalker  1977

Tous les films intéressants, de 2014 à 1977...

Trier numériquement le contenu d’un


fichier

sort -n

sort -h

Examinons une dernière caractéristique intéressante de


sort, le tri numérique. Dans la section précédente, lorsque
nous avons trié les films en fonction des années, vous avez
peut-être pensé qu’elles avaient été classées dans un ordre
numérique, mais ce n’est pas le cas. sort a traité ces années
comme des chaînes de caractères.
Voici un exemple du fonctionnement du tri numérique, à
partir de données fournies par mon serveur. J’avais besoin
de savoir qui occupait tout l’espace dans /var. J’ai donc
commencé avec la commande du (voir le chapitre 13), qui
affiche l’utilisation d’un système de fichiers ou d’un
répertoire. L’option -d 1 fixe la profondeur des résultats de
du ; avec -d 1, nous obtenons la taille des répertoires qui se
trouvent immédiatement dans /var (d’où la profondeur 1). La
commande utilisée m’a fourni les tailles en octets des sous-
répertoires de /var et j’ai transmis ces informations à sort.

$ cd /var

$ du -d 1 | sort

154272    ./cache

1724      ./backups

200976    ./lib

21624     ./mysql_import

2263216   ./log

34479828  ./www

[liste coupée en raison de sa longueur]

Le résultat n’est pas celui attendu. Vous remarquerez que


les octets ont été triés comme s’il s’agissait de chaînes de
caractères : les valeurs qui commencent par le chiffre 1
arrivent en premier, puis viennent celles qui commencent
par 2, et ensuite celles qui commencent par 3. En aucun
cas, elles n’ont été triées de façon numérique. Nous
recommençons, cette fois-ci en utilisant l’option -n (ou --
numeric-sort) de sort.

$ du -d 1 | sort -n

1724      ./backups

21624     ./mysql_import

154272    ./cache

200976    ./lib

324204    ./shared_assets

2264292   ./log

34434904  ./www

[liste coupée en raison de sa longueur]

Le tri est à présent correct, mais les résultats sont un peu


difficiles à comprendre. En passant l’option -h (ou --human-
readable) à du, nous pouvons obtenir les tailles en kibioctets,
mébioctets ou gibioctets. (Si ces mots n’ont pas de sens
pour vous, consultez la section « Rechercher des fichiers
en    fonction de leur taille    » au chapitre    11, «    La
commande find ».)

$ du -d 1 -h | sort -n

1.7M  ./backups

2.2G  ./log

22M   ./mysql_import

33G   ./www

151M  ./cache

197M  ./lib

317M  ./shared_assets

[liste coupée en raison de sa longueur]

Ce n’est pas non plus ce que nous voulons ! Les valeurs


sont triées de façon numérique, mais il est toujours aussi
difficile d’interpréter le résultat. En fait, lorsque nous
utilisons -h avec du, nous devons également utiliser -h avec
la commande sort pour qu’elle travaille correctement, mais
nous ne pouvons pas y associer -n, car ces deux options
sont incompatibles.

$ du -d 1 -h | sort -h

1.7M  ./backups

22M   ./mysql_import

151M  ./cache

197M  ./lib

317M  ./shared_assets

2.2G  ./log

33G   ./www

[liste coupée en raison de sa longueur]

Là c’est beaucoup mieux ! Je suis passé par toutes ces


étapes, car je pense qu’il est souvent utile de constater les
erreurs et la manière de les corriger plutôt que de donner
immédiatement la bonne manière de procéder. Comme je le
dis toujours à mes étudiants, la meilleure façon d’apprendre
est de commettre des erreurs – c’est pourquoi j’ai
énormément appris.

Retirer les lignes en double dans un


fichier

uniq
Linux est en mesure de transformer les lignes en double
d’un fichier en une ligne unique pour chaque ensemble de
doublons. Autrement dit, trois lignes contenant l’expression
« Linux, Guide de survie » (et uniquement « Linux, Guide de
survie ») deviendraient une seule ligne « Linux, Guide de
survie ». La commande capable de cette prouesse se
nomme uniq.
À un moment donné, j’ai eu besoin de déterminer les
commandes qui étaient exécutées et à quelle fréquence.
Nous allons voir comment j’ai procédé et quel a été le rôle
de uniq. (Tous les exemples suivants ont été tronqués en
raison des milliers de lignes des résultats.)

$ history

12291 man rsync

12293 ps aux | grep agent

12294 ps aux | grep ssh

12296 apt-cache search keychain

12297 cat ~/.ssh/authorized_keys

12300 cd /var/www

12302 ln -s /var/shared_assets ~/

12303 cd bin

12314 man dig

La commande history (voir le chapitre 12, « Le shell »)


affiche une liste numérotée des commandes qui ont été
saisies dans bash. La première colonne contient des
nombres, qui ne nous intéressent pas dans le cas présent.
Viennent ensuite des commandes, des options et des
fichiers (par exemple, cd /var/www et man rsync), mais seules
les commandes nous importent (par exemple, cd ou man).
Nous utilisons awk (voir plus loin dans ce chapitre) pour
extraire la deuxième colonne des résultats (séparés par des
espaces) venant de history :

$ history | awk ‘{print $2}’

man

ps

ps

apt-cache

cat

cd

ln

cd

man

Voilà qui est mieux, car nous connaissons à présent


toutes les commandes que nous exécutons, mais cette liste
très très longue est peu utile car certaines commandes
reviennent à plusieurs reprises : deux fois pour man, ps et cd,
par exemple. Grâce à uniq nous devrions obtenir une liste de
commandes, chacune en un seul exemplaire.

$ history | awk ‘{print $2}’ | uniq

man

ps

apt-cache

cat

cd

ln

cd

man

Eh bien non ! Nous avons toujours deux entrées pour man


et cd, une seule pour ps. Que s’est-il passé ? En réalité, uniq
a retiré les doublons uniquement lorsque les lignes se
trouvaient l’une à côté de l’autre. Dans la liste donnée en
exemple, les deux entrées de man sont éloignées et les deux
de cd sont séparées par ln. Ces deux commandes n’ont donc
pas été regroupées en une ligne. En revanche, les deux
entrées de ps
qui se suivent, ont été concaténées.
Pour résoudre ce problème, nous devons commencer par
invoquer la commande sort, décrite dans la section
précédente, afin que les commandes de la liste soient triées
par ordre alphabétique, puis passer ce résultat à uniq.
$ history | awk ‘{print $2}’ | sort | uniq

apt-cache

cat

cd

ln

man

ps

Très bien, nous avançons. La commande sort a permis de


regrouper les deux entrées de cd, tout comme celles de man
et ps. Puisqu’elles étaient adjacentes, uniq les a réduites à
une seule ligne dans ses résultats. C’est mieux, mais nous
souhaitons connaître le nombre d’exécutions de chaque
commande. Pour cela, nous pouvons ajouter l’option -c (ou -
-count) à uniq, car elle permet d’obtenir toutes les
occurrences de chaque commande avant le retrait des
doublons.

$ history | awk ‘{print $2}’ | sort | uniq -c

14 apt-cache

50 cat

229 cd

249 ln

84 man

17 ps

Nous savons à présent combien de fois chaque


commande a été employée. Mais l’ordre donné ne nous est
pas très utile. Il s’agit de l’ordre alphabétique provenant de
sort, alors qu’un ordre numérique serait plus intéressant. De
nouveau, l’option -n (comme numérique) de sort nous sauve
!

$ history | awk ‘{print $2}’ | sort | uniq -c | sort -n

14 apt-cache

17 ps

50 cat

84 man

229 cd

249 ln

Nous avons ce que nous voulions : une liste triée et


dénombrée des commandes utilisées sur le serveur. Il vous
arrivera très souvent de relier sort et uniq, car ces deux
commandes se complètent très bien.

Remplacer des caractères choisis par


d’autres

tr

La commande tr sert à traduire (en réalité, remplacer serait


plus approprié) un jeu de caractères en un autre. Par
exemple, nous pouvons nous en servir pour convertir des
mots de minuscule en majuscule :

$ echo "H.P. Lovecraft" | tr a-z A-Z

H.P. LOVECRAFT

Après tr, nous précisons ce que nous souhaitons traduire,


puis la traduction. Dans l’exemple précédent, a-z représent
des lettres en minuscule et A-Z, des lettres en majuscule.
Toutefois, à la place de a-z ou de A-Z, qui correspondent à
une syntaxe ancienne, vous devez utiliser des classes de
caractère plus récentes et plus portables, comme [:lower:]
et [:upper:]. Les classes de caractères, nombreuses,
représentent un jeu complet de caractères. En voici
quelques-unes qui vous seront utiles, accompagnées des
caractères qu’elles représentent :
• [:alnum:] : caractères alphanumériques (A-Z, a-z et 0-9) ;
• [:alpha:] : caractères alphabétiques (A-Z et a-z) ;
• [:blank:] : caractères d’espacement blancs (espace et
tabulation) ;
• : chiffres (0-9) ;
[:digit:]
• : lettres minuscules (a-z) ;
[:lower:]
• : signes de ponctuation et symboles ;
[:punct:]
• [:space:]: caractères d’espacement (espace, tabulation,
saut de ligne et espace blanc vertical) ;
• [:upper:] : lettres majuscules (A-Z).
À partir de cette liste, vous devinez ce que nous devons
employer :

$ echo "H.P. Lovecraft" | tr [:lower:] [:upper:]

H.P. LOVECRAFT

Remplacer des caractères répétés par


une seule instance

tr -s

La commande tr possède de nombreuses options utiles,


notamment -s (ou --squeeze-repeats), qui permet de
transformer chaque répétition d’un caractère particulier en
une seule instance. Supposons que nous recevions un
fichier texte et que nous constations avec horreur que son
auteur a placé deux espaces après chaque point. Grâce a
l’option -s, nous pouvons transformer ces deux espaces en
un seul, pour obtenir un texte rédigé de manière plus
intelligente.

$ cat "Written by a barbarian.txt"

I clearly do not know how to compose a letter.

➥  Nope, I don’t.  In general, Conan is my

➥ hero.  What is best in life? Crush your

➥ enemies.  See them driven before you.

➥  Hear the lamentations of their women.

$ tr -s [:blank:] < "Written by a barbarian.txt"

I clearly do not know how to compose a letter.

➥ Nope, I don’t. In general, Conan is my

➥ hero. What is best in life? Crush your

➥ enemies. See them driven before you. Hear

➥ the lamentations of their women.

Vous le constatez, les deux espaces présents après


chaque point ont été transformés en un seul. Vous vous
demandez peut-être pourquoi j’ai utilisé [:blank:] à la place
de [:space:]. Ces deux classes de caractères peuvent
paraître équivalentes, mais n’oubliez pas que [:blank:]
représente uniquement les espaces et les tabulations,
tandis que [:space:] inclut également les sauts de ligne (et
d’autres). Si ce fichier comprenait plusieurs paragraphes,
[:space:] aurait également retiré les sauts de ligne,
conduisant à des paragraphes collés. Personne n’oserait
écrire ainsi.
Ajoutons une petite note à propos de tr. J’ai utilisé < pour
rediriger l’entrée standard afin qu’elle provienne du fichier
(voir la section « Utiliser un fichier comme entrée d’une
commande » au chapitre 5), car tr fait partie de ces
quelques commandes qui n’acceptent pas les noms de
fichier en arguments. Autrement dit, vous ne pouvez pas
saisir tr -s [:blank:] Barbarian.txt. À la place, vous devez
employer la redirection avec >, |, < et d’autres méthodes
(voir les détails au chapitre 5) :
echo "Beaucoup   trop   d’espaces" | tr -s [:blank:]

Pour créer un nouveau fichier correctement formaté à


partir du fichier d’origine, il suffit d’utiliser la direction vers
un nouveau fichier. (Sans oublier pas que vous ne pouvez
pas rediriger un fichier vers luimême.)

$ tr -s [:blank:] < "Written by a barbarian.txt" >


Corrected.txt

Vous pouvez maintenant envoyer le fichier, en sachant


que votre réputation ne sera pas entâchée par ces doubles
espaces hideux après un point !

Supprimer les caractères correspondants

tr -d

Pour finir, l’option -d (ou --delete) de tr permet de supprimer


des caractères (je parie que vous l’aviez deviné). Nous
allons prendre pour exemple une partie d’une fonction que
j’ai utilisée pour créer des fichiers destinés au Web. (Pour de
plus amples informations sur les fonctions, consultez les
sections « Créer une nouvelle fonction temporaire » et «
Créer une nouvelle fonction permanente » au chapitre 12.)
La fonction suivante est placée dans le fichier
~/.bash_functions (la ligne 4 a été mise en forme pour
faciliter sa lecture) :

web_ready () {

  [ "${1}" ] || return

  extension=$(echo "${1}" | awk -F . ‘{print $NF}’)

  mv "${1}" $(echo "${1}" |

➥iconv -f utf-8 -t ascii//translit |

➥tr -d ‘[:punct:]’ |

➥tr [:upper:] [:lower:] |

➥sed "s/${extension}$/.$extension/" | tr ‘ ‘ ‘-’)

Avant de l’expliquer, voyons-la en action :

$ ls

What They Know, What You Don’t.pdf

$ web_ready "What They Know, What You Don’t.pdf"


$ ls

what-they-know-what-you-dont.pdf

Pour qu’un fichier puisse être publié sur le Web, nous


devons retirer les signes de ponctuation, mettre toutes les
lettres en minuscule et remplacer les espaces par des tirets.
Nous pouvons à présent expliquer la fonction.
La première ligne, [ "${1}" ] || return, vérifie qu’un
argument (le nom du fichier) a été fourni à la commande
web_ready ; dans le cas contraire, la fonction se termine.
La deuxième ligne, extension=$(echo "${1}" | awk -F .
‘{print $NF}’), est plus complexe. Elle crée une variable
nommée extension, dont la valeur est le résultat de la
substitution de commande réalisée à l’intérieur de $( et )
(voir le chapitre 5). Nous répétons avec echo le premier et
seul argument de la commande web_ready, c’est-à-dire le
nom du fichier représenté par "${1}" (les guillemets sont là
pour le cas où le nom du fichier comporterait des espaces).
Nous passons ensuite ce nom de fichier à awk (voir à la fin
de ce chapitre), qui, grâce à l’option -F, sait que le point (.)
est un séparateur. La partie ‘{print $NF}’ demande à awk
d’imprimer le dernier champ d’un fichier délimité, qui, ici,
correspond toujours à l’extension du fichier (pdf dans cet
exemple, mais elle pourrait être tout autre, comme html,
markdown ou jpg).
La variable extension contient à présent l’extension du
fichier : pdf. Elle sera utilisée bientôt.
La troisième ligne est longue, mv "${1}" $(echo "${1}" |
iconv -f utf-8 -t ascii//translit | tr -d ‘[:punct:]’ | tr
[:upper:] [:lower:] | sed "s/$extension$/.$extension/" | tr ‘ ‘
‘-’), mais elle n’est pas très difficile à comprendre, à
quelques petites exceptions près. Nous nous servons de mv
pour modifier le nom original du fichier, représenté de
nouveau par le premier argument ("${1}"), en un nom
compatible avec le Web. Ce nom est obtenu par substitution
de commande et cinq tubes. C’est là que se trouve la partie
intéressante.
Premièrement, nous répétons le nom du fichier avec echo
"${1}" et l’envoyons immédiatement à iconv -f utf-8 -t
ascii//translit. Quésaco ? Si vous examinez attentivement
le nom du fichier (What They Know, What You Don’t.pdf), vous
remarquerez que l’apostrophe dans « Don’t » n’est pas
droite ; il s’agit d’une apostrophe typographique. Autrement
dit, à la place de Don’t (qui utilise l’encodage ASCII), nous
avons Don’t (qui utilise l’encodage UTF-8).

Info
J’ai mentionné brièvement UTF-8 au chapitre suivant, sans
vraiment expliquer ce que c’est et pourquoi c’est important. J’ai
préparé une page Web et quelques diapositives pour mes
étudiants afin d’expliquer les formats ASCII,  UTF-8 et d’autres.
Si cela vous intéresse, vous pouvez consulter cette page à
l’adresse
www.granneman.com/webdev/coding/characterencoding/ et la
présentation à
http://files.granneman.com/presentations/webdev/Web-Dev-
Intro.pdf.

Le problème est que, au moment de l’écriture de ces


lignes, tr ne reconnaît pas encore le format UTF-8. Ma
fonction présente donc un dysfonctionnement. Vous pouvez
l’exécuter, mais tr bloquera sur cette apostrophe
typographique. Nous employons donc la commande iconv,
qui convertit des fichiers et du texte depuis un format
d’encodage (dans ce cas, -f utf-8) vers un autre (ici, -t
ascii).
La partie //translit, située à la fin de l’expression,
demande à iconv de remplacer automatiquement les
caractères qui ne se trouvent pas dans l’encodage cible
(ASCII, en raison de l’option -t ascii) par des caractères
équivalents. Autrement dit, lorsque la commande iconv
rencontre l’apostrophe typographique, qui est en UTF-8 et
ne fait certainement pas partie de l’ASCII plus ancien et plus
simple, elle la remplace par son équivalent ASCII, c’est-à-
dire l’apostrophe droite. Sans //translit, iconv générerait un
message d’erreur en arrivant sur l’apostrophe
typographique et s’arrêterait.
Avec notre apostrophe ASCII, le nom de fichier est à
présent What They Know, What You Don’t.pdf. Nous le passons à
tr -d ‘[:punct:]’, qui en retire tous les symboles de
ponctuation ; dans cet exemple, cela comprend la virgule,
l’apostrophe et le point avant l’extension. Zut, nous avons
besoin de ce point. Pas de souci, nous le remettrons.
À ce stade, le nom du fichier est What They Know What You
Dontpdf (je sais qu’il manque le point devant pdf !). Nous
l’envoyons à tr [:upper:] [:lower:], qui remplace toutes les
lettres majuscules par des lettres minuscules, de façon à
obtenir what they know what you dontpdf.
Nous résolvons le problème de l’extension en invoquant
sed "s/${extension}$/.$extension/". Le nom actuel (what they
know what you dontpdf) est fourni à sed (voir à la fin de ce
chapitre) et nous utilisons enfin la variable extension dans
${extension}. Nous demandons à sed de remplacer la valeur
de la variable extension (pdf) par un point suivi de la valeur
de cette variable. Nous obtenons donc .pdf.

Info
Quelle est la différence entre ${extension} et $extension ? Il n’y en a
pas ; les deux expressions ont la même signification. Nous
utilisons ${extension} car cette expression est plus facile à lire et
à voir comme une variable.

S’il est évident que ${extension} est la variable, qui vaut


pdf, que peut bien signifier ${extension}$ ? Examinons le code
suivant, d’où cette expression est absente :

$ extension=pdf

$ echo "this pdf is ready for youpdf" |

➥sed "s/${extension}/.$extension/"

this .pdf is ready for youpdf


Après avoir trouvé sa première substitution, sed s’arrête
et nous obtenons un point devant la première instance de
pdf (this .pdf), mais également un nom de fichier sans
véritable extension (youpdf). Dans les expressions régulières,
le symbole $ désigne toujours la fin d’une chaîne de
caractères. Par conséquent, le deuxième $ dans
${extension}$ établit une correspondance avec l’extension,
car elle se trouve toujours à la fin du nom de fichier.
Autrement dit, ${extension}$ demande à sed de rechercher la
valeur de ${extension} (pdf) à la fin de la chaîne de
caractères (par conséquent, youpdf devient you.pdf).
Le nom de fichier est à présent what they know what you
dont. pdf, prêt pour la commande finale : tr ' ' '-';. Elle
utilise tr pour transformer les espaces du nom de fichier en
tirets. Et voilà, nous avons ce que nous voulions, c’est-à-dire
un nom de fichier prêt pour le Web : what-they-know-what-
youdont.pdf.

Transformer le texte d’un fichier

sed

Je vais être franc, la commande sed est extrêmement


puissante, complexe et utile, et l’idée même de pouvoir la
traiter intégralement dans une courte section de cet
ouvrage est risible. Néanmoins, je vais faire de mon mieux
et me focaliser uniquement sur quelques utilisations
majeures de sed afin que vous ayez un aperçu de ses
possibilités.

Info
La commande sed apparaît à plusieurs reprises dans cet ouvrage
:
• les sections « Dénombrer les mots, les lignes et les caractères
dans un fichier », «    Trier le contenu d’un fichier    » et
«  Supprimer les caractères correspondants » de ce chapitre ;
• la section « Créer une nouvelle fonction permanente » du
chapitre 12.
Outre mes modestes contributions, je vous recommande les
lectures suivantes :
• « Sed - An Introduction and Tutorial » de Bruce Barnett
(www.grymoire.com/Unix/Sed.html) ;
• la série d’articles « Sed One-Liners Explained » de Peteris
Krumins (https://catonmat.net/archive?q=Sed%20One-
Liners%20Explained) ;
• le livre Sed One-Liners Explained de Peteris Krumins
(www.catonmat.net/blog/sed-book/) ;
• «    Useful One-Line Scripts for sed    » d’Eric Pement
(www.pement.org/sed/sed1line.txt) ;
• le livre sed & awk de Dale Dougherty et Arnold Robbins.

sed est une abréviation de stream editor (éditeur de flux).


Autrement dit, cette commande permet de transformer un
flux de texte provenant d’un fichier ou d’une redirection.
Pour l’exploiter pleinement, il est indispensable de
comprendre les expressions régulières (ou regexp), que
nous verrons dans plusieurs sections du chapitre 10,
notamment « Les bases de la recherche de motifs dans les
fichiers texte ».
Tout d’abord, il faut savoir que sed peut être utilisé pour
effectuer des substitutions. Supposons que nous disposions
d’un fichier généré automatiquement et dont le nom se
termine par .markdown.txt. Nous voulons que son extension
soit .markdown, sans la partie .txt. Voici comment procéder :

$ ls

The Cats of Ulthar.markdown.txt

$ title="The Cats of Ulthar.markdown.txt"

$ mv "$title" "$(echo "$title" | sed


‘s/markdown.txt/markdown/’)"

$ ls

The Cats of Ulthar.markdown

Sur la quatrième ligne, nous avons utilisé sed pour


changer markdown.txt en markdown. Évidemment, si cette tâche
doit être répétée fréquemment, il est préférable de créer
une fonction qui la réalise de façon plus propre. La section
précédente en donne un exemple.
Notez que, dans le code précédent, la commande sed
s’arrête dès qu’elle trouve la première correspondance sur
chaque ligne. Ce n’est pas un problème dans ce cas précis,
car il n’y a qu’une seule extension double (.markdown.txt)
dans chaque nom de fichier (une seul ligne !). Mais
comment pouvons-nous effectuer le remplacement chaque
fois que le texte correspondant est trouvé, quel que soit le
nombre de lignes ?

$ cat twisters.txt

1. How much wud would a wudchuck chuck if a wudchuck could

➥chuck wud?

2. How much myrtle would a wud turtle hurdle if a wud turtle

➥could hurdle myrtle?

$ sed ‘s/wud/wood/g’ twisters.txt

1. How much wood would a woodchuck chuck if a woodchuck could

➥chuck wood?

2. How much myrtle would a wood turtle hurdle if a wood turtle

➥could hurdle myrtle?

$ cat twisters.txt

1. How much wud would a wudchuck chuck if a wudchuck could

➥chuck wud?

2. How much myrtle would a wud turtle hurdle if a wud turtle

➥could hurdle myrtle?

Notez deux choses dans cet exemple de code.


Premièrement, l’expression s/wud/wood/g comprend la lettre g,
qui signifie global. Lorsque l’attribut g est présent, sed
remplace toutes les instances du mot ou de l’expression
indiqué sur chaque ligne de l’entrée. Dans notre exemple,
chaque wud est donc remplacé par wood, même lorsque cette
suite de lettres se trouve dans d’autres mots (ce n’est pas
forcément ce que nous souhaitons).
Deuxièmement, le fichier d’origine n’a pas été modifié. Le
résultat de la commande est affiché sur l’écran, mais le
fichier n’est pas touché. Pour conserver les résultats, nous
pouvons rediriger la sortie vers un nouveau fichier :

$ sed ‘s/wud/wood/g’ twisters.txt > twisters_fixed.txt

Toutefois, une meilleure solution consiste à utiliser


l’option -i (ou --in-place) de sed. Elle modifie le fichier de
manière à refléter les substitutions effectuées par la
commande sed ; vous devez donc être certain que sed réalise
ce que vous souhaitez. Commencez par vérifier sur l’écran
que la sortie de sed vous convient, puis ajoutez l’option -i.

$ sed -i ‘s/wud/wood/g’ twisters.txt

$ cat twisters.txt

1. How much wood would a woodchuck chuck if a woodchuck could

➥chuck wood?

2. How much myrtle would a wood turtle hurdle if a wood turtle

➥could hurdle myrtle?

Nous avons indiqué précédemment que les expressions


régulières peuvent être (et seront) employées avec sed. Elles
se révéleront utiles dans la plupart des aspects de sed (les
expressions régulières sont récurrentes avec les
substitutions), mais elles peuvent aussi servir de ceinture de
sécurité vis-à-vis des suppressions.
Supposons que nous ayons un script du shell bash avec de
nombreuses lignes de commentaires ; elles commencent
par un #. Nous voulons supprimer ces lignes car nous n’en
avons plus le besoin, à l’exception de la première,
indispensable dans un script de shell. Ce traitement est
facile à mettre en place avec sed. Il suffit d’utiliser l’attribut d
(pour delete, ou suppression) et des expressions régulières.
Ne vous occupez pas de l’objectif du script suivant,
concentrez-vous sur les actions de sed.

$ cat handconv.sh

#!/bin/sh

# Set IFS to split on newlines, not spaces, but 1st save old
IFS

SAVEIFS=$IFS

IFS=$’\n’

# Convert files in folder

for i in * ; do

  # Get the extension of the file, so we can get $filename

  extension=${i##*.}

  # Get the name of the file, sans extension

  filename=$(basename "$i" $extension)

  # Encode files with HandBrakeCLI

  HandBrakeCLI -i "$i" -o ~/Desktop/"$filename"m4v

➥--preset="Normal"

done

# Restore IFS so it’s back to splitting on <space>, <tab>,

➥& <newline>

IFS=$SAVEIFS

$ sed -i ‘1n; /^[[:blank:]]*#/d’ handconv.sh

$ cat handconv.sh

#!/bin/sh

SAVEIFS=$IFS

IFS=$’\n’

for i in * ; do

  extension=${i##*.}

  filename=$(basename "$i" $extension)

  HandBrakeCLI -i "$i" -o ~/Desktop/"$filename"m4v

➥ --preset="Normal"

done

IFS=$SAVEIFS

Toute la magie de la commande se réduit à 1n;


/^[[:blank:]]*#/d. Le d placé à la fin représente la
suppression, mais qu’en est-il du reste ? Rappelez-vous,
nous avons précisé que nous voulions conserver la première
ligne qui commence par # (#!/bin/sh), car elle est obligatoire
dans un script de shell. C’est le rôle de 1n;. Cette expression
demande à sed de sauter la première ligne et de poursuivre
son traitement.
Puisque nous voulons supprimer les autres lignes qui
commencent par #, le motif de recherche devrait être /^#/ (^
représente le début de la ligne). Il permet de trouver les
lignes qui commencent par #, mais, contrairement à ce que
nous pourrions penser, certaines ne seront pas trouvées.
Prenons l’extrait suivant :

# Convert files in folder

  # Encode files with HandBrakeCLI

Le tout début de la première ligne commence par #, qui


correspond bien au motif /^#/. La seconde ligne semble
commencer par #, mais, en réalité, le dièse est précédé de
deux espaces ; elle ne correspond donc pas au motif.
La solution est /^[[:blank:]]*#/. Le symbole ^ représente
toujours le début de la ligne, mais nous ajoutons ensuite la
classe de caractères [[:blank:]] (voir la section « Remplacer
des caractères choisis par d’autres ») pour correspondre à
un espace ou une tabulation. Cependant, puisque nous
devons rechercher plusieurs espaces, nous ajoutons *, qui
signifie zéro ou plusieurs occurrences du caractère qui
précède, après [[:blank:]]. Autrement dit, /^[[:blank:]]*#/
signifie commencer au début de la ligne (^) et rechercher un
espace ou une tabulation ([[:blank:]]), qui pourrait
apparaître zéro ou plusieurs fois (*), suivi d’un dièse (#).
Voilà comment sed fonctionne avec les expressions
régulières. Nous avons à peine effleuré la surface de sed,
mais j’espère que vous avez à présent envie d’en savoir
plus. Si vous êtes un mordu d’informatique comme moi, et
même si vous ne l’êtes pas, plus vous en apprendrez sur les
expressions régulières, plus vous serez capable de choses
incroyables avec votre ordinateur. Apprenez sed, apprenez
les expressions régulières, vous en serez très heureux.

Afficher certains champs d’un fichier

awk

Nous l’avons dit à propos de sed au début de la section


précédente, et nous le répétons à présent à propos de awk :
la commande awk est extrêmement puissante, complexe et
utile, et l’idée même de pouvoir la traiter intégralement
dans une courte section de cet ouvrage est risible.
Néanmoins, comme pour sed, je vais faire de mon mieux et
me focaliser uniquement sur quelques utilisations majeures
de awk. Dans le cas présent, il s’agit essentiellement de
sélectionner des colonnes et de les afficher. Vous aurez ainsi
un aperçu des possibilités de cette commande incroyable.

Info
Vous retrouverez la commande awk dans l’exemple de la section
« Créer une nouvelle fonction permanente » chapitre 12. Outre
mes modestes contributions, je vous recommande les lectures
suivantes :
• « Awk » de Bruce Barnett (www.grymoire.com/Unix/Awk.html)
;
• Eric Pement’s “Handy One-Line Scripts for awk”
(www.pement.org/awk/awk1line.txt) ;
• la série d’articles « Awk One-Liners Explained » de Peteris
Krumins (https://catonmat.net/archive?q=Awk%20One-
Liners%20Explained) ;
• le livre Awk One-Liners Explained de Peteris Krumins
(www.catonmat.net/blog/awk-book/) ;
• « Handy One-Line Scripts for awkd » d’Eric Pement
(www.pement.org/awk/awk1line.txt) ;
• le livre sed & awk de Dale Dougherty et Arnold Robbins.
• le livre The AWK Programming Language de Alfred Aho, Peter
J. Weinberger et Brian W. Kernighan (prêtez attention aux
initiales des noms de famille !).

La commande awk, dont le nom vient de ceux de ses trois


concepteurs, Aho, Weinbergeret Kernighan, permet de
rechercher des motifs dans des fichiers et sur l’entrée,
d’appliquer un filtre sur les éléments et de produire des
rapports. À première vue, elle ressemble à sed, et c’est vrai
qu’elles partagent plusieurs aspects, mais awk est,
contrairement à sed, un langage de programmation, avec
des variables, des fonctions, des tableaux, des appels
système, etc. Cela ne veut pas dire que nous devons
toujours utiliser awk à la place de sed, juste que nous devons
choisir l’outil adapté à la tâche.
Sur l’un de mes serveurs, le fichier de la file d’attente des
courriers électroniques devient parfois un peu trop
volumineux. Périodiquement, je voudrais vérifier sa taille et,
si nécessaire, faire un tri. Grâce à wc (voir précédemment
dans ce chapitre), nous pouvons déterminer la taille en
octets de ce fichier.

$ wc -c /var/mail/mail

2780599 /var/mail/mail

Très bien, mais seul le nombre d’octets nous intéresse ; le


nom du fichier est inutile. Nous utilisons awk pour afficher la
taille, en précisant $1, qui permet de ne garder que la
première colonne.

$ wc -c /var/mail/mail | awk ‘{print $1}’

2780599

C’est mieux, mais la valeur est peu compréhensible. Bien


que le calcul puisse se faire mentalement, nous préférons le
confier à l’ordinateur.

$ wc -c /var/mail/mail | awk '{print "mail is " $1/1024 "


MB"}'

mail is 2715.43 MB

Nous demandons à awk d’afficher la chaîne « mail is »


(notez l’espace représenté par le caractère ), d’extraire la
première colonne et de diviser sa valeur par 1 024, et
d’ajouter la chaîne « MB » (notez de nouveau l’espace). Le
résultat affiché est ainsi : mail is 2715.43 MB.

Astuce
Il serait intéressant de transformer cette commande en
fonction, car elle est un peu longue et peu amusante à saisir.
Pour cela, consultez la section « Créer une nouvelle fonction
temporaire » au chapitre 12.

Effectuons un traitement comparable, mais un peu plus


compliqué. De nouveau, nous allons extraire des colonnes
de données et en afficher quelques-unes sous forme d’un
mini rapport. La commande df -h (voir au chapitre 13)
affiche l’utilisation de l’espace disque sur tous les systèmes
de fichiers de l’ordinateur (j’ai retiré plusieurs lignes afin de
gagner de la place et ne conserver que les plus
importantes) :

$ df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda   4.9G 742M  4.1G  16% /

/dev/sdb    79G  36G   43G  46% /var

Nous n’avons pas besoin de toutes ces informations.


Grâce à awk, nous changeons les éléments affichés à l’écran
:
$ df -h | awk ‘{ print $6 " has " $4 " of " $2 " left" }’

Mounted has Avail of Size left

/ has 4.1G of 4.9G left

/var has 43G of 79G left

À l’exception de la première ligne, le résultat nous


convient. awk a travaillé conformément à notre demande (le
réagencement des colonnes est parfait) : il a extrait les
colonnes 6, 4 et 2, et en a écrit le contenu accompagné des
chaînes de caractères indiquées (notez la présence des
espaces qui facilitent la lecture des résultats). La première
ligne en fait partie, alors que nous n’en voulons pas. Voici
comment corriger ce problème :

$ df -h | awk 'NR>1 { print $6 " has " $4 " of " $2 " left" }'

/ has 4.1G of 4.9G left

/var has 43G of 79G left

Avec NR>1, nous demandons à awk de sauter la première


ligne. NR est une variable spéciale de awk qui représente le
nombre d’enregistrements (lignes) du fichier lus jusqu’à
présent. Elle augmente de 1 chaque fois que awk traite une
ligne. Par conséquent, NR>1 signifie que, après la première
ligne (>1), awk doit commencer à afficher ce que nous lui
avons demandé.

Info
En réfléchissant à l’exemple précédent, vous avez peut-être
imaginé ceci :
$ df -h | grep '^/' |

➥awk '{ print $6 " has " $4 " of " $2 " left" }'

C’est tout à fait correct    ! Au lieu d’utiliser NR>1 dans awk, nous
pouvons demander à grep d’écarter toute ligne qui ne commence
pas par /  ; cela permet effectivement de supprimer la première
ligne de la sortie produite par df. À vous de choisir la solution
qui vous convient. Une fois encore, cela montre que les
commandes de Linux offrent plusieurs manières d’effectuer un
travail.

Conclusion

Il existe un dicton merveilleux appelé « Loi de


programmation de Taylor » et qui dit à peu près ceci :
N’écrivez jamais en C ce que vous pouvez écrire en awk.
Ne le faites jamais avec awk si sed en est capable.
N’utilisez jamais sed lorsque tr peut faire le travail.
N’invoquez jamais tr lorsque cat suffit.
Éviter autant que possible d’employer cat.
Après avoir lu ce chapitre et ceux qui traitent de ces
commandes, vous devez commencer à comprendre la
logique derrière la loi de Taylor. Elle est amusante, mais le
message sous-jacent est pertinent : utilisez la bonne
commande au bon moment.
Nous avons parcouru un long chemin dans ce chapitre.
Pourtant, vis-à-vis de sed et awk, nous avons à peine
commencé le voyage dans ces deux immenses contrées. Il
reste beaucoup à découvrir sur tous les filtres de ce
chapitre, et de ce livre, mais vous devriez maintenant
comprendre qu’ils constituent un élément absolument
essentiel de la ligne de commande de Linux. Unix se fonde
sur le principe suivant : de nombreux petits programmes,
chacun dédié principalement à une tâche. Les filtres
incarnent parfaitement cette idée.
Chapitre 8
Propriétés et permissions
Dès son origine, Linux a été conçu comme un système
multi-utilisateur (contrairement à Windows, qui a été pensé
au départ comme un système mono-utilisateur, ce qui
explique la plupart des problèmes de sécurité qu’il connaît
aujourd’hui encore). Cela signifie que différents utilisateurs
peuvent accéder au système, créer des fichiers, supprimer
des répertoires et lire différents éléments. Pour leur éviter
de passer leur temps à marcher sur les pieds de leurs
collègues et d’endommager le système d’exploitation lui-
même, un système de permissions a été mis en place. La
maîtrise des autorisations vous permettra de mieux
exploiter votre système Linux, qu’il s’agisse d’un simple
poste de travail ou d’un gros serveur auquel des centaines
d’utilisateurs se connectent. Si les outils sont simples, la
puissance qu’ils confèrent est importante.

Info
Pour la deuxième édition de cet ouvrage, j’ai retiré les sections
qui concernaient chgrp -v et chgrp -c (toutes deux affichent les
actions de chgrp pendant son travail). Les descriptions originales
se trouvent sur mon site Web
(granneman.com/writing/books/linux-phrasebook).

Changer d’utilisateur

su nom_utilisateur
La commande su (qui signifie switch user et non super user
comme le veut la légende) permet à un utilisateur d’agir
temporairement comme s’il était un autre utilisateur. On
l’utilise souvent lorsqu’on souhaite un accès rapide au shell
en tant que root pour exécuter une ou deux commandes,
puis revenir à son état antérieur d’utilisateur non root. C’est
un peu comme Clark Kent se transformant en Superman,
sauvant le monde, puis reprenant son statut de petit
journaliste.
Pour invoquer su, il suffit de saisir su suivi du nom de
l’utilisateur dont vous voulez emprunter l’identité, puis de
saisir son mot de passe.

$ ls

/home/scott/libby

$ whoami

scott

$ su gromit

Password:

$ whoami

gromit

$ ls

/home/scott/libby

Vous noterez la présence d’une nouvelle commande dans


ce code, whoami, qui ne figure pas parmi les plus utilisées.
Elle permet de savoir qui vous êtes du point de vue du shell.
Ici on l’utilise pour vérifier le bon fonctionnement de la
commande su.

Devenir un autre utilisateur en


bénéficiant de ses variables
d’environnement

su -l
La commande su ne fonctionne que si vous connaissez le
mot de passe de l’utilisateur. Pas de mot de passe, pas de
transformation. Si cela fonctionne, vous adoptez le shell que
l’utilisateur a défini dans son fichier /etc/passwd : sh, zsh ou
bash, par exemple. La plupart des utilisateurs Linux
emploient le shell bash, mais vous ne constaterez pas de
différences notables. Notez également dans l’exemple
précédent que vous n’avez pas changé de répertoire en
changeant d’utilisateur. Vous êtes devenu gromit, mais vous
utilisez toujours les variables d’environnement de scott.
C’est un peu comme si vous aviez trouvé les habits de
Superman et que vous les ayez enfilés : vous ressemblez à
Superman (cool !), mais vous n’avez aucun de ses pouvoirs.
Vous pouvez remédier à cette situation grâce à l’option -l
(ou --login).

$ ls

/home/scott/libby $

whoami

scott

$ su -l gromit

Password:

$ whoami

gromit

$ ls

/home/gromit

Par rapport à l’exemple précédent, les choses ne


semblent pas très différentes mais, pourtant, elles le sont.
Le fait que vous vous trouviez maintenant dans le répertoire
personnel de gromit montre que quelque chose a changé.
L’option -l demande à su d’utiliser le shell de la personne
dont vous prenez l’identité. Vous êtes désormais gromit et
vous utilisez ses variables d’environnement. Vous vous
trouvez donc dans son répertoire personnel (là où il se serait
trouvé s’il s’était connecté lui-même à cette machine).
Maintenant, en plus des habits de Superman, vous avez
aussi ses pouvoirs.

Devenir root

su

Au début de ce chapitre, nous avons vu que su était souvent


utilisé pour devenir root. Pour cela, vous pouvez utiliser su
root ou mieux encore, su -l root, mais il existe une
technique plus rapide.

$ whoami

scott

$ su

Password:

$ whoami

root

Si su ne fonctionne pas, essayez sudo su à la place. La


manière de procéder varie selon les distributions – sans
surprise !

Devenir root en bénéficiant de ses


variables d’environnement

su -

Saisir su tout seul revient à taper su root, vous avez de root


le nom et la puissance, mais c’est tout. En coulisse, vos
variables d’environnement non root sont toujours
opérationnelles comme le montre cet exemple :
$ ls

/home/scott/libby

$ whoami

scott

$ su

Password:

$ whoami

root

$ ls

/home/scott/libby

Lorsqu’on utilise su -, on devient root et on bénéficie des


variables d’environnement de root.

$ ls

/home/scott/libby $

whoami

scott

$ su -

Password:

$ whoami

root

$ ls

/root

Voila qui est mieux. L’ajout du - après su revient à saisir


su -l root, mais demande moins de saisie. Vous êtes root au
niveau du nom, de la puissance et des variables
d’environnement, ce qui signifie que vous êtes totalement
root. Vous pouvez maintenant vous amuser avec vos
superpouvoirs, mais, vous le savez, « un grand pouvoir
implique de grandes resp... » Oh, vous savez aussi comment
cela se termine !

Modifier le groupe des fichiers et des


répertoires
chgrp

Sur pratiquement tous les systèmes Linux, lorsque vous


créez un fichier (ou répertoire), vous en êtes par défaut le
propriétaire et votre groupe devient celui du fichier (ou du
répertoire). Imaginons que vous rédigiez un nouveau script
destiné à être exécuté sur votre système.

$ touch script.sh

$ ls -l

-rw-r--r-- 1 scott scott script.sh

Info
Le nom de l’utilisateur et le nom du groupe sont tous les deux
scott sur cette machine, mais ce n’est pas nécessairement le cas
sur tous les systèmes. Lorsqu’un fichier est créé, l’UID de
l’utilisateur (User ID number, numéro d’identifiant utilisateur)
devient le propriétaire du fichier, alors que le GID de
l’utilisateur (Group ID number, numéro d’identifiant de groupe)
devient le groupe du fichier.

Comment faire si vous appartenez au groupe admins sur


votre machine et souhaitez que d’autres utilisateurs de ce
groupe puissent lancer votre script ? Dans ce cas, vous
devez changer le groupe du fichier de scott en admins grâce
à la commande chgrp.

$ chgrp admins script.sh

$ ls -l

-rw-r--r-- 1 scott admins script.sh

Info
Ce script ne fonctionnera pas, car il n’est pas exécutable. Vous
verrez plus loin comment modifier ses autorisations grâce à
chmod.
Vous devez savoir plusieurs choses à propos de chgrp.
Lorsque vous l’exécutez, vous pouvez utiliser le nom ou
l’identifiant numérique d’un groupe. Pour connaître le
numéro associé à un groupe, le plus simple consiste à
utiliser cat /etc/group pour visualiser le contenu du fichier
qui conserve la trace de tous les groupes sur votre machine
:

$ cat /etc/group

bind:x:118:

scott:x:1001:

admins:x:1002:scott,alice,bob
[liste coupée en raison de sa longueur]

L’autre point à retenir concerne la sécurité. Vous ne


pouvez modifier le groupe d’un fichier que si vous
appartenez à ce groupe. Dans l’exemple précédent, scott,
alice ou bob peuvent utiliser chgrp pour faire d’admins le
groupe d’un fichier ou d’un répertoire, mais carol ne peut
pas, car elle n’est pas membre du groupe admins.

Modifier le groupe d’un répertoire de


façon récursive

chgrp -R

Pour modifier le groupe de plusieurs fichiers dans un même


répertoire, vous pouvez utiliser un caractère joker. En
revanche, pour modifier le groupe propriétaire d’un
répertoire et de toute son arborescence, utilisez l’option -R
(ou --recursive).

$ pwd

/home/scott/pictures/libby

$ ls -F

by_pool/ libby_arrowrock.jpg libby.jpg on_floor/

$ ls -lF *

-rw-r--r-- 1 scott scott libby_arrowrock.jpg

-rw-r--r-- 1 scott scott libby.jpg

by_pool/:

-rw-r--r-- 1 scott scott libby_by_pool_02.jpg

drwxr-xr-x 2 scott scott lieberman_pool

on_floor/:

-rw-r--r-- 1 scott scott libby_on_floor_01.jpg

-rw-r--r-- 1 scott scott libby_on_floor_02.jpg

$ chgrp -R family */*

$ ls -l *

-rw-r--r-- 1 scott family libby_arrowrock.jpg

-rw-r--r-- 1 scott family libby.jpg

by_pool:

-rw-r--r-- 1 scott family libby_by_pool_02.jpg

drwxr-xr-x 2 scott family lieberman_pool

on_floor:

-rw-r--r-- 1 scott family libby_on_floor_01.jpg

-rw-r--r-- 1 scott family libby_on_floor_02.jpg

Attention
Si vous aviez employé chgrp -R family *, vous n’auriez modifié
aucun des fichiers commençant par un point (.) dans le
répertoire /home/scott/pictures/ libby. Cependant, la forme chgrp -R
family .* ne doit pas non plus être utilisée. Elle traite tous les
fichiers commençant par un point dans le répertoire courant,
mais, comme .* correspond aussi à .., cela entraînera
également une modification des fichiers dans le répertoire
parent, ce qui n’est vraisemblablement pas ce que vous
souhaitez.

Modifier le propriétaire des fichiers et


des répertoires

chown
Il est important de savoir modifier le groupe d’un fichier,
mais, le plus souvent, vous modifierez son propriétaire. Pour
modifier le groupe, on utilise chgrp ; pour modifier le
propriétaire, on emploie chown. Toutefois, nous devons faire
une mise en garde importante à propos de chown : seul
l’utilisateur root (ou en utilisant sudo, comme sur Ubuntu)
peut modifier le propriétaire des fichiers ! Si vous n’êtes pas
root, vous ne pouvez pas changer le propriétaire de vos
propres fichiers.

Astuce
Pour que d’autres utilisateurs aient accès à vos fichiers, vous
pouvez demander à root d’employer la commande useradd ou
usermod pour ajouter ces utilisateurs au groupe qui contrôle le
fichier. Mais même dans ce cas, l’utilisateur root (ou un
utilisateur avec sudo) doit faire cette opération.

# ls -l

-rw-r--r-- 1 scott scott libby_arrowrock.jpg

-rw-r--r-- 1 scott family libby.jpg

-rw-r--r-- 1 scott scott libby_on_couch.jpg

# chown denise libby.jpg

# ls -l

-rw-r--r-- 1 scott scott libby_arrowrock.jpg

-rw-r--r-- 1 denise family libby.jpg

-rw-r--r-- 1 scott scott libby_on_couch.jpg

Certains aspects de chgrp, vus à la section « Modifier le


groupe des fichiers et des répertoires », s’appliquent
également à chown, laquelle se réfère soit au nom de
l’utilisateur, soit à son identifiant numérique. L’identifiant
numérique correspondant à un utilisateur peut être obtenu
en exécutant cat /etc/passwd (ou à l’aide de la commande
id), ce qui donnera quelque chose comme :

bind:x:110:118::/var/cache/bind:/bin/false

scott:x:1001:1001:Scott,,,:/home/scott:/bin/bash

ntop:x:120:120::/var/lib/ntop:/bin/false
Le premier nombre à apparaître est l’identifiant
numérique de l’utilisateur (le second est l’identifiant
numérique du groupe de l’utilisateur).

Attention
À l’instar de chgrp -R, vous pouvez exécutez chown -R pour modifier
de façon récursive le propriétaire des fichiers et des
répertoires. Mais vous devez avoir conscience d’un petit
problème. Si vous utilisez la forme chown -R scott *, vous ne
modifierez pas le propriétaire des fichiers commençant par un
point (.) dans le répertoire courant. En revanche, la forme chown -
R scott .* ne doit pas être employée. Elle traite tous les fichiers
commençant par un point dans le répertoire courant, mais, .*
correspondant aussi à .., cela entraînera une modification des
fichiers dans le répertoire parent, ce qui n’est
vraisemblablement pas ce que vous souhaitez.

Modifier le propriétaire et le groupe des


fichiers et des répertoires

chown propriétaire:groupe

Vous avez vu qu’il est possible d’utiliser chgrp pour modifier


les groupes et chown pour modifier les propriétaires, mais
vous pouvez utiliser chown pour faire d’une pierre deux
coups. Il suffit pour cela de saisir chown suivi du nom de
l’utilisateur, de deux-points (:), du nom du groupe et pour
finir du nom du fichier à traiter (c’est l’une des raisons pour
laquelle il est préférable d’éviter le symbole deux-points
dans les noms d’utilisateurs ou de groupes).

$ ls -l

-rw-r--r-- 1 scott scott libby.jpg

$ chown denise:family libby.jpg

$ ls –l

-rw-r--r-- 1 denise family libby.jpg

Vous pouvez même utiliser chown pour ne modifier que le


groupe en omettant l’utilisateur avant les deux-points et le
nom du groupe.

$ ls -l

-rw-r--r-- 1 scott scott libby.jpg $

chown :family libby. jpg

$ ls –l

-rw-r--r-- 1 scott family libby.jpg

Astuce
Comment faire si le nom d’un groupe ou d’un utilisateur
contient le symbole deux-points ? Saisissez simplement une
barre oblique inversée (\) juste avant les deux-points, de
manière à « protéger » le caractère et à prévenir le système
qu’il s’agit d’un simple symbole deux-points, non d’un caractère
séparant un nom d’utilisateur d’un nom de groupe.
$ chown denise:family\:parents libby.jpg

Cela fonctionne, mais il est quand même préférable d’éviter le


symbole deux-points dans les noms de groupes et d’utilisateurs.

Comme chown est capable des mêmes fonctions que chgrp,


il y a peu de raisons d’utiliser cette dernière.

Info
Pour séparer le nom d’utilisateur et le nom de groupe, vous
pouvez en fait utiliser indifféremment les symboles . et :. Les
recommandations les plus récentes encouragent toutefois
l’utilisation de : aux dépens de ..

Comprendre les bases des permissions

Avant d’étudier la commande chmod, qui permet de modifier


les permissions associées aux fichiers et aux répertoires,
voyons comment Linux perçoit ces permissions.

Info
Les systèmes Linux disposent désormais d’un système de
permissions plus puissant nommé ACL (Access Control Lists). Au
moment de l’écriture de ces lignes, les ACL ne sont pas encore
largement utilisées et nous ne les présenterons donc pas dans
cet ouvrage. Vous trouverez toutes les informations nécessaires
en lisant http://lea-
linux.org/documentations/index.php/Gestion_des_ACL (Léa
Linux). Vous pouvez également consulter la page de manuel (man
acl) correspondante si votre système en dispose.

Linux considère que trois types d’utilisateurs peuvent


travailler avec un fichier ou un répertoire : le propriétaire
actuel (également connu comme l’utilisateur du fichier), un
groupe et toutes les autres personnes sur le système.
Chacune de ces catégories d’utilisateurs est représentée par
une lettre, comme le montre le tableau 8.1.

Tableau 8.1 Utilisateurs et abréviations correspondantes


Catégorie d'utilisateur Abréviation
Utilisateur (propriétaire) u
Groupe g
Autres o

À la section « Permissions, propriétés et autres » du


chapitre 2, « Parcours du système de fichiers », vous avez
vu que les permissions définissent ce qu’un utilisateur a le
droit de faire avec des fichiers et des répertoires. Vous y
avez rencontré trois attributs, lecture, écriture et exécution
(read, write et execute), représentés par les lettres r, w et x.
Parmi les attributs supplémentaires, on trouve suid, sgid, et
le sticky bit, représentés, respectivement, par s (ou S sur
certains systèmes), s (ou S) et t (ou T). Souvenez-vous
toutefois que tout cela peut avoir une signification différente
selon que l’élément qui porte l’attribut est un fichier ou un
répertoire. Le tableau 8.2 énumère les attributs, leur
abréviation et leur signification.
Tableau 8.2 Attributs, abréviation et signification

Info
L’utilisateur root peut faire tout ce qu’il souhaite avec n’importe
quel fichier, le tableau précédent ne le concerne donc pas.
(Évidemment, il ne peut pas exécuter par magie ce qui n’est pas
exécutable ; il ne peut donc pas tout faire.)

Chacun de ces attributs est traité plus en détail aux


sections suivantes. Maintenant que vous avez compris les
bases, voyons comment utiliser chmod pour modifier les
permissions sur les fichiers et répertoires.

Modifier les permissions des fichiers et


des répertoires en employant la notation
symbolique

chmod [ugo][+-=][rwx]

Deux notations peuvent être utilisées avec chmod :


symbolique et octale. Toutes deux ont leurs propres
avantages, mais il peut être plus simple de commencer par
apprendre la notation symbolique car elle utilise une
formule simple : groupe à modifier (u, g, o), suivi du symbole
+ pour accorder une permission, du symbole - pour retirer
une permission ou du symbole = pour fixer des permissions
exactes, suivi des lettres (r, w, x, s, t) représentant les
permissions que l’on souhaite modifier. Imaginons que vous
souhaitiez autoriser les membres du groupe family à
modifier une image.

$ ls –l

-rw-r--r-- 1 scott family libby.jpg

$ chmod g+w libby.jpg

$ ls -l

-rw-rw-r-- 1 scott family libby.jpg

Simple, non ? Mais comment faire pour accorder une


autorisation en écriture sur ce fichier au groupe family, ainsi
qu’à tous les autres utilisateurs ?

$ ls –l

-rw-r--r-- 1 scott family libby.jpg

$ chmod go+w libby.jpg

$ ls -l

-rw-rw-rw- 1 scott family libby.jpg

Comme, au final, vous accordez une autorisation en


écriture à tout le monde, propriétaire, groupe et autres,
vous auriez donc aussi pu utiliser la formulation suivante :

$ ls –l

-rw-r--r-- 1 scott family libby.jpg

$ chmod a=rw libby.jpg

$ ls -l

-rw-rw-rw- 1 scott family libby.jpg

Si vous changez d’avis et que vous souhaitiez retirer la


permission en écriture au groupe family et aux autres
utilisateurs, utilisez le code qui suit. Notez qu’il rend même
l’image invisible (lecture interdite) pour les utilisateurs qui
n’en sont pas propriétaires et qui n’appartiennent pas au
groupe.

$ ls –l

-rw-rw-rw- 1 scott family libby.jpg

$ chmod go-w libby.jpg

$ ls -l

-rw-r--r-- 1 scott family libby.jpg

$ chmod o-r libby.jpg

$ ls -l

-rw-r----- 1 scott family libby.jpg

À la place du symbole -, vous auriez aussi pu utiliser =.


$ ls –l

-rw-rw-rw- 1 scott family libby.jpg

$ chmod g=r libby.jpg

$ ls -l

-rw-r--rw- 1 scott family libby.jpg

$ chmod o= libby.jpg

$ ls -l

-rw-r----- 1 scott family libby.jpg

Dans le dernier chmod, o est égal à rien, ce qui revient à


supprimer toutes les permissions pour les autres utilisateurs
sur le système. C’est une méthode rapide et efficace.
L’inconvénient du système symbolique s’illustre dans le
dernier exemple : si vous souhaitez modifier les permissions
pour deux groupes d’utilisateurs ou davantage et que ces
modifications sont différentes pour chaque groupe, vous
êtes obligé d’exécuter la commande chmod au moins deux
fois.

Modifier les permissions des fichiers et


des répertoires en employant la notation
octale

chmod [0-7][0-7][0-7]

Les permissions octales sont construites autour du système


binaire. Je n’expliquerai pas ici pourquoi telle permission
correspond à tel chiffre, sachez simplement que lecture (r)
vaut 4, écriture (w) vaut 2 et exécuter (x) vaut 1. Souvenez-
vous que les permissions Linux distinguent trois catégories
d’utilisateurs : le propriétaire, le groupe et les autres.
Chaque groupe d’utilisateurs peut lire, écrire et exécuter
(voir le tableau 8.3).
Tableau 8.3 Permissions et représentations octales
Avec ce schéma, l’attribution des permissions revient à
effectuer une simple addition. Voici quelques exemples :
• Un utilisateur a une autorisation en lecture/écriture sur
un fichier ou un répertoire. Lecture vaut 4, Écriture vaut
2, et Exécution vaut 0. La permission finale est donc 4 +
2 + 0 = 6.
• Un utilisateur a une autorisation en lecture/exécution sur
un fichier ou un répertoire. Lecture vaut 4, Écriture vaut 0
(car cette autorisation n’a pas été accordée), et
Exécution vaut 1. La permission finale est donc 4 + 0 + 1
= 5.
• Un utilisateur a une autorisation en lecture/
écriture/exécution sur un fichier ou un répertoire. Lecture
vaut 4, Écriture vaut 2 et Exécution vaut 1. La permission
finale est donc 4 + 2 + 1 = 7.
Selon cette méthode, la valeur maximale attribuable est
7 (lecture, écriture et exécution autorisées) et la plus basse
est 0 (lecture, écriture et exécution interdites). Comme il y a
trois groupes d’utilisateurs, on a trois valeurs pouvant aller
de 0 à 7, et chacune représente les permissions dont une
catégorie d’utilisateurs bénéficie. Le tableau 8.4 récapitule
les valeurs possibles et les permissions correspondantes.
Tableau 8.4 Permissions numériques représentées avec ls -l
Nombre Représentation avec ls -l
0 ---

1 --x

2 -w-

3 -wx
4 r--

5 r-x

6 rw-

7 rwx

S’il est possible de définir une grande variété de


permissions, certaines ont tendance à apparaître
constamment. Le tableau 8.5 liste les permissions les plus
courantes et leur signification.
Tableau 8.5 Permissions courantes et représentation ls -l

Commande Représentation Signification


chmod ls -l
chmod 400 -r Le propriétaire peut lire, les autres ne
peuvent rien faire du tout
chmod 644 -rw-r--r-- Tout le monde peut lire, seul le
propriétaire peut modifier
chmod 660 -rw-rw Le propriétaire et le groupe peuvent
lire et modifier, les autres ne peuvent
rien faire
chmod 664 -rw-rw-r-- Tout le monde peut lire, le propriétaire
et le groupe peuvent modifier
chmod 700 -rwx Le propriétaire peut lire, écrire et
exécuter, les autres ne peuvent rien
faire
chmod 744 -rwxr--r-- Tout le monde peut lire, seul le
propriétaire peut modifier et exécuter
chmod 755 -rwxr-xr-x Tout le monde peut lire et exécuter,
seul le propriétaire peut modifier
chmod 777 -rwxrwxrwx Tout le monde peut lire, écrire et
exécuter (généralement, ce n'est pas
une bonne idée !)

Attention
Oui, il est possible de faire un chmod 000 sur un fichier ou un
répertoire, mais la seule personne qui pourra l’utiliser et
modifier ces permissions dans ce cas sera l’utilisateur root.
Cependant, root et le propriétaire du fichier pourront toujours
utiliser chmod pour remettre des permissions normales. chmod 000 a
changé qui pouvait agir sur le fichier, mais n’a pas changé qui
pouvait en fixer les autorisations.

Les permissions octales doivent maintenant être plus


claires. Elles demandent un peu plus de réflexion que les
permissions symboliques, mais elles permettent d’apporter
des modifications plus efficacement. Reprenons les
exemples de la section précédente, mais cette fois-ci avec
le système de permissions octales.
Imaginons que vous souhaitiez autoriser les membres du
groupe family à modifier une image.

$ ls –l

-rw-r--r-- 1 scott family libby.jpg

$ chmod 664 libby.jpg

$ ls -l

-rw-rw-r-- 1 scott family libby.jpg

Accordons maintenant la permission en écriture au


groupe family et à tous les autres utilisateurs.

$ ls –l

-rw-r--r-- 1 scott family libby.jpg

$ chmod 666 libby.jpg

$ ls -l

-rw-rw-rw- 1 scott family libby.jpg

Supprimons la permission en écriture pour le groupe


family et les autres utilisateurs. Supprimons également
l’autorisation en lecture pour tous les autres utilisateurs.

$ ls –l

-rw-rw-rw- 1 scott family libby.jpg

$ chmod 640 libby.jpg

$ ls -l

-rw-r----- 1 scott family libby.jpg

Ce dernier exemple montre la différence entre l’utilisation


de la notation symbolique et la notation octale. Avec cette
dernière, nous utilisons chmod 640, tandis que la notation
symbolique aurait imposé chmod a=rw,go-w,o-r ou chmod
u=rw,g=r,o=. Personnellement, je trouve la notation octale
plus facile à mémoriser, à utiliser et à saisir. Apprenez les
deux méthodes, mais choisissez celle qui vous semble plus
naturelle.

Astuce
Si vous avez besoin d’aide avec les permissions en notation
octale, vous trouverez un outil très intéressant à l’adresse
permissions-calculator.org.

Modifier les permissions de façon


récursive

chmod -R

Vous avez sans doute remarqué que de nombreuses


commandes Linux peuvent être appliquées de façon
récursive aux fichiers et répertoires. chmod ne fait pas
exception. Avec l’option -R (ou --recursive), vous pouvez
modifier les permissions pour des centaines de fichiers en
quelques secondes. Vérifiez simplement que c’est bien ce
que vous souhaitez.

$ pwd

/home/scott/pictures/libby

$ ls -lF

drwxrw---- 2 scott scott    120 by_pool/

-rw-r--r-- 1 scott scott  73786 libby_arrowrock.jpg

-rw-r--r-- 1 scott scott  18034 libby.jpg

drwxrw---- 2 scott scott    208 on_floor/

$ ls -l *

-rw-r--r-- 1 scott scott  73786 libby_arrowrock.jpg

-rw-r--r-- 1 scott scott  18034 libby.jpg

by_pool:

-rw-r--r-- 1 scott scott 413929 libby_by_pool_02.jpg

-rwxr-xr-x 2 scott scott  64983 lieberman_pool.jpg

on_floor:

-rw-r--r-- 1 scott scott 218849 libby_on_floor_01.jpg

-rw-r--r-- 1 scott scott 200024 libby_on_floor_02.jpg

$ chgrp -R family *

$ chmod -R 660 *

chmod: ‘by_pool’: Permission denied

chmod: ‘on_floor’: Permission denied

« Permission denied » ? Que s’est-il passé ? Revenez au


tableau 8.2. Si un fichier est exécutable, il peut l’être en
tant que programme. En revanche, un répertoire doit être
exécutable pour que les utilisateurs qui y accèdent puissent
lire ses fichiers et ses sous-répertoires. L’exécution de chmod
-R 660 * a supprimé la permission x pour tous les fichiers et
sous-répertoires. Lorsque chmod doit indiquer ce qu’il a fait, il
ne le peut pas car il n’a pas pu lire le contenu de ces
répertoires puisqu’ils ne sont plus accessibles.
Comment faire alors ? Il n’y a pas de réponse simple.
Vous pouvez exécuter chmod avec un caractère joker
n’affectant que les fichiers d’un type donné, comme :
$ chmod -R 660 *.jpg

Cette commande n’affectant que les fichiers et pas les


répertoires, vous ne devriez plus rencontrer de problème.
Cependant, cela peut rapidement devenir fastidieux si le
répertoire contient des fichiers de plusieurs types, puisque
vous allez être obligé d’exécuter chmod pour chaque type de
fichiers.
Si vous avez de nombreux sous-répertoires dans des
sous-répertoires ou trop de fichiers de types différents pour
que la situation soit gérable, vous pouvez faire preuve
d’intelligence en utilisant la commande find pour rechercher
tous les fichiers qui ne sont pas des répertoires et changer
leur permission. Vous en apprendrez davantage sur cette
commande au chapitre 11.
Faites attention lorsque vous modifiez les autorisations de
façon récursive, car vous risquez de parvenir à des résultats
inattendus et d’empêcher accidentellement l’accès à des
fichiers et des sous-répertoires.

Activer et désactiver la permission suid

chmod u[+-]s

chmod 4[0-7][0-7][0-7]

À la section « Comprendre les bases des permissions », vous


avez découvert les différentes permissions existantes. Nous
nous sommes concentrés jusqu’ici sur r, w et x car ce sont
les plus utilisées, mais il en existe d’autres qui peuvent être
utiles de temps à autre. Jetons un coup d’œil à suid, qui ne
s’applique qu’aux fichiers exécutables, jamais aux
répertoires.
Lorsque suid est activé, un utilisateur peut exécuter un
fichier avec les permissions du propriétaire, comme s’il en
était lui-même propriétaire. Vous pouvez observer suid en
action en analysant les permissions de la commande passwd
qui permet aux utilisateurs de changer leur mot de passe.

$ ls -l /usr/bin/passwd

-rwsr-xr-x 1 root root /usr/bin/passwd

Vous savez que passwd est suid car un s se trouve là où on


s’attend à voir un x. L’utilisateur root est propriétaire de
passwd, mais les utilisateurs ordinaires doivent être autorisés
à exécuter cette commande, sans quoi ils ne pourraient pas
changer seuls leur mot de passe. Pour faire de passwd une
commande exécutable par tout le monde, on pourrait
sélectionner x pour le propriétaire, le groupe et tous les
autres utilisateurs, mais cela ne suffit pas. La solution
consiste à attribuer la permission suid à passwd afin que tout
le monde puisse exécuter cette commande avec les
permissions de l’utilisateur root.

Info
L’activation de suid peut être signalée par un s ou un S. Vous
rencontrerez un s si le propriétaire a déjà les permissions
d’exécution (x) avant l’activation de suid et un S si le propriétaire
ne les avait pas. Le résultat est le même, la distinction
minuscule/majuscule permet simplement de savoir quel était
l’état de l’autorisation avant application de suid.

Pour être honnête, il est peu probable qu’un utilisateur


normal ait besoin d’attribuer la permission suid à un
programme. En réalité, cela peut même constituer une faille
importante à la sécurité ; faites preuve d’une extrême
prudence. Néanmoins, il est bon de connaître cette
possibilité car elle peut servir en de rares occasions.

Astuce
La commande suivante permet de déterminer le nombre de
programmes qui possèdent la permission suid (sur mon serveur,
j’en trouve uniquement 22, ce qui n’est pas très grave) :
$ find / -xdev -perm -4000 -type f -print0 | xargs -0 ls -l |
wc -l

Si vous devez mettre en application la permission suid,


après avoir bien réfléchi aux problèmes de sécurité, vous
pouvez activer et désactiver suid de deux façons : en
utilisant la forme symbolique ou la forme octale. Supposons
que vous, en tant qu’utilisateur root, ayez installé un
programme nommé foobar dont le bit suid doit absolument
être activé. La méthode symbolique fonctionne comme ceci
:

$ ls -l

-rwxr-xr-- 1 root admins foobar

$ chmod u+s foobar

$ ls -l

-rwsr-xr-- 1 root admins foobar

Désormais, toute personne figurant dans le groupe admins


peut exécuter foobar comme si elle était l’utilisateur root. Ce
n’est pas le cas des personnes qui ne sont pas membres de
ce groupe, car elles n’ont que l’autorisation de lecture. S’il
avait été nécessaire d’autoriser l’exécution de foobar en tant
que root pour toutes les personnes ayant accès au système,
les permissions auraient été -rwsr-xr-x.
Pour désactiver suid, il suffit d’utiliser u- à la place de u+.

$ ls -l

-rwsr-xr-- 1 root admins foobar

$ chmod u-s foobar

$ ls -l

-rwxr-xr-- 1 root admins foobar

La configuration de suid avec la méthode octale est un


peu plus complexe, mais uniquement parce qu’elle introduit
un nouvel aspect des permissions numériques déjà utilisées.
Vous vous souvenez que celles-ci sont composées de trois
chiffres. Le premier définit l’autorisation pour le propriétaire,
le deuxième, celle du groupe, et le troisième, celle de tous
les autres utilisateurs. Il arrive qu’on trouve un quatrième
chiffre qui figure à gauche du chiffre de l’autorisation
utilisateur. La plupart du temps, il vaut 0, ce qui fait qu’il ne
nécessite pas d’être configuré, ni affiché. En d’autres
termes, chmod 664 libby.jpg et chmod 0664 libby.jpg
représentent exactement la même chose. On n’utilise ce
quatrième chiffre que lorsque l’on a besoin de modifier
l’autorisation suid (ou sgid ou le sticky bit, comme vous allez
le voir aux sections suivantes).
Le chiffre permettant de configurer suid est 4, vous
pouvez donc modifier le statut des autorisations pour foobar
avec un code analogue à celui qui suit :

$ ls -l

-rwxr-xr-- 1 root admins foobar

$ chmod 4754 foobar

$ ls -l

-rwsr-xr-- 1 root admins foobar

Pour supprimer suid, il suffit d’utiliser 0 qui permet de


restaurer l’autorisation par défaut :

$ ls -l

-rwsr-xr-- 1 root admins foobar

$ chmod 0754 foobar

$ ls -l

-rwxr-xr-- 1 root admins foobar

Astuce
Sachez que suid sera sans effet sur les programmes interprétés,
c’est-à-dire tout script qui commence par #!. En y réfléchissant,
cela constitue un pas important vers une meilleure sécurité.
Pour de plus amples informations, consultez la page
www.faqs.org/faqs/unix-faq/faq/part4/section-7.html.

Activer et désactiver la permission sgid

chmod g[+-]s

chmod 2[0-7][0-7][0-7]
sgid est très semblable à suid. Elle peut s’appliquer aux
fichiers et aux répertoires. Pour les fichiers, sgid équivaut à
suid, sauf qu’un utilisateur peut maintenant exécuter un
fichier avec les permissions du groupe à la place de celles
du propriétaire. Par exemple, la commande crontab sur votre
système est probablement configurée avec sgid, de manière
que les utilisateurs puissent demander à cron d’exécuter des
programmes, mais en tant que membre du groupe crontab
avec sa puissance limitée et non en tant qu’utilisateur root
avec ses super-pouvoirs.

$ ls -l /usr/bin/crontab

-rwxr-sr-x 1 root crontab /usr/bin/crontab

Lorsqu’elle est appliquée à des répertoires, sgid effectue


quelque chose d’intéressant : tous les fichiers créés dans ce
répertoire après l’application de sgid appartiennent au
groupe du répertoire. Un exemple vous aidera à mieux
comprendre.
Imaginons qu’il y ait trois utilisateurs, Alice, Bob et Carol,
membres du groupe admins. Le nom d’utilisateur d’Alice est
alice et son groupe principal est aussi alice, ce qui est
extrêmement fréquent sur les systèmes Linux. Pour Bob et
Carol, l’organisation est la même, leurs noms d’utilisateur et
de groupe sont respectivement bob et carol. Si Alice crée un
fichier dans un répertoire partagé par le groupe admins, le
propriétaire et le groupe de ce fichier seront alice, ce qui
signifie que les autres membres du groupe admins n’auront
pas l’autorisation de modifier le fichier. Bien entendu, Alice
pourrait exécuter chgrp admins document (ou chown :admins
document) après la création du nouveau fichier, mais ce serait
assez fastidieux à la longue.
Si le répertoire partagé est configuré en sgid, tout fichier
créé dans ce répertoire reste la propriété de son créateur,
mais il est automatiquement affecté au même groupe que le
répertoire, c’est-à-dire à admins. Conclusion : Alice, Bob et
Carol peuvent tous lire, modifier et créer dans le répertoire
partagé, et ce sans effort supplémentaire.
Comme on peut s’y attendre, la permission sgid peut être
activée ou désactivée avec une méthode symbolique ou
octale. Dans le premier cas, la syntaxe est la même que
pour suid, sauf qu’on utilise un g à la place du u. Voyons
comment appliquer sgid à un répertoire en gardant à l’esprit
que le processus est identique pour un fichier :

$ ls -lF

drwxr-xr-x 11 scott admins bin/

$ chmod g+s bin

$ ls -lF

drwxr-Sr-x 11 scott admins bin/

Info
L’activation de sgid peut être signalée par un s ou un S. Vous
rencontrerez un s si le groupe avait déjà les permissions
d’exécution (x) avant l’activation de sgid et un S si le groupe ne
les avait pas. Le résultat est le même, la distinction
minuscule/majuscule permet simplement de savoir quel était
l’état de l’autorisation avant application de sgid.

Pour retirer la permission sgid, le processus est inversé :

$ ls -lF

drwxr-Sr-x 11 scott admins bin/

$ chmod g-s bin

$ ls -lF

drwxr-xr-x 11 scott admins bin/

Si vous n’avez pas lu la section précédente, « Activer et


désactiver la permission suid », lisez-la, car elle explique la
raison d’être du mystérieux quatrième chiffre qui précède
les trois représentant les permissions en mode octal. Dans
le cas de suid, ce chiffre est 4 ; dans celui de sgid, c’est 2.
$ ls -lF

drwxr-xr-x 11 scott admins bin/

$ chmod 2755 bin

$ ls -lF

drwxr-Sr-x 11 scott admins bin/

Pour retirer la permission sgid, procédez comme pour


suid, placez un 0 en tête de la série de chiffres, comme ceci
:

$ ls -lF

drwxr-Sr-x 11 scott admins bin/

$ chmod 0755 bin

$ ls -lF

drwxr-xr-x 11 scott admins bin/

Info
Vous savez ce que donne la création d’un nouveau fichier dans
un répertoire sgid, mais d’autres processus du système de
fichiers peuvent également être affectés par sgid. Si vous copiez
un fichier à l’aide de cp dans un répertoire sgid, il adopte le
groupe de ce répertoire. Si vous déplacez un fichier à l’aide de
mv, il conserve son groupe courant. Pour finir, si vous créez un
nouveau répertoire dans un répertoire sgid à l’aide de mkdir, il
hérite du groupe de son répertoire parent et devient sgid lui-
même.

Activer et désactiver le sticky bit

chmod [+-]t

chmod 1[0-7][0-7][0-7]

Sur les premiers systèmes Unix, lorsque le sticky bit était


activé pour un fichier exécutable, le système savait que ce
fichier allait être constamment utilisé et il le conservait dans
la zone de swap afin de pouvoir y accéder rapidement en
cas de nécessité. Linux est un système plus moderne et il
ignore donc le sticky bit lorsqu’il est activé sur des fichiers.
Cela signifie que le sticky bit n’est utilisé qu’avec les
répertoires. Quand il est activé, les utilisateurs ne peuvent
plus supprimer ou renommer les fichiers qui y sont
contenus, à moins d’être le propriétaire du fichier ou celui
du répertoire concerné. Quand il ne l’est pas et que les
utilisateurs ont une autorisation en écriture sur le répertoire,
ils peuvent en supprimer et en renommer tous les fichiers.
Le sticky bit permet d’éviter que cela se produise. Il est
fréquemment activé sur le répertoire /tmp, dans lequel tout
le monde peut écrire, mais dont il protège les fichiers et les
dossiers individuellement.

$ ls -l /

drwxrwxrwt 12 root root 496 tmp

[liste coupée en raison de sa longueur]

Info
L’activation du sticky bit peut être signalée par un t ou un T.
Vous rencontrerez un t si l’ensemble des utilisateurs avait déjà
les permissions d’exécution (x) avant l’activation du sticky bit et
un T s’il ne les avait pas. Le résultat est le même, la distinction
minuscule/majuscule permet simplement de savoir quel était
l’état de l’autorisation avant application du sticky bit.

Le sticky bit peut être activé en utilisant une syntaxe


symbolique ou octale.

$ ls -lF

drwxrwxr-x 2 scott family libby_pix/

$ chmod +t libby_pix

$ ls -lF

drwxrwxr-t 2 scott family libby_pix/

Deux choses peuvent vous intriguer dans cet extrait de


code. Dans les exemples précédents d’utilisation de la
méthode symbolique pour définir les permissions, on
précisait quelle catégorie était affectée par la commande à
l’aide des lettres u, g ou o. Cela n’est pas nécessaire avec le
sticky bit. Un simple +t suffit.
Notez également que le t apparaît à la position qui
correspond à la permission d’exécution pour les « autres
utilisateurs » mais, bien que le répertoire ne soit pas
accessible en écriture pour tous les utilisateurs, les
membres du groupe family peuvent quand même y écrire,
alors que les autres utilisateurs ne peuvent y supprimer des
fichiers à moins d’en être propriétaires.
Le processus de suppression du sticky bit est aussi simple
qu’on peut s’y attendre.

$ ls -lF

drwxrwxr-t 2 scott family libby_pix/

$ chmod -t libby_pix

$ ls -lF

drwxrwxr-x 2 scott family libby_pix/

Pour activer le sticky bit en utilisant la méthode octale, on


fait intervenir un quatrième chiffre, comme nous l’avons vu
aux sections « Activer et désactiver la permission suid » et «
Activer et désactiver la permission sgid ». Pour suid, on
utilise 4, pour sgid, on utilise 2, et pour le sticky bit, on
utilise 1.

$ ls -lF

drwxrwxr-x 2 scott family libby_pix/

$ chmod 1775 libby_pix

$ ls -lF

drwxrwxr-t 2 scott family libby_pix/

Une fois encore, on utilise le 0 pour annuler la permission.

$ ls -lF

drwxrwxr-t 2 scott family libby_pix/

$ chmod 0775 libby_pix

$ ls -lF

drwxrwxr-x 2 scott family libby_pix/

Les répertoires de votre poste de travail sur lequel vous


appliquerez le sticky bit sont rares. En revanche, sur un
serveur, ce type d’autorisation peut être très utile. C’est un
moyen de résoudre certains problèmes de permission qui
seraient autrement insolubles.

Astuce
Pour gagner du temps dans la saisie des commandes, il est
possible de configurer des combinaisons faisant appel à suid, à
sgid et au sticky bit simultanément. De même que vous ajoutez 4
(lecture), 2 (écriture) et 1 (exécution) pour définir une
permission selon la méthode octale, vous pouvez ajouter des
chiffres pour configurer suid, sgid et le sticky bit.

Chiffre Signification
0 Supprime le sticky bit, sgid, et suid
1 Active le sticky bit
2 Active sgid
3 Active le sticky bit et sgid
4 Active suid
5 Active le sticky bit et suid
6 Active sgid et suid
7 Active le sticky bit, sgid et suid

Notez que l’utilisation de 0 supprime le sticky bit, sgid et suid en


une seule opération. Si vous utilisez 0 pour supprimer suid, mais
que vous voulez conserver le sticky bit, vous devrez le réactiver
individuellement.
Conclusion

Les permissions sont vitales pour la sécurité des systèmes


Linux. Même si, au début, tout cela peut sembler un peu
confus, en y réfléchissant un peu, vous vous rendrez compte
qu’il est possible d’utiliser les permissions à votre avantage.
La combinaison de chgrp pour modifier les permissions de
groupe, de chown pour modifier les permissions du
propriétaire (et aussi celles du groupe), et de chmod offre à
Linux une palette d’outils suffisante pour assurer une
gestion efficace des permissions.
Chapitre 9
Archivage et compression
Bien que ce ne soit pas toujours évident dans les
conversations quotidiennes, il y a une différence importante
entre archivage et compression de fichiers. Lors d’un
archivage, on prend dix fichiers pour n’en faire plus qu’un,
sans différence de taille entre la somme des fichiers
individuels et la taille du fichier d’archive. Si on archive dix
fichiers de 100 ko, on se retrouve donc au final avec un seul
fichier de 1 000 ko. En revanche, si l’on compresse ces dix
fichiers, on peut se retrouver avec un fichier de quelques ko
seulement ou avec un fichier dont la taille est proche de
celle d’origine, tout dépend du type de fichier initial et du
mode de compresssion.

Info
Il peut même arriver que le résultat de la compression produise
un fichier plus volumineux que la somme des fichiers à
compresser initialement. Si le fichier est déjà compressé et que
vous le compressiez de nouveau, cette « surcompression »
entraîne une augmentation de sa taille.

Tous les formats d’archive et de compression dont il est


question dans ce chapitre – zip, gzip, bzip2 et tar – sont
répandus, mais le format zip est sans doute le plus connu,
en raison de son usage quasi universel sur Windows et Mac
OS X. Par conséquent, si vous compressez sous ces
systèmes un fichier avec zip, il sera également reconnu par
Linux. Si vous devez envoyer des archives à d’autres
utilisateurs sans connaître le système qu’ils utilisent,
choisissez le format zip.
gzip a été conçu pour être le remplaçant open-source
d’un ancien programme Unix nommé compress. Il existe sur
pratiquement tous les systèmes Unix, y compris Linux et
Mac OS X. En revanche, il est plus rare sous Windows. Si
vous devez transmettre des fichiers à des utilisateurs
travaillant sur un système Unix, vous pouvez opter pour
gzip.
La commande bzip2 est la nouvelle venue. Conçue pour
supplanter gzip, elle permet de créer des fichiers plus petits,
mais au prix d’un temps de compression plus long.
Toutefois, les ordinateurs d’aujourd’hui sont si rapides que la
différence n’est pas notable.

Info
Wikipédia propose un bon article (« List of archive formats »)
qui compare un grand nombre de formats de compression
(http://en.wikipedia.org/wiki/List_of_archive_formats).

zip, gzip et bzip2 sont prévus pour des tâches de


compression (même si zip permet aussi de créer des
archives). La commande tar, quant à elle, n’est destinée
qu’à réaliser des archives – et elle le fait depuis longtemps.
On ne la trouve pratiquement que sur les machines Unix et
vous rencontrerez forcément des fichiers tar (appelés
tarballs) si vous téléchargez du code source – un jour ou
l’autre, tout utilisateur Linux finit par tomber dessus.

Info
Dans cette deuxième édition, j’ai retiré les sections qui
concernaient gzip -[0-9] (qui permet d’ajuster les taux de
compression avec gzip) et bzip2 -[0-9] (qui a la même fonction,
mais avec bzip). Les descriptions originales se trouvent sur mon
site Web (granneman.com/writing/books/linux-phrasebook).
Archiver et comprimer des fichiers avec
zip

zip

Apparu en 1989 et maintenant présent sur la plupart des


systèmes d’exploitation répandus, zip permet d’archiver et
de compresser des fichiers, ce qui peut être utile pour
envoyer plusieurs fichiers en pièce jointe, effectuer des
sauvegardes ou économiser de l’espace disque, par
exemple. Son utilisation est simple. Imaginons que vous
souhaitiez envoyer un fichier TIFF par courrier électronique.
Ce format de fichier est non compressé et pèse
généralement assez lourd. En le zippant, vous devriez
pouvoir réduire sa taille de façon appréciable.

$ ls -lh

-rw-r--r-- scott scott 1006K young_edgar_scott.tif

$ zip grandpa.zip young_edgar_scott.tif

  adding: young_edgar_scott.tif (deflated 19%)

$ ls -lh

-rw-r--r-- scott scott 1006K young_edgar_scott.tif

-rw-r--r-- scott scott 819K grandpa.zip

Dans cet exemple, vous avez réduit la taille du fichier de


200 Ko, soit 19 % comme l’indique gracieusement zip. Pas
mal. On peut faire la même chose pour plusieurs images :

$ ls -l

-rw-r--r-- scott scott  251980 edgar_at_intl_shoe.tif

-rw-r--r-- scott scott 1130922 edgar_baby.tif

-rw-r--r-- scott scott 1029224 young_edgar_scott.tif

$ zip grandpa.zip edgar_at_intl_shoe.tif edgar_baby.tif

➥young_edgar_scott.tif

  adding: edgar_at_intl_shoe.tif (deflated 4%)

  adding: edgar_baby.tif (deflated 12%)

  adding: young_edgar_scott.tif (deflated 19%)

$ ls -l

-rw-r--r-- scott scott  251980 edgar_at_intl_shoe.tif

-rw-r--r-- scott scott 1130922 edgar_baby.tif

-rw-r--r-- scott scott 2074296 grandpa.zip

-rw-r--r-- scott scott 1029224 young_edgar_scott.tif

Il n’est toutefois pas très correct de zipper des fichiers


individuellement de la sorte. Avec trois fichiers, cela ne
prête pas à conséquence : le destinataire recevra grandpa.zip
et récupérera les trois fichiers. En revanche, si l’on avait
compressé 50 fichiers de la sorte, le destinataire se serait
retrouvé avec des fichiers un peu partout. Dans ce cas de
figure, il est préférable de compresser le répertoire qui
contient les 50 fichiers : lorsqu’il décompressera l’archive, le
destinataire obtiendra un joli répertoire contenant les 50
fichiers.

$ ls -lF

drwxr-xr-x scott scott edgar_scott/

$ zip grandpa.zip edgar_scott

  adding: edgar_scott/ (stored 0%)

  adding: edgar_scott/edgar_baby.tif (deflated 12%)

  adding: edgar_scott/young_edgar_scott.tif (deflated 19%)

  adding: edgar_scott/edgar_at_intl_shoe.tif (deflated 4%)

$ ls -lF

drwxr-xr-x scott scott     160 edgar_scott/

-rw-r--r-- scott scott 2074502 grandpa.zip

Que vous souhaitiez compresser un fichier, plusieurs


fichiers ou un répertoire, la syntaxe est la même : la
commande zip suivi du nom du fichier zip à créer, suivi du
ou des éléments à ajouter au fichier zip.

Obtenir la meilleure compression


possible avec zip
zip -[0-9]

Il est possible de choisir le niveau de compression utilisé par


zip. La commande utilise une échelle graduée de 0 à 9 où 0
correspond à « aucune compression » (ce qui équivaut à tar,
comme vous le verrez plus loin), 1 à « compresse le plus vite
possible sans trop te soucier du taux de compression », et
ainsi de suite jusqu’à 9 qui correspond à « compresse au
maximum quel que soit le temps que cela prendra ». La
valeur par défaut utilisée par zip est 6, mais les ordinateurs
récents sont si rapides que vous pouvez utiliser
systématiquement 9.
Supposons que vous vous intéressiez au roman Moby-
Dick de Herman Melville et que vous souhaitiez collecter
différents documents qui vous aideront à comprendre cet
ouvrage : le livre Moby-Dick luimême, Le Paradis perdu de
Milton (Paradise Lost) et le livre de Job. Comparons les
résultats des différents taux de compression.

$ ls -l

-rw-r--r-- scott scott  102519 job.txt

-rw-r--r-- scott scott 1236574 moby-dick.txt

-rw-r--r-- scott scott  508925 paradise_lost.txt

$ zip -0 moby.zip *.txt

  adding: job.txt (stored 0%)


  adding: moby-dick.txt (stored 0%)

  adding: paradise_lost.txt (stored 0%)

$ ls -l

-rw-r--r-- scott scott  102519 job.txt

-rw-r--r-- scott scott 1236574 moby-dick.txt

-rw-r--r-- scott scott 1848444 moby.zip

-rw-r--r-- scott scott  508925 paradise_lost.txt

$ zip -1 moby.zip *txt

updating: job.txt (deflated 58%)

updating: moby-dick.txt (deflated 54%)

updating: paradise_lost.txt (deflated 50%

$ ls -l

-rw-r--r-- scott scott  102519 job.txt

-rw-r--r-- scott scott 1236574 moby-dick.txt

-rw-r--r-- scott scott  869946 moby.zip

-rw-r--r-- scott scott  508925 paradise_lost.txt

$ zip -9 moby.zip *txt

updating: job.txt (deflated 65%)

updating: moby-dick.txt (deflated 61%)

updating: paradise_lost.txt (deflated 56%)

$ ls -l

-rw-r--r-- scott scott  102519 job.txt

-rw-r--r-- scott scott 1236574 moby-dick.txt

-rw-r--r-- scott scott  747730 moby.zip

-rw-r--r-- scott scott  508925 paradise_lost.txt

Récapitulons ces résultats dans un tableau :

Les résultats obtenus vont dépendre du type de fichier


(les fichiers texte se compressent bien, par exemple) et de
la taille des originaux, mais ce tableau donne un ordre de
grandeur utile. Utilisez constamment le niveau de
compression 9 à moins que vous ne travailliez sur une
machine lente ou que vous soyez très impatient.

Info
Pour gagner du temps, créez un alias semblable à celui qui suit
dans votre fichier .bashrc :
alias zip='zip -9'

Ainsi, vous utiliserez toujours le taux de compression le plus


élevé sans même y penser.
Archiver et compresser des fichiers du
type indiqué dans des (sous-)répertoires

zip -i

zip -r

Vous l’avez constaté, le programme zip permet de


compresser des fichiers et des répertoires très facilement.
Qu’en est-il si nous voulons traiter uniquement certains
types de fichiers ? Et si ces fichiers se trouvent dans des
sous-répertoires ? zip permet de répondre à ces deux
besoins ; mais examinons les solutions tour à tour.
Dans les deux cas, nous supposons que la structure des
répertoires est la suivante :

$ ls reading/*

Authors_and_Texts.txt

reading/lovecraft:

Beyond the Wall of Sleep.jpg

Beyond the Wall of Sleep.txt

The Call of Cthulhu.jpg

The Call of Cthulhu.txt

reading/machen:

The Great God Pan.jpg

The Great God Pan.txt

Notez la présence de deux types de fichiers dans le


dossier love-craft : txt et jpg. Pour n’ajouter que les fichiers
txt dans le fichier zip, voici comment procéder :

$ cd reading/lovecraft

$ zip lovecraft.zip . -i \*.txt

  adding: Beyond the Wall of Sleep.txt (deflated 57%)

  adding: The Call of Cthulhu.txt (deflated 58%)

$ ls

Beyond the Wall of Sleep.jpg

Beyond the Wall of Sleep.txt

The Call of Cthulhu.jpg

The Call of Cthulhu.txt

lovecraft.zip

Faites attention à trois points :


• Pour préciser le répertoire où la commande zip doit
débuter, nous utilisons ., c’est-à-dire le répertoire
courant (comme nous l’avons expliqué à la section «
Afficher les fichiers et les répertoires cachés » du
chapitre 2).
• Pour indiquer à zip le type des fichiers que nous
souhaitons inclure, nous employons l’option -i (ou --
include).
• Enfin, pour préciser les fichiers réels, nous avons saisi
\*.txt, ce qui peut ne pas vous paraître correct à
première vue. Pourquoi ne pas indiquer uniquement *.txt
? Il est indispensable d’ajouter la barre oblique inverse
afin que la correspondance soit effectuée par zip, non par
le shell bash.
Cela fonctionne, mais comment pouvons-nous inclure
tous les fichiers txt de tous les sous-répertoires ? Pour cela,
nous devons débuter par le dossier qui se trouve au-dessus
de celui qui contient les fichiers à ajouter :

$ ls -F

reading/

$ zip -r weird_fiction.zip reading/ -i \*.txt

  adding: reading/Authors_and_Texts.txt (deflated 58%)

  adding: reading/Lovecraft/Beyond the Wall of Sleep.txt

➥(deflated 57%)

  adding: reading/Lovecraft/The Call of Cthulhu.txt


(deflated 58%)
    adding: reading/Machen/The Great God Pan.txt
(deflated 60%)
$ ls -F
reading/
weird_fiction.zip

Le changement important se trouve dans l’option -r (ou -


-recursepaths). Elle demande à zip de démarrer au niveau du
répertoire courant et de poursuivre vers le bas dans
l’arborescence qu’elle trouve.
Vous remarquerez également que, au lieu d’utiliser .,
nous avons indiqué reading/ comme point de départ. En
effet, nous voulions que le fichier zip résultant soit placé au
même niveau que le répertoire reading. Si nous avions voulu
que weird_fiction.zip soit placé à l’intérieur de reading, nous
aurions lancé la commande dans ce répertoire de la manière
suivante :
zip -r weird_fiction.zip . -i \*.txt.

Protéger par mot de passe les archives


zip compressées

zip -P

zip -e

Le programme zip permet de chiffrer et de protéger par mot


de passe les archives grâce à l’option -P. Son utilisation est
toutefois fortement déconseillée, car elle n’est pas sûre,
comme le montre l’exemple qui suit (le mot de passe choisi
est 12345678) :
$ zip -P 12345678 moby.zip *.txt
Comme le mot de passe est saisi sur la ligne de
commande, toute personne qui consulte l’historique du shell
(et c’est très facile) pourra le lire en toutes lettres. Évitez
l’option -P !
À la place, utilisez l’option -e, qui chiffre le contenu du
fichier zip et le protège également par un mot de passe.
Dans ce cas, ce sera la commande qui vous demandera de
le saisir : il ne sera donc pas enregistré dans l’historique de
votre shell.
$ zip -e moby.zip *.txt

Enter password:

Verify password:

  adding: job.txt (deflated 65%)

  adding: moby-dick.txt (deflated 61%)

  adding: paradise_lost.txt (deflated 56%)

Le seul élément enregistré dans l’historique est zip -e


moby.zip *.txt. Le mot de passe, lui, n’apparaît nulle part.
Comment extraire le contenu d’une archive protégée par
un mot de passe ? Vous pouvez saisir zip -P mot_de_passe
moby.zip, mais l’idée est plutôt mauvaise, car le mot de
passe sera là encore visible dans l’historique du shell. À la
place, il suffit d’effectuer l’extraction comme dans le cas
d’un fichier normal et, si un mot de passe est requis, il vous
sera demandé de le saisir, sans qu’il soit enregistré dans
l’historique. Plus facile et plus sûr !

Attention
La sécurité offerte par la protection par mot de passe de zip
n’est pas très efficace. Il est facile de trouver sur Internet une
multitude d’outils destinés à cracker les protections par mot de
passe des fichiers zippés. Protéger ou non un fichier zip par mot
de passe revient un peu à choisir entre envoyer une carte
postale ou envoyer une lettre sous enveloppe. La mesure de
protection est efficace avec les gens ordinaires, mais elle
n’arrêtera pas quelqu’un de déterminé.

Il arrive également que la version de zip fournie avec certaines


distributions Linux ne supporte pas le chiffrage. Dans ce cas, le
message « encryption not supported » le signalera. La seule
solution consiste alors à recompiler zip à partir de ses sources.
Ouille !

Dézipper des fichiers


unzip

Extraire le contenu d’une archive zip n’est pas compliqué.


Pour la créer, utilisez la commande zip ; pour extraire son
contenu, utilisez unzip.

$ unzip moby.zip

Archive: moby.zip

  inflating: job.txt

  inflating: moby-dick.txt

  inflating: paradise_lost.txt

La commande unzip indique ce qu’elle fait à mesure


qu’elle le fait. Pour obtenir davantage d’informations, vous
pouvez employer l’option -v (pour « verbeux », bien sûr).

$ unzip -v moby.zip

Archive: moby.zip

Length  Method  Size  Ratio CRC-32   Name

------- ------ ------ ----- ------   ----

 102519 Defl:X   35747  65%  fabf86c9 job.txt

1236574 Defl:X  487553  61%  34a8cc3a moby-dick.txt

 508925 Defl:X  224004  56%  6abe1d0f paradise_lost.txt

-------        ------  ---           -------

1848018        747304  60%           3 files

Ces résultats présentent quelques données utiles, comme


la méthode de compression employée, le ratio de
compression et la vérification de redondance cyclique (CRC)
utilisée pour la correction des erreurs.

Tester un fichier zip

unzip -t
Il arrive que les archives zip soient abîmées. Le pire moment
pour le découvrir est juste après avoir extrait le contenu de
l’archive et l’avoir supprimée, avant de vous rendre compte
que certains des éléments extraits, voire tous, sont
endommagés et ne peuvent pas s’ouvrir. Il est donc
conseillé de tester ses archives avant de les unzipper. Pour
cela, utilisez l’option -t (pour test).

$ unzip -t moby.zip

Archive: moby.zip

    testing: bible/                   OK

    testing: bible/genesis.txt        OK

    testing: bible/job.txt            OK

    testing: moby-dick.txt            OK

    testing: paradise_lost.txt        OK

No errors detected in compressed data of moby.zip.

Si l’intégrité d’un fichier zip vous préoccupe, vérifiez-la


avec l’option -t. Même si cela demande un peu de temps,
pensez à contrôler vos archives, cela peut éviter des
mésaventures fâcheuses par la suite.

Astuce
Pensez également à l’option -l (qui signifie « liste »). Avez-vous
avez oublié quel était le contenu d’un fichier zip ? Souhaitez-
vous vérifier que le fichier dont vous avez besoin se trouve dans
un fichier zip donné ? Vous demandezvous si l’extraction va
créer 100 fichiers dans votre répertoire courant au lieu d’un
répertoire contenant 100 fichiers ? Dans de telles situations,
essayez tout d’abord zip -l !

Archiver et compresser des fichiers avec


gzip

gzip
Par certains aspects, gzip est plus simple d’utilisation que
zip. Avec zip, il faut préciser le nom du fichier zip à créer ;
avec gzip, contentezvous de taper la commande suivie du
nom du fichier à compresser.

$ ls -l

-rw-r--r-- scott scott 508925 paradise_lost.txt

$ gzip paradise_lost.txt

$ ls -l

-rw-r--r-- scott scott 224425 paradise_lost.txt.gz

Info
Nous l’avons indiqué précédemment, il est possible d’indiquer à
la commande zip le niveau de compression souhaité, sur une
échelle de 0 à 9. La commande gzip fonctionne exactement de la
même manière.

Il existe une grosse différence entre zip et gzip. Lorsqu’un


fichier est compressé avec zip, l’original reste intact et vous
disposez du nouveau fichier compressé et du ou des
originaux. Avec gzip, les originaux sont automatiquement
supprimés et ne subsiste que l’archive.
Si vous souhaitez que gzip ne supprime pas l’original,
utilisez l’option -c (ou --stdout ou --to-stdout) afin que gzip
affiche son résultat dans le shell, mais vous devez rediriger
cette sortie vers un autre fichier. Si vous ne le faites pas,
vous obtiendrez quelque chose d’indéchiffrable, comme ceci
:

$ gzip -c paradise_lost.txt

w`

   I

l1l, (3lllli`+llMlS3lt1*f%eyll'[ qll

Dll} d] C%gl   Rl@,rleltrB3+3/ll|*llODQls  BAqnll,Y8*#"]]RU

*blU/ llllGlll't(-llxlYz3-lo'~cnSlK

Pas terrible... À la place, redirigez la sortie vers un fichier


:

$ ls -l

-rw-r--r-- scott scott 508925 paradise_lost.txt

$ gzip -c paradise_lost.txt > paradise_lost.txt.gz

$ ls -l

-rw-r--r-- scott scott 497K paradise_lost.txt

-rw-r--r-- scott scott 220K paradise_lost.txt.gz

C’est beaucoup mieux ! Vous disposez maintenant de


l’original et de la version compressée avec gzip.

Astuce
Si vous utilisez accidentellement l’option -c sans préciser de
fichier de sortie, appuyez sur Ctrl+C plusieurs fois de suite
jusqu’à ce que gzip s’arrête.

Archiver et compresser des fichiers de


façon récursive avec gzip

gzip -r

Si vous souhaitez utiliser gzip avec plusieurs fichiers dans un


répertoire, utilisez un caractère joker. Il se peut toutefois
que cela ne vous permette pas de compresser tous les
fichiers souhaités comme le montre l’exemple qui suit.

$ ls -F

bible/  moby-dick.txt  paradise_lost.txt

$ ls -l *

-rw-r--r-- scott scott 1236574 moby-dick.txt

-rw-r--r-- scott scott  508925 paradise_lost.txt

bible:

-rw-r--r-- scott scott 207254 genesis.txt

-rw-r--r-- scott scott 102519 job.txt

$ gzip *

gzip: bible is a directory -- ignored

$ ls -l *

-rw-r--r-- scott scott 489609 moby-dick.txt.gz

-rw-r--r-- scott scott 224425 paradise_lost.txt.gz

bible:

-rw-r--r-- scott scott 207254 genesis.txt

-rw-r--r-- scott scott 102519 job.txt

Le caractère joker n’a pas permis de traiter les fichiers


contenus dans le répertoire bible car, par défaut, gzip ne
descend pas dans les sous-répertoires. Pour bénéficier de
cette possibilité, il faut utiliser l’option -r (ou --recursive) en
plus du caractère joker.

$ ls -F

bible/  moby-dick.txt  paradise_lost.txt

$ ls -l *

-rw-r--r-- scott scott 1236574 moby-dick.txt

-rw-r--r-- scott scott  508925 paradise_lost.txt

bible:

-rw-r--r-- scott scott 207254 genesis.txt

-rw-r--r-- scott scott 102519 job.txt

$ gzip -r *

$ ls -l *

-rw-r--r-- scott scott 489609 moby-dick.txt.gz

-rw-r--r-- scott scott 224425 paradise_lost.txt.gz

bible:

-rw-r--r-- scott scott 62114 genesis.txt.gz

-rw-r--r-- scott scott 35984 job.txt.gz

Cette fois-ci, tous les fichiers, y compris ceux du sous-


répertoire, ont été compressés. Cependant, chaque fichier a
été compressé individuellement. La commande gzip n’est
pas capable de combiner tous les fichiers en un seul comme
le fait zip. Pour cela, il faut incorporer tar, comme nous le
verrons à la section « Archiver et compresser des fichiers
avec tar et gzip ».

Décompresser des fichiers compressés


avec gzip

gunzip

Pour décompresser les fichiers créés avec gzip, on utilise la


commande gunzip.

$ ls -l

-rw-r--r-- scott scott 224425 paradise_lost.txt.gz

$ gunzip paradise_lost.txt.gz

$ ls -l

-rw-r--r-- scott scott 508925 paradise_lost.txt

De même que gzip supprime le fichier original après sa


compression, gunzip supprime l’archive .gz après sa
décompression. Si vous souhaitez conserver l’archive,
utilisez l’option -c (ou --stdout ou --to-stdout) et redirigez le
résultat vers le fichier à créer.

$ ls -l

-rw-r--r-- scott scott 224425 paradise_lost.txt.gz

$ gunzip -c paradise_lost.txt.gz

> paradise_lost.txt

$ ls -l

-rw-r--r-- scott scott 508925 paradise_lost.txt

-rw-r--r-- scott scott 224425 paradise_lost.txt.gz

Il est conseillé d’utiliser l’option -c, en particulier si vous


souhaitez conserver l’archive ou la transmettre à quelqu’un
après utilisation. Vous pouvez évidemment utiliser gzip et
créer votre propre archive, mais pourquoi se donner autant
de peine ?

Info
Si vous n’aimez pas la commande gunzip, vous pouvez aussi
utiliser gzip -d (ou --decompress ou --uncompress).

Tester un fichier compressé avec gunzip

gunzip -t

Avant de décompresser un fichier à l’aide de gunzip, vous


pouvez vous assurer que tout va se dérouler normalement,
sans problème de corruption de fichier. Pour cela, utilisez
l’option -t (ou --test).

$ gunzip -t paradise_lost.txt.gz

Effectivement, si gzip ne trouve aucun problème avec


l’archive testée, il ne signale rien, tout simplement. Cela
peut sembler un peu déconcertant, mais c’est souvent
comme cela que fonctionnent les systèmes Unix ; ils ne
deviennent bavards qu’en cas de problème.

Info
Vous pouvez également employer l’option -t avec gzip pour
tester une archive au moment où vous la créez.

Archiver et compresser des fichiers avec


bzip2
bzip2

Si vous avez l’habitude de gzip, vous n’aurez aucun mal à


utiliser bzip2 car les créateurs de cette commande ont
calqué ses options et son comportement sur gzip.

$ ls -l

-rw-r--r-- scott scott 1236574 moby-dick.txt

$ bzip2 moby-dick.txt

$ ls -l

-rw-r--r-- scott scott 367248 moby-dick.txt.bz2

Info
Nous l’avons expliqué précédemment, il est possible d’indiquer
aux commandes zip et gzip le niveau de compression souhaité,
sur une échelle de 0 à 9. La commande bzip2 fonctionne
exactement de la même manière.

Comme gzip, bzip2 ne conserve qu’un fichier .bz2 après


compression. Le fichier d’origine, moby-dick.txt, a disparu.
Pour préserver le fichier d’origine, utilisez l’option -k (ou --
keep).

$ ls -l

-rw-r--r-- scott scott 1236574 moby-dick.txt

$ bzip2 -k moby-dick.txt

$ ls -l

-rw-r--r-- scott scott 1236574 moby-dick.txt

-rw-r--r-- scott scott 367248 moby-dick.txt.bz2

Même compressé, Moby-Dick reste un document assez


volumineux. Une bonne chose, le roman est tellement bon !

Décompresser des fichiers compressés


avec bzip2
bunzip2

Pour décompresser un fichier bzip2, on utilise la commande


bunzip2, qui a, comme on peut s’y attendre, un mode de
fonctionnement très proche de gunzip.

$ ls -l

-rw-r--r-- scott scott 367248 moby-dick.txt.bz2

$ bunzip2 moby-dick.txt.bz2

$ ls -l

-rw-r--r-- scott scott 1236574 moby-dick.txt

Vous remarquerez une autre similitude entre bunzip2 et


gunzip : les deux commandes suppriment le fichier
compressé d’origine après sa décompression. Si vous
souhaitez le conserver, utilisez l’option -k (ou --keep),
comme avec bzip2 au moment de la création de l’archive.

$ ls -l

-rw-r--r-- scott scott 367248 moby-dick.txt.bz2

$ bunzip2 -k moby-dick.txt.bz2

$ ls -l

-rw-r--r-- scott scott 1236574 moby-dick.txt

-rw-r--r-- scott scott 367248 moby-dick.txt.bz2

Lorsqu’une commande copie les options et le


comportement d’une autre, elle est plus facile à apprendre.
Si je veux conserver le fichier, j’utilise -k ou --keep. Et voilà,
c’est tout simple !

Info
Si vous n’aimez pas la commande bunzip2, vous pouvez aussi
utiliser bzip2 -d (ou --decompress ou --uncompress).

Tester un fichier compressé avec bzip2


bunzip2 -t

Avant de décompresser un ou des fichiers à l’aide de


bunzip2, vous pouvez contrôler que tout va se dérouler
normalement, sans problème de corruption de fichier. Pour
cela, utilisez l’option t (ou --test).

$ bunzip2 -t paradise_lost.txt.gz

Comme avec gunzip, si bunzip2 ne trouve aucun problème


avec l’archive testée, il ne signale tout simplement rien. Il
ne se montrera bavard que s’il rencontre un problème.

Archiver des fichiers avec tar

tar -cf

Souvenez-vous que tar ne compresse pas, mais se contente


d’archiver. En revanche, tar utilise d’autres programmes,
comme gzip ou bzip2, pour compresser les archives qu’il a
créées. Deux options sont utilisées : -c (ou --create), pour
créer une archive, et -f (ou --file), pour indiquer le nom de
fichier de l’archive.

$ ls -l

-rw-r--r-- scott scott  102519 job.txt

-rw-r--r-- scott scott 1236574 moby-dick.txt

-rw-r--r-- scott scott  508925 paradise_lost.txt

$ tar -cf moby.tar *.txt

$ ls -l

-rw-r--r-- scott scott  102519 job.txt

-rw-r--r-- scott scott 1236574 moby-dick.txt

-rw-r--r-- scott scott 1853440 moby.tar

-rw-r--r-- scott scott  508925 paradise_lost.txt

Prêtez attention à deux choses dans cet exemple. Si vous


faites la somme de la taille des trois fichiers archivés (1 848
018 octets) et que vous la comparez avec la taille de
l’archive, vous constaterez que cette dernière est plus
lourde de 5 422 octets. Souvenez-vous que tar est un outil
d’archivage, non de compression : le résultat obtenu fait
donc au moins la même taille que la somme des fichiers à
archiver. Il faut ajouter à cette somme quelques ko, qui
correspondent aux informations nécessaires à l’organisation
de l’archive. Il faut également remarquer que,
contrairement à gzip et bzip2, tar ne supprime pas les
fichiers d’origine après archivage, ce qui n’est pas étonnant
puisque c’est avant tout un outil de sauvegarde.
L’intérêt de tar est qu’il a été conçu pour archiver des
structures de répertoires, donc un grand nombre de fichiers
et de sous-répertoires, en une seule commande.

$ ls -lF

drwxr-xr-x scott scott     168 moby-dick/

$ ls -l moby-dick/*

-rw-r--r-- scott scott  102519 moby-dick/job.txt

-rw-r--r-- scott scott 1236574 moby-dick/moby-dick.txt

-rw-r--r-- scott scott  508925 moby-dick/paradise_lost.txt

moby-dick/bible:

-rw-r--r-- scott scott  207254 genesis.txt

-rw-r--r-- scott scott  102519 job.txt

$ tar -cf moby.tar moby-dick/

$ ls -lF

drwxr-xr-x scott scott     168 moby-dick/

-rw-r--r-- scott scott 2170880 moby.tar

La commande tar existe depuis toujours, et on comprend


pour-quoi : elle est tellement utile ! Mais elle le devient plus
encore associée aux outils de compression, comme nous le
verrons à la section suivante.

Info
La commande tar a la réputation (quelque peu méritée) d’être
un peu obscure. La bande dessinée géniale xkcd est une bonne
blague aux dépens de tar (http://xkcd.com/1168/).

Archiver et compresser des fichiers avec


tar et gzip

tar -pzcvf

Si vous relisez les sections « Archiver et compresser des


fichiers avec gzip » et « Archiver et compresser des fichiers
avec bzip2 » et que vous y réfléchissez, vous allez sans
doute commencer à identifier un problème. Comment faire
pour compresser un répertoire contenant 100 fichiers
répartis dans divers sous-répertoires ? Si vous utilisez gzip
ou bzip2 avec l’option -r (récursif), vous allez vous retrouver
avec 100 fichiers compressés, chacun étant stocké dans son
sous-répertoire d’origine. Ce n’est sûrement pas ce dont
vous aviez rêvé. Vous imaginezvous attacher 100 fichiers
.gz ou .bz2 en pièces jointes pour envoyer un message ?
C’est là que tar entre en jeu. Commencez par l’utiliser
pour archiver le dossier et son contenu (les 100 fichiers
dans des sous-répertoires), puis compressez l’archive à
l’aide de gzip ou de bzip2. Comme gzip est le programme le
plus fréquemment employé avec tar, c’est sur son cas que
nous allons nous pencher.

$ ls -l moby-dick/*

-rw-r--r-- scott scott  102519 moby-dick/job.txt

-rw-r--r-- scott scott 1236574 moby-dick/moby-dick.txt

-rw-r--r-- scott scott  508925 moby-dick/paradise_lost.txt

moby-dick/bible:

-rw-r--r-- scott scott  207254 genesis.txt

-rw-r--r-- scott scott  102519 job.txt

$ tar -cf moby.tar moby-dick/ | gzip -c > moby.tar.gz

$ ls -l

drwxr-xr-x scott scott 168 moby-dick

-rw-r--r-- scott scott  20 moby.tar.gz

Cette méthode fonctionne, mais elle nécessite beaucoup


de saisie. Il existe une technique plus simple, que je vous
conseille d’adopter. Elle fait intervenir trois nouvelles
options : -p (ou --preserve-permissions ou --same-permissions),
qui garantit la conservation des permissions, -z (ou --gzip),
qui invoque gzip depuis tar pour que vous n’ayez pas à la
faire manuellement, et -v (ou --verbose), qui n’est pas
indispensable, mais qui est souvent pratique, puisqu’elle
permet de savoir exactement ce que fait tar.

$ ls -l moby-dick/*

-rw-r--r-- scott scott  102519 moby-dick/job.txt

-rw-r--r-- scott scott 1236574 moby-dick/moby-dick.txt

-rw-r--r-- scott scott  508925 moby-dick/paradise_lost.txt

moby-dick/bible:

-rw-r--r-- scott scott  207254 genesis.txt

-rw-r--r-- scott scott  102519 job.txt

$ tar -pzcvf moby.tar.gz moby-dick/

moby-dick/

moby-dick/job.txt

moby-dick/bible/

ncompressed 257

moby-dick/bible/genesis.txt

moby-dick/bible/job.txt

moby-dick/moby-dick.txt

moby-dick/paradise_lost.txt

$ ls -l

drwxr-xr-x scott scott    168 moby-dick

-rw-r--r-- scott scott 846049 moby.tar.gz

L’extension classique pour un fichier qui est passé entre


les mains de tar, puis de gzip, est .tar.gz. Vous pouvez
toutefois utiliser .tgz ou .tar.gzip si vous préférez.
Info
Il est possible d’utiliser bzip2 à la place de gzip avec tar. La
commande ressemblera alors à ceci (notez l’option -j propre à
bzip2) :

$ tar -jcvf moby.tar.bz2 moby-dick/

Dans ce cas, l’extension est souvent .tar.bz2, même si vous


pouvez aussi utiliser .tar.bzip2, .tbz2 ou .tbz. (J’éviterais quand
même .tbz, car cette extension n’indique pas clairement si le
fichier été compressé avec gzip ou bzip2, ce qui risque d’amener
une certaine confusion.)

Tester les fichiers à restaurer et à


décompresser

tar -zvtf

Tester une archive permet de savoir si son contenu est


corrompu, mais aussi de connaître la structure des fichiers
archivés et, au final, d’éviter pas mal de mauvaises
surprises. Ce n’est pas la même chose de restaurer un
dossier contenant 100 fichiers que restaurer 100 fichiers
non classés qui vont s’éparpiller un peu partout dans votre
système de fichiers.
Pour tester votre archive (en supposant qu’elle ait été
compressée avec gzip), utilisez l’option -t ou (--test).

$ tar -zvtf moby.tar.gz

drwxr-xr-x scott/scott       0 moby-dick/

-rw-r--r-- scott/scott  102519 moby-dick/job.txt

drwxr-xr-x scott/scott       0 moby-dick/bible/

-rw-r--r-- scott/scott  207254 moby-dick/bible/genesis.txt

-rw-r--r-- scott/scott  102519 moby-dick/bible/job.txt

-rw-r--r-- scott/scott 1236574 moby-dick/moby-dick.txt

-rw-r--r-- scott/scott  508925 moby-dick/paradise_lost.txt

Cette commande permet de connaître les permissions,


les propriétaires, la taille et la date des fichiers. De plus,
comme chaque ligne commence par moby-dick/, vous savez
que tous les fichiers finiront par se retrouver dans un même
répertoire avec des sous-répertoires. La restauration ne
posera donc aucun problème.
L’option -f doit être la dernière indiquée, car elle doit être
suivie du nom du fichier .tar.gz. Dans le cas contraire, tar
manifestera son mécontentement.

$ tar -zvft moby.tar.gz

tar: You must specify one of the ’-Acdtrux’ options

Try ’tar --help’ or ’tar --usage’ for more information.

Maintenant que vous savez que votre fichier .tar.gz n’est


pas corrompu, vous pouvez le restaurer.

Info
Pour tester une archive compressée avec bzip2, utilisez cette
commande :
$ tar -jvtf moby.tar.bz2

Restaurer et décompresser des fichiers

tar -pzvxf

Pour créer un fichier .tar.gz, vous avez utilisé un jeu d’


options : -pzcvf. Pour restaurer et décompresser une
archive, il suffit de remplacer -c (ou --create) par -x (ou --
extract).

$ ls -l

-rw-r--r-- rsgranne rsgranne 846049 moby.tar.gz $

tar -pzvxf moby.tar.gz

moby-dick/

moby-dick/job.txt

moby-dick/bible/

moby-dick/bible/genesis.txt

moby-dick/bible/job.txt

moby-dick/moby-dick.txt

moby-dick/paradise_lost.txt

$ ls -l

drwxr-xr-x rsgranne rsgranne    168 moby-dick

-rw-r--r-- rsgranne rsgranne 846049 moby.tar.gz

Pensez à toujours tester le fichier avant de l’ouvrir (voir la


section précédente). L’ordre des commandes à exécuter est
donc le suivant :
$ tar -zvtf moby.tar.gz

$ tar -pzvxf moby.tar.gz

Info
Si vous souhaitez ouvrir une archive compressée avec bzip2,
utilisez la commande suivante :
$ tar -jxvf moby.tar.bz2

Conclusion

À l’époque des modems RTC et des petits disques durs,


l’archivage et la compression étaient une nécessité.
Aujourd’hui, même si c’est moins indispensable, vous
utiliserez encore fréquemment ces techniques. Si vous avez
déjà chargé des codes source pour les compiler, par
exemple, vous avez très vraisemblablement chargé un
fichier source .tar.gz. À l’avenir, vous rencontrerez sans
doute de plus en plus de fichiers portant l’extension
.tar.bz2. Si vous échangez des fichiers avec des utilisateurs
Windows, vous emploierez le format .zip. Apprenez à
maîtriser les outils d’archivage et de compression car vous
les utiliserez plus souvent que vous ne le pensez.
Chapitre 10
Recherche d’éléments
Chaque année, la capacité de stockage des disques durs
augmente et leur prix baisse. Avec tous les jouets
technologiques que nous utilisons quotidiennement
(caméscope, APN, lecteur MP3…) et tous les films et la
musique que l’on récupère sur Internet, nous avons
largement de quoi remplir nos disques durs. Du coup, il est
souvent difficile ou fastidieux d’y trouver ce que l’on
cherche. Comment localiser une photo de son frère parmi 10
000 clichés ou un article parmi 600 autres documents ?
Heureusement, Linux dispose d’outils de recherche
puissants qui facilitent la localisation de fichiers.

Astuce
Si vous recherchez la commande find, consultez le chapitre
suivant.

Info
Dans la deuxième édition de cet ouvrage, j’ai retiré la section
qui décrivait locate -n (qui permet de fixer le nombre de résultats
retournés par locate). Vous pourrez retrouver ces explications
sur mon site Web (granneman.com/writing/books/linux-
phrasebook).

Effectuer une recherche dans une base


de données des noms de fichiers
locate

Vous connaissez le nom d’un fichier ou une partie de son


nom, mais vous ne savez pas où il se trouve sur votre
système ? C’est à cela que sert locate. Cette commande
permet de rechercher des fichiers, des programmes et des
répertoires en fonction de divers critères. Les résultats qui
coïncident avec les termes de la recherche s’affichent les
uns à la suite des autres dans la console.

Info
Pour gagner de la place, j’ai remplacé la première partie du
chemin /home/ scott par des points de suspension.

$ locate haggard

…/txt/rider haggard

…/txt/rider haggard/Queen of the Dawn.txt

…/txt/rider haggard/Allan and the Ice-Gods.txt

…/txt/rider haggard/Heu-Heu or The Monster.txt

La recherche est rapide car locate n’effectue pas de


recherche en temps réel. Elle effectue en fait une recherche
dans une base de données de noms de fichiers,
automatiquement mise à jour quotidiennement (voir «
Mettre à jour la base de données utilisée par locate », un
peu plus loin). Comme la recherche s’effectue dans une
base de données préexistante, les résultats s’affichent
presque instantanément.
Sur votre ordinateur, vous utilisez sans doute slocate à la
place de locate sans même le savoir, car de nombreuses
distributions créent un lien symbolique de /usr/bin/locate
vers /usr/bin/slocate. La commande slocate (qui signifie
secure locate) est une version plus récente de locate qui
exclut de la recherche les répertoires auxquels l’utilisateur
n’a pas accès (si vous n’êtes pas root, par exemple, le
contenu du répertoire /root ne devrait pas s’afficher avec
une recherche locate). Avant slocate, locate aurait entraîné
de nombreux messages d’erreurs relatifs à des problèmes
de permission. Avec slocate, ces erreurs font partie du
passé.

Info
Les distributions Linux sont toujours plus nombreuses à passer
de slocate à mlocate (qui signifie merging locate) ; vous la
trouverez donc peut-être sur votre ordinateur. Au lieu de
recommencer l’indexation de l’intégralité du disque dur, mlocate
se fonde sur des bases de données existantes afin d’accélérer
les opérations et de ne pas solliciter votre disque dur toutes les
nuits. Puisque mlocate est compatible avec slocate, tout mon
propos la concerne également.

Pour comprendre le fonctionnement de slocate, observez


l’exemple qui suit. Vous constatez que la première
recherche faite en tant qu’utilisateur normal et non en tant
que root échoue. Utilisez su pour devenir root, exécutez de
nouveau locate et bingo ! Le résultat de la recherche
s’affiche (slocate.db est le fichier de données utilisé par
slocate).

$ locate slocate.db

$ su -

# locate slocate.db

/var/lib/slocate/slocate.db.tmp

/var/lib/slocate/slocate.db

Pour l’utilisateur, l’exécution de slocate est transparente


et, puisque sa saisie est plus courte, nous ferons référence à
locate dans cet ouvrage, même si, dans les faits, c’est la
commande slocate qui est mise à contribution.
Effectuer une recherche dans une base
de données de noms de fichiers sans se
préoccuper de la casse

locate -i

À la section précédente, vous avez fait une recherche avec


locate sur le terme haggard afin de localiser votre collection
de nouvelles de H. Rider Haggard. Le résultat obtenu était
semblable à celui-ci :

$ locate haggard

…/txt/rider haggard

…/txt/rider haggard/Queen of the Dawn.txt

…/txt/rider haggard/Allan and the Ice-Gods.txt

…/txt/rider haggard/Heu-Heu or The Monster.txt

Cela a fonctionné, car le répertoire qui renferme les


nouvelles contient le mot haggard. Mais si ce répertoire
avait porté le nom H Rider Haggard, la recherche aurait
échoué car Linux est sensible à la casse (voir le chapitre 1,
« Les commandes : ce qu’il faut savoir »). Grâce à l’option -
i, vous pouvez effectuer des recherches sans vous soucier
de la casse, ce qui permet de localiser les fichiers dont le
chemin contient haggard, Haggard, HAGGARD, HaGgArD et
ainsi de suite.

$ locate -i haggard

…/txt/rider haggard

…/txt/rider haggard/Queen of the Dawn.txt

…/txt/rider haggard/Allan and the Ice-Gods.txt

…/txt/rider haggard/Heu-Heu or The Monster.txt

…/txt/H. Rider Haggard

…/txt/H. Rider Haggard/King Solomons Mines.txt

…/txt/H. Rider Haggard/Allan Quatermain.txt

On trouve maintenant davantage de nouvelles de


Haggard que lors de la première recherche (cela montre
également que j’ai fait preuve de négligence et que j’aurais
dû réunir ces deux répertories en un seul !). Pensez à
utiliser -i pour optimiser vos recherches avec locate, sans
quoi vous risquez de passer à côté de fichiers importants.

Info
Pour plus d’informations sur H. Rider Haggard, consultez les
articles à son sujet sur Wikipédia
(http://fr.wikipedia.org/wiki/Henry_Rider_Haggard).

Mettre à jour la base de données utilisée


par locate

updatedb

Au début du chapitre, vous avez vu que la commande locate


est rapide parce qu’elle fonctionne avec une base de
données contenant tous les noms de fichiers et de
répertoires présents sur votre machine. Lorsqu’elle est
installée, elle est configurée pour s’activer d’elle-même et
analyser le contenu de votre ordinateur pour mettre à jour
sa base de données. Cela se produit généralement la nuit.
Cette mise à jour nocturne est pratique, sauf si vous avez
besoin de rechercher un fichier qui vient d’être copié sur
votre système.
Imaginons, par exemple, que vous soyez en train
d’installer Rootkit Hunter, un programme qui recherche les
rootkits (utilisés par des personnes malintentionnées pour
prendre le contrôle de votre machine) et que vous
souhaitiez accéder aux fichiers que le programme a
installés. La commande locate ne vous sera d’aucune utilité
puisqu’elle n’a pas encore recensé ces fichiers dans sa base
de données. Vous pouvez alors provoquer une mise à jour
forcée de cette base en utilisant la commande updatedb.
Comme cette commande indexe virtuellement tous les
fichiers et les répertoires de votre système, vous devez être
root pour l’exécuter (ou utiliser sudo avec des distributions
telles qu’Ubuntu qui déconseillent l’utilisation de root).

# apt-get install rkhunter

# exit

$ locate rkhunter

$ su -

# updatedb

# exit

$ locate rkhunter

/usr/local/rkhunter

/usr/local/rkhunter/bin

/usr/local/rkhunter/etc

Le code précédent montre que l’on a commencé par


installer rkhunter, le paquetage correspondant à Rootkit
Hunter, puis que l’on a quitté le compte root. On a ensuite
effectué une recherche sur rkhunter, mais sans succès. On
est repassé sous le compte root, on a exécuté updatedb pour
mettre la base de données locate à jour et quitté de
nouveau le compte root. Pour finir, on a relancé la recherche
locate sur rkhunter, cette fois-ci avec succès.
Il faut toutefois savoir que la durée d’exécution de
updatedb est directement liée à la quantité d’éléments
présents sur votre système et à la rapidité de votre
ordinateur. Si vous avez un ordinateur et un disque dur
rapides et peu de fichiers, updatedb sera rapide. Si vous ne
disposez que d’un processeur lent, d’un disque dur
fonctionnant à 5 400 tours/ minute et qu’il contient mille
milliards de fichiers, la mise à jour de la base de données va
prendre du temps. Pour connaître le temps requis, vous
pouvez utiliser la commande qui suit :
# time updatedb

Lorsque updatedb achève son travail, time indique combien


de temps il lui a fallu. C’est une information utile à connaître
si vous devez réutiliser updatedb alors que vous êtes pressé.

Info
Si vous utilisez la nouvelle commande mlocate, updatedb sera plus
rapide que dans le cas d’une actualisation avec slocate, car elle
exploite des bases de données existantes. Si votre distribution
se fonde sur slocate, la commande updatedb équivaut totalement à
slocate -u et updatedb n’est qu’un lien vers slocate. Ce n’est pas le
cas pour la commande updatedb fournie avec mlocate ; cette version
de updatedb est un programme distinct.

Rechercher des motifs dans des fichiers


texte

grep

La commande locate permet de rechercher des noms de


fichiers ou de répertoires, mais elle ne permet pas
d’effectuer des recherches dans des fichiers. Pour cela, vous
pouvez utiliser grep. Son fonctionnement est simple, vous lui
indiquez un motif à rechercher, un ou des fichiers (ou même
un disque dur entier) sur lesquels effectuer cette recherche
et vous n’avez qu’à attendre le résultat.

$ grep pain three_no_more_forever.txt

all alone and in pain

Dans cet exemple, on utilise grep pour rechercher le mot


pain dans un fichier contenant le poème « Three no more
forever » de Peter Von Zer Muehlen. Le mot pain se trouvant
dans ce fichier, grep affiche la ligne qui le contient. Mais
comment faire lorsqu’on souhaite effectuer des recherches
sur plusieurs fichiers ? Heureusement, les caractères jokers
sont là.

$ grep pain *

fiery inferno in space.txt:watch the paint peel,

three_no_more_forever.txt:all alone and in pain

the speed of morning.txt:of a Chinese painting.

8 hour a day.txt:nice paint job too

ghost pain.txt:Subject: ghost pain

Notez que grep recherche la chaîne pain sous toutes ses


formes, y compris dans paint et dans painting. Remarquez
également la présentation des résultats : grep affiche le nom
de chaque fichier contenant la chaîne recherchée, puis la
ligne de texte qui contient cette chaîne. Jusqu’à présent, la
recherche avec grep a été aisée ; il est temps de compliquer
les choses.

Les bases de la recherche de motifs dans


les fichiers texte

Nous venons de voir que grep pouvait rechercher un motif


dans un ensemble de fichiers texte. Il est temps de
comprendre ce que représentent ces motifs pour effectuer
des recherches plus complexes. Ils sont construits grâce à
l’un des outils les plus puissants de Linux, les expressions
régulières ou regexp. Pour exploiter grep au maximum, vous
devez maîtriser les expressions régulières. Toutefois, comme
elles méritent qu’on leur consacre un livre entier, nous n’en
présenterons ici que les bases.

Astuce
Pour en apprendre plus sur les expressions régulières, vous
pouvez faire des recherches sur Internet ou lire Expressions
régulières de Bernard Desgraupes (ISBN : 9782744022531,
Pearson).

Une des choses qui peut prêter à confusion lorsqu’on


s’initie à grep est que cette commande existe en plusieurs
versions, comme le montre le tableau 10.1.
Tableau 10.1 Les différentes versions de grep
Interprète la chaîne comme Options de la Commande
commande séparée
Expression régulière de base grep -G (ou -- grep
basic-regexp)

Expression régulière étendue grep -E (ou -- egrep


extended-regexp)

Liste de chaînes fixes, chacune grep -F (ou -- fgrep


pouvant être recherchée fixed-strings)

Expression régulière Perl grep -P (ou --perl- Non


regexp) applicable

Pour résumer, grep seule fonctionne avec des expressions


régulières de base, tandis que l’option -E (ou --extended-
regexp) ou la commande egrep reconnaissent les expressions
régulières étendues. grep -F (ou --fixed-strings) ou la
commande fgrep permettent de rechercher plusieurs
termes. Pour finir, grep -P (ou --perl-regexp) permet aux
amateurs de Perl d’utiliser leur langage favori pour
construire des expressions régulières.

Info
Sauf mention contraire, nous utiliserons dans ce livre la version
de grep qui utilise les expressions régulières de base.

Il faut éclaircir quelques points avant d’aller plus loin. Si


vous n’êtes pas à l’aise avec l’un ou l’autre, servez-vous des
ressources proposées pour mieux les comprendre.
Les caractères jokers ne sont pas l’équivalent des
expressions régulières. Si tous les deux utilisent le caractère
*, celui-ci a des significations totalement différentes dans
les deux cas. Alors que certains caractères (? ou *, par
exemple) sont utilisés en tant que caractères jokers pour
indiquer une substitution, les mêmes caractères dans les
expressions régulières sont utilisés pour indiquer combien
de fois un caractère doit figurer dans la chaîne à trouver.
Avec les caractères jokers, le ? dans c?t, par exemple,
remplace n’importe quel caractère, ce qui fait que la chaîne
recherchée peut être cat, cot ou cut, mais pas ct. Avec les
expressions régulières, le ? dans c[a-z]?t signifie que les
caractères a à z peuvent figurer une ou zéro fois dans la
chaîne, ce qui fait qu’elle peut être équivalente à cat, cot,
cut mais aussi à ct. L’astérisque, employé dans c[a-z]*t,
signifie « un nombre quelconque de lettres ». Autrement dit,
ce motif correspondra non seulement à cat, cot et cut, mais
également à chart, cooooooot et c is less than t, et à ct.

Astuce
Pour en apprendre davantage sur les différences entre
caractères jokers et expressions régulières, consultez les
articles suivants : « What is a Regular Expression »
(http://docs.kde.org/stable/en/kdeutils/KRegExpEditor/whatIsAR
egExp.html), « Regular Expressions Explained »
(http://www.castaglia.org/proftpd/doc/contrib/regexp.html), «
Wildcards Gone Wild » (http://www.linux-mag.com/2003-
12/power_01.html) et « Expression régulière » sur Wikipédia
(https://fr.wikipedia.org/wiki/Expression_régulière).

Une autre source de confusion potentielle sont les


caractères spéciaux utilisés dans les expressions régulières
de grep. La chaîne [a-e], par exemple, définit une plage
indiquant que les caractères a, b, c, d ou e, peuvent faire
partie de la chaîne. Lorsqu’on utilise [ ou ] avec grep, il faut
préciser au shell si ces caractères sont là pour définir une
plage d’une regexp ou s’ils font partie des mots recherchés.
Les caractères spéciaux auxquels il faut prêter attention
sont les suivants :
. ? [ ] ^ $ | \

Pour finir, il existe une grosse différence entre l’utilisation


des apostrophes simples et doubles dans les expressions
régulières. Les apostrophes simples (' et ') indiquent au
shell que l’on recherche une chaîne de caractères, alors que
les apostrophes doubles (" et ") servent à indiquer que l’on
souhaite utiliser une variable du shell. Par exemple,
l’utilisation de grep dans le code qui suit pour rechercher
toutes les occurrences de « hey you! » dans un texte ne
fonctionne pas.

$ grep hey you! *

grep: you!: No such file or directory

8 hours a day.txt:hey you! let's run!

friends & family.txt:in patience they wait

speed of morning.txt:they say the force

Comme on a simplement écrit hey you! sans l’entourer de


quoi que ce soit, grep se trompe. Elle commence par
rechercher le terme hey dans un fichier nommé you!, mais
sans succès puisque cela ne correspond à aucun nom de
fichier existant. Elle cherche ensuite hey dans tous les
fichiers du répertoire courant, comme l’indique le caractère
* et trouve trois résultats. Il est vrai que le premier résultat
contient bien la phrase recherchée et l’on pourrait dire que
la recherche a fonctionné, mais ce n’est pas réellement le
cas ; ici, c’est plutôt une question de chance. Essayons avec
une autre technique.
Cette fois-ci, utilisons des apostrophes doubles autour
des mots à rechercher. Cela devrait suffire à résoudre le
problème.

$ grep "hey you!" *

bash: !" *: event not found

De fait, c’est encore pire. Les guillemets n’ont fait


qu’aggraver la situation. Que s’est-il passé ? Le symbole !
est une commande du shell qui se réfère à l’historique des
commandes. En principe, on l’utilise, suivi d’un identifiant
représentant une commande exécutée précédemment,
comme !264. Ici, le shell rencontre le caractère ! et s’attend
à trouver un identifiant à la suite. Il signale donc qu’il n’a pu
trouver une commande nommée “ * (apostrophe double,
espace, astérisque).
Les guillemets signifient que vous utilisez des variables
de shell dans votre recherche, ce qui n’est pas du tout ce
que vous comptiez faire initialement. Les apostrophes
doubles ne fonctionnant pas, essayons avec des simples.

$ grep 'hey you!' *

txt/pvzm/8 hours a day.txt:hey you! let’s run!

Voilà qui est mieux. Les apostrophes simples indiquent à


grep que vous ne souhaitez pas utiliser des variables de shell
mais simplement trouver une chaîne de caractères. Vous
vous retrouvez donc avec un seul résultat, ce qui est
conforme à ce que vous vouliez.
Conclusion ? Apprenez à utiliser les apostrophes simples
ou doubles, ou à ne rien utiliser du tout ! Si vous cherchez
une chaîne précise, utilisez des apostrophes simples. Si
vous souhaitez intégrer des variables du shell dans votre
recherche (ce qui arrivera rarement), utilisez des
apostrophes doubles. Si vous recherchez un terme unique
constitué exclusivement de lettres et de chiffres, vous
pouvez totalement omettre les apostrophes. Si vous voulez
être tranquille, utilisez systématiquement des apostrophes
simples, y compris autour des mots uniques – cela ne peut
pas faire de mal.
Rechercher récursivement du texte dans
des répertoires

grep -R

Alors que le caractère joker * permet d’effectuer une


recherche sur plusieurs fichiers dans le même répertoire,
l’option -R (ou --recursive) permet de rechercher dans
plusieurs sous-répertoires à la fois. Recherchons le mot
hideous (hideux), l’un des préférés des auteurs fantastiques
de la fin du xixe et du début du xxe siècle (les résultats sont
largement tronqués, comme tout fan de Lovecraft le
constatera !).

$ grep -R hideous *

Machen/The Great God Pan.txt:know, not in your most fantastic,

➥hideous dreams can you have

Machen/The Great God Pan.txt:hideously contorted in the entire

➥course of my practice

Lovecraft/Beyond the Wall of Sleep.txt:some hideous but


unnamed

➥wrong, which

Lovecraft/Beyond the Wall of Sleep.txt:blanket over the


hideous

➥face, and awakened the nurse.

Lovecraft/The Call of Cthulhu.txt:hideous a chain. I think


that

➥the professor, too, intended to

Lovecraft/The Call of Cthulhu.txt:voodoo meeting; and so


singular

➥and hideous were the rites

Astuce
Bien entendu, si les résultats sont trop nombreux, vous pouvez
les rediriger vers la commande less :
$ grep -R hideous * | less
Une autre solution consiste à rediriger le résultat de la
commande vers un fichier texte, puis d’ouvrir ce dernier dans
l’éditeur de votre choix :
$ grep -R hideous * > hideous_in_horror.txt
Cela permet de stocker le résultat d’une recherche pour pouvoir
le réutiliser par la suite.

Si vous êtes un programmeur ayant besoin d’un outil de


recherche plus puissant que grep, tournez-vous vers ack
(betterthangrep.com). Oui, son nom vient bient de Bill the Cat !

Rechercher des termes et mettre en


exergue les résultats

grep --color=auto

Les indices visuels sont une bonne chose, notamment au


travers de la couleur qui peut vraiment faire ressortir
certains éléments. Si vous recherchez des mots avec grep,
l’ajout de l’option --color=auto peut vous aider à les
retrouver rapidement et facilement (ce livre n’étant pas
imprimé en couleur, j’ai mis en gras les mots sinon colorés
dans les résultats) :

$ grep -R hideous *

Machen/The Great God Pan.txt:know, not in your most fantastic,

➥hideous dreams can you have

Machen/The Great God Pan.txt:hideously contorted in the entire

➥course of my practice

Lovecraft/Beyond the Wall of Sleep.txt:some hideous but


unnamed

➥wrong, which

Lovecraft/Beyond the Wall of Sleep.txt:blanket over the


hideous

➥face, and awakened the nurse.

Lovecraft/The Call of Cthulhu.txt:hideous a chain. I think


that

➥the professor, too, intended to

Lovecraft/The Call of Cthulhu.txt:voodoo meeting; and so


singular

➥and hideous were the rites

Vous le constatez, il est très facile de repérer les mots,


car grep les a mis en exergue pour nous !

Astuce
Il est possible que grep affiche des couleurs sans que vous ayez
ajouté l’option --color=auto. Par exemple, sur mon système
Ubuntu, j’ai obtenu les résultats suivants (les mots en gras
correspondent aux mots colorés) :
$ grep Finny family.txt

My son’s name is Finny.

$ grep --color=auto Finny family.txt

My son’s name is Finny.

Que s’est-il passé ? J’ai soupçonné Ubuntu d’avoir configuré grep


pour qu’il utilise --color=auto par défaut. Pour le vérifier, j’ai
exécuté la commande suivante ; mon intuition était bonne :
$ type grep

grep is aliased to ‘grep --color=auto’

Nous l’avons expliqué à la section « Découvrir comment une


commande sera interprétée » du chapitre 4, type indique
comment bash va interpréter une commande. Dans mon cas, grep
était un alias. Si vous pensez qu’une commande fait l’objet
d’alias, utilisez type.

Rechercher du texte dans un fichier en


ignorant la casse

grep -i
Par défaut, les recherches conduites avec grep sont
sensibles à la casse. Dans l’exemple précédent, vous avez
recherché le mot hideous dans les nouvelles de Lovecraft
(son préféré, sans doute). Mais qu’en est-il avec le mot
Hideous ?

$ grep Hideous Lovecraft/*

Lovecraft/The Whisperer in Darkness.txt: them. Hideous though


the

➥idea was, I knew…

La précédente recherche sur le mot hideous avait donné


463 résultats, alors que Hideous n’en renvoie qu’un.
Comment combiner les deux recherches ? Avec l’option -i
(ou --ignore-case), bien sûr, qui permet d’ignorer la casse et
de trouver HiDeOuS, HIDEOUS ou toute autre combinaison
possible.

$ grep -i hideous h_p_lovecraft/*

Lovecraft/The Call of Cthulhu.txt:voodoo meeting; and so


singular

➥and hideous were the rites

Lovecraft/The Call of Cthulhu.txt:stated, a very crude bas-


relief

➥of stone, comprising a hideous

Lovecraft/The Whisperer in Darkness.txt: them. Hideous though


the

➥idea was, I knew…

Gardez à l’esprit que cette option augmente la quantité


de résultats obtenus. Si cela devient problématique,
appliquez l’astuce de la section précédente.

Rechercher uniquement des mots


complets dans des fichiers
grep -w

Revenons à l’exemple de la section « Les bases de la


recherche de motifs dans les fichiers texte ». Vous aviez
recherché le mot pain, et grep avait renvoyé une liste
recensant toutes les utilisations de ce mot.

$ grep pain *

fiery inferno in space.txt:watch the paint peel,

three_no_more_forever.txt:all alone and in pain

the speed of morning.txt:of a Chinese painting.

8 hour a day.txt:nice paint job too

ghost pain.txt:Subject: ghost pain

Par défaut, grep recherche toutes les occurrences de la


chaîne de caractères pain et affiche toutes les lignes qui
contiennent pain, mais aussi paint et painting. Si les mots
painless, Spain ou painstaking avait été présents dans l’un
des fichiers consultés, les lignes correspondantes seraient
également apparues. Pour n’afficher que les lignes
contenant exactement le mot pain, utilisez l’option -w (ou --
word-regexp).

$ grep -w pain *

three_no_more_forever.txt:all alone and in pain

ghost pain.txt:Subject: ghost pain

Cette option peut vous aider à réduire le champ de vos


recherches lorsque vous obtenez trop de réponses.

Afficher les numéros des lignes dans


lesquelles figurent les mots recherchés

grep -n
La commande grep affiche la ligne qui contient le terme de
la recherche, mais elle n’indique pas réellement où se
trouve ce terme dans le fichier. Pour afficher le numéro de la
ligne qui contient le ou les mots recherchés, utilisez l’option
-n (ou --line-number).

$ grep -n pain *

fiery inferno in space.txt:56:watch the paint peel,

three_no_more_forever.txt:19:all alone and in pain

the speed of morning.txt:66:of a Chinese painting.

8 hour a day.txt:78:nice paint job too

ghost pain.txt:32:Subject: ghost pain

Maintenant que vous connaissez les numéros des lignes


où se trouve le terme recherché, il est plus facile d’y
accéder directement à l’aide de n’importe quel éditeur de
texte.

Rechercher des mots spécifiques dans la


sortie d’autres commandes

[commande] | grep

La commande grep est puissante lorsqu’elle est utilisée


seule, mais elle devient particulièrement intéressante
lorsqu’on l’utilise comme filtre pour la sortie d’autres
commandes. Imaginons, par exemple, que vous ayez des
MP3 de John Coltrane classés en sous-dossiers, un par
album (ce qui fait 66 sous-dossiers en tout… sacrément
prolifique, ce Coltrane !). Le nom de chaque sous-dossier
commence par la date d’enregistrement de l’album. Un
listing partiel pourrait ressembler à ceci (l’option -l est
utilisée avec ls de manière à n’afficher qu’un résultat par
ligne) :
$ ls -1

1956 Coltrane For Lovers

1957 Blue Train

1957 Coltrane [Prestige]

1957 Lush Life

1957 Thelonious Monk With John Coltrane

[liste coupée]

Pour n’afficher que les albums de Coltrane enregistrés en


1960, redirigez le résultat de ls -l vers grep et vous
obtiendrez la réponse souhaitée en un clin d’œil.

$ ls -1 | grep 1960

1960 Coltrane Plays The Blues


1960 Coltrane’s Sound

1960 Giant Steps

1960 My Favorite Things

En y réfléchissant un peu, vous trouverez des dizaines


d’utilisations similaires pour grep. En voici une autre. La
commande ps permet de lister les processus en cours
d’exécution. L’option -f demande à ps d’afficher un listing
détaillé avec de nombreuses informations sur chaque
processus. L’option -U suivie d’un nom d’utilisateur permet
de restreindre le résultat aux processus appartenant à cet
utilisateur. En principe, ps -fU scott devrait donc afficher une
liste très longue, trop longue pour pouvoir y repérer un
processus donné. Avec grep, vous pouvez aisément limiter le
nombre de résultats affichés.

Info
Pour gagner de la place, j’ai supprimé certaines informations en
principe affichées par ps.

$ ps -fU scott | grep firefox

scott 17623 /bin/sh /opt/firefox/firefox

scott 17634 /opt/firefox/firefox-bin

scott 1601 grep firefox

La commande ps liste tous les processus appartenant à


scott (64 au total), mais la sortie est filtrée par grep, ce qui
permet de ne conserver que les lignes contenant firefox.
Malheureusement, la dernière ligne est erronée : seules les
informations sur le programme Firefox nous intéressent, pas
la recherche de firefox avec grep, qui est aussi un processus
en soi. Pour la masquer, essayez ceci :

$ ps -fU scott | grep [f]irefox

scott 17623 /bin/sh /opt/firefox/firefox

scott 17634 /opt/firefox/firefox-bin

Le terme de recherche passé à grep utilise maintenant


des crochets pour définir une plage d’expression régulière
allant de f à f. Elle permet donc de trouver toutes les
occurrences de firefox dans la sortie de la commande ps,
mais elle n’affichera pas la ligne correspondant à grep car le
terme de la recherche est [f]irefox, ce qui ne coïncide pas
avec la recherche menée. La commande grep ne peut être
incluse dans la recherche ps -ef | grep [f]irefox car elle
contient les caractères [ et ] alors que la recherche sur
[f]irefox ne correspond qu’au mot firefox exactement. C’est
un peu confus à première vue, mais en y réfléchissant un
peu, ça prend un sens.

Astuce
Si vous vous sentez vraiment paresseux, consultez la commande
pgrep, qui regroupe les fonctions de ces derniers paragraphes en
un seul outil.

Afficher le contexte des mots trouvés

grep [-ABC]
Lorsqu’on traite des données, le contexte est important.
Comme vous l’avez vu, grep affiche la ligne qui contient les
termes trouvés lors d’une recherche. Si vous le souhaitez,
vous pouvez également lui demander d’afficher des lignes
avant et après les lignes contenant une occurrence des
termes recherchés. À la section « Rechercher des mots
spécifiques dans la sortie d’autres commandes », vous avez
utilisé grep pour afficher une liste d’albums de John Coltrane.
L’un d’eux était A Love Supreme. Quels sont les trois albums
qui ont été enregistrés avant celuici ? C’est très simple : il
suffit d’utiliser l’option -B (ou --before-context=#).

$ ls -1 | grep -B 3 "A Love Supreme"

1963 Impressions

1963 John Coltrane & Johnny Hartman

1963 Live At Birdland

1964 A Love Supreme

Si vous voulez savoir quels sont les trois albums qui ont
été enregistrés après A Love Supreme, utilisez l’option -A
(ou --after-context-#).

$ ls -1 | grep -A 3 "A Love Supreme"

1964 A Love Supreme

1964 Coltrane’s Sound

1964 Crescent

1965 Ascension

Pour obtenir le contexte complet de cet enregistrement,


utilisez l’option -C (ou --context=#) qui combine -A et -B.

$ ls -1 | grep -C 3 "A Love Supreme"

1963 Impressions

1963 John Coltrane & Johnny Hartman

1963 Live At Birdland

1964 A_Love Supreme

1964 Coltrane's Sound

1964 Crescent1965 Ascension

Le résultat peut être confus lorsqu’on trouve plus d’une


occurrence du terme recherché dans un même fichier ou
dans un groupe de fichiers. Coltrane, par exemple, a
enregistré plusieurs albums live. Si vous souhaitez connaître
les albums enregistrés juste avant et juste après ceux-ci, le
résultat va être plus complexe.

$ ls -1 | grep -C 1 Live

1963 John Coltrane & Johnny Hartman

1963 Live At Birdland

1964 A Love Supreme

--

1965 Last Trane

1965 Live in Seattle

1965 Major Works of John Coltrane

--

1965 Transition

1966 Live at the Village Vanguard Again!

1966 Live in Japan

1967 Expression

1967 Olatunji Concert Last Live Recording 1967 Stellar Regions

Les caractères -- séparent les groupes d’occurrences. Les


deux premiers groupes de résultats ne posent pas de
problème : on trouve un album avec le mot Live dans son
titre, un album enregistré avant et un enregistré après. En
revanche, le décryptage de la dernière section est un peu
plus complexe. Plusieurs albums dont le titre contient le mot
Live figurent à la suite les uns des autres, les résultats sont
donc regroupés. Cela peut sembler étrange, mais si vous
observez chaque occurrence du mot Live, vous constaterez
qu’il y a bien un album avant et un après.
Les résultats seront plus clairs encore si vous passez
l’option -n, qui ajoute les numéros des lignes (comme vous
avez utilisé ls -1, il s’agit du numéro de ligne du listing ls).

$ ls -1 | grep -n -C 1 Live

37-1963 John Coltrane & Johnny Hartman

38:1963 Live At Birdland

39-1964 A Love Supreme

--

48-1965 Last Trane

49:1965 Live in Seattle

50-1965 Major Works of John Coltrane

--

52-1965 Transition

53:1966 Live at the Village Vanguard Again!

54:1966 Live in Japan

55-1967 Expression

56:1967 Olatunji Concert Last Live Recording

57-1967 Stellar Regions

L’option -C permet d’obtenir davantage d’informations à


propos de chaque ligne grâce au caractère qui suit le
numéro de ligne. Le symbole : signifie que la ligne est celle
qui contient l’occurrence recherchée, tandis que le symbole
- désigne une ligne située avant ou après l’occurrence
recherchée. La ligne 54, 1966 Live in Japan, joue un double
rôle : elle est située après 1966 Live at the Village Vanguard
Again! et devrait donc afficher le symbole -, mais elle
contient aussi une occurrence du terme recherché et devrait
donc afficher un symbole :. Le fait de contenir une
occurrence du terme recherché prévalant sur celui d’être
placé avant ou après une autre occurrence, elle affiche donc
le symbole :.

Afficher les lignes ne contenant pas les


mots

grep -v

Dans le monde du jazz, John Coltrane règne encore près de


40 ans après sa mort. De même, Led Zeppelin est reconnu
comme l’un des meilleurs groupes de rock de tous les
temps. Led Zeppelin a enregistré neuf albums dont la
plupart des titres contiennent le nom du groupe (les puristes
diront que leur quatrième album n’a pas vraiment de titre,
mais les critiques s’accordent pour le baptiser Led Zeppelin
IV ). Comment faire pour afficher la liste des albums de Led
Zep (représentés par des dossiers de MP3) ne contenant pas
les mots Led Zeppelin dans leur titre ? Avec l’option -v (ou --
invert-match), vous pouvez afficher tous les résultats ne
correspondant pas aux termes recherchés.

$ ls -1

1969 Led Zeppelin

1969 Led Zeppelin II

1970 Led Zeppelin III

1971 Led Zeppelin IV

1973 Houses Of The Holy

1975 Physical Graffiti

1976 Presence

1979 In Through The Out Door

1982 Coda

$ ls -1 | grep -v "Led Zeppelin"

1973 Houses Of The Holy

1975 Physical Graffiti

1976 Presence

1979 In Through The Out Door

1982 Coda

Grâce à l’option -v, vous pouvez affiner votre recherche


de manière à n’afficher que ce dont vous avez réellement
besoin.

Afficher la liste des fichiers contenant les


mots recherchés

grep -l
La commande grep affiche la liste des lignes qui contiennent
le terme recherché. Parfois, au lieu des lignes, on préfère
connaître le nom des fichiers qui contiennent cette
occurrence. À la section « Rechercher du texte dans un
fichier en ignorant la casse », vous aviez recherché les
lignes des nouvelles de Lovecraft contenant le mot hideous.
Grâce à l’option -l (ou --files-with-matches), vous pouvez
afficher la liste des fichiers et non des lignes (n’oubliez pas
que l’option -i permet de ne pas tenir compte de la casse).

$ grep -il hideous Lovecraft/*

Lovecraft/The Call of Cthulhu.txt

Lovecraft/From Beyond.txt

Lovecraft/The Case of Char les Dexter Ward.txt

[liste coupée]

Ce type de résultat est particulièrement utile lorsqu’il est


combiné avec d’autres commandes. Si vous souhaitez
imprimer la liste des nouvelles de Lovecraft contenant le
mot hideous, par exemple, vous pouvez combiner grep avec
lpr (pour de plus amples informations sur lpr, recherchez-la
sur mon site Web, www.granneman.com).

$ grep -il hideous Lovecraft/* | lpr

Gardez à l’esprit que cette commande imprime une liste


de nouvelles et non les nouvelles elles-mêmes (pour cela, il
y a une astuce : elle consiste à utiliser cat).

Afficher le nombre d’occurrences des


mots dans des fichiers

grep -c
Le mystique et poète britannique du xviiie siècle William
Blake a déclaré à propos du poème de Milton Le Paradis
perdu qu’il était « du parti du diable sans le savoir ».
Autrement dit, le personnage de Satan dans Le Paradis
perdu était beaucoup plus intéressant que celui de Dieu.
Pour participer pleinement au débat autour du commentaire
de Blake, vous devez lire de nombreux ouvrages, en
commençcant bien sûr par Le Paradis perdu (ce que j’ai fait
lorsque je préparais un doctorat sur la littérature
britannique du xviie siècle).
Nous n’avons pas assez de temps pour que tout le monde
fasse ses lectures, mais nous pouvons néanmoins contribuer
à la discussion, quoique de manière limitée. Utilisons
l’option -c (ou --count) de grep pour savoir combien de fois
Milton utilise les mots « Satan » et « Dieu » dans Le Paradis
perdu.

$ grep -c Satan "Paradise Lost.txt"

12

$ grep -c God "Paradise Lost.txt"

327

Seulement 12 mentions de Satan dans Le Paradis perdu ?


Ce n’est pas possible. Ce n’est pas le récit que je me
souviens avoir lu. Attendez une seconde… il a été écrit au
xviie siècle, à une époque où l’utilisation des majuscules
était beaucoup plus libre. Essayons la recherche sans tenir
compte de la casse :

$ grep -ci Satan "Paradise Lost.txt"

72

$ grep -ci God "Paradise Lost.txt"

329

Cela semble plus juste ! Si l’on en croit le comptage des


mots, Milton n’est peut-être pas si « du parti du diable » que
cela (et vlan ! William Blake).
Info
L’option -c indique en fait le nombre de lignes dans lesquelles
un mot apparaît, non le nombre réel d’occurrences de ce mot.
En d’autres termes, si vous recherchez le mot « hideous », une
ligne comme « The old hideous man was hideously hideous »
donnera un compte de 1, non de 3.

Rechercher des mots dans le résultat


d’une recherche

grep | grep

Comment faire pour obtenir la liste des albums de Coltrane


sortis au cours des deux dernières années de sa carrière.
Simple :

$ ls -1 | grep 196[6-7]

1966 Live at the Village Vanguard Again!

1966 Live in Japan

1967 Expression

1967 Olatunji Concert Last Live Recording

1967 Stellar Regions

La plage [6-7] permet de réduire la recherche aux années


1966-1967. Mais comment faire si l’on souhaite exclure de
cette liste ses albums live (ce qui serait criminel) ? Voici
comment procéder :

$ ls -1 | grep 196[6-7] | grep -v Live

1967 Expression

1967 Stellar Regions

L’option -v (que vous avez découverte à la section «


Afficher les lignes ne contenant pas les mots ») permet de
supprimer les lignes contenant le mot Live, mais la chose
réellement intéressante ici est la façon dont on redirige la
sortie de ls -l vers grep 196[6-7], puis la sortie de ce filtre
vers une seconde instance de grep avec l’option -v pour
exclure le mot Live. On obtient ainsi exactement ce que l’on
cherchait – la liste des albums de Coltrane sortis entre 1966
et 1967 et qui ne sont pas des live. C’est ça, la puissance de
la ligne de commande de Linux.

Conclusion

Ce chapitre a présenté deux commandes que vous utiliserez


fréquemment : locate et grep. Si elles permettent toutes les
deux de rechercher des informations, elles procédent
différemment. La commande locate recherche des noms de
fichiers en utilisant une base de données de noms de
fichiers pour aller plus vite. grep examine en temps réel le
contenu des fichiers pour trouver les termes recherchés.
Même si ces deux fonctionnalités sont intéressantes, elles
ne suffisent plus lorsqu’il s’agit d’effectuer des recherches
dans un système de fichiers. Dans le chapitre qui suit, vous
allez découvrir l’une des commandes les plus puissantes et
universelles de Linux, qui complète parfaitement le tandem
locate/grep : la commande find.
Chapitre 11
La commande find
Au chapitre précédent, nous avons présenté des
commandes permettant de rechercher des fichiers (locate)
et des données dans ces fichiers (grep). La troisième
commande de ce triumvirat est find. Alors que locate
effectue des recherches dans une base de données de
fichiers, ce qui est rapide mais dépend de l’actualisation de
la base de données, find permet d’effectuer des recherches
à la volée sur les critères de votre choix. Comme find doit
parcourir l’arborescence des fichiers, elle est plus lente que
locate mais permet de réaliser des choses sinon impossibles
avec celle-ci.
Au cours de ce chapitre, nous effectuerons des
recherches sur des fichiers stockés sur un disque dur
externe contenant de la musique et monté sur /media/music.
Sachez que les noms des fichiers comprennent des espaces,
ce qui justifie l’emploi des guillemets dans différentes
commandes. Vous allez voir que find permet de conduire
des recherches de différentes manières.

Info
Dans la deuxième édition de cet ouvrage, j’ai retiré les
informations sur find -fprint (qui imprime les résultats de la
commande find dans un fichier). Vous les retrouverez sur mon
site Web (granneman.com/writing/books/linux-phrasebook).

Trouver des fichiers en fonction de leur


nom
find -name

Sous sa forme élémentaire, find permet de rechercher des


fichiers en fonction de leur nom ou d’une partie de leur nom
(d’où l’option -name). Par défaut, find est récursive et effectue
ses recherches dans des structures de répertoires.
Recherchons dans le disque dur externe les MP3 du groupe
The Shaggs :

$ cd /media/music

$ find . -name Shaggs

./Outsider/Shaggs

find a trouvé le dossier, mais pas les fichiers


correspondant aux morceaux car nous n’avons pas utilisé de
caractères jokers : il a donc recherché les fichiers nommés
exactement Shaggs. Un seul élément porte ce nom précis, le
répertoire qui contient les morceaux (comme un répertoire
n’est qu’un fichier de type particulier, il est pris en compte
dans la recherche).
On doit donc utiliser des caractères jokers pour localiser
les fichiers mais, pour que le shell ne les interprète à son
propre profit, il faut placer le terme de recherche entre
apostrophes. Essayons de nouveau :

$ find . -name "*Shaggs*"

./Outsider/Shaggs

./Outsider/Shaggs/Gimme Dat Ting (Live).mp3

./Outsider/Shaggs/My Pal Foot Foot.mp3

./Outsider/Shaggs/I Love.mp3

./Outsider/Shaggs/You’re Somethin’ Special To Me.mp3

./Outsider/Shaggs/Things I Wonder.mp3

Cette fois, on trouve le répertoire et les fichiers qu’il


contient.
Info
Sans le savoir, vous avez utilisé une autre option, -print, qui
demande à find d’afficher le résultat de la recherche sur la
console. L’option -print étant activée par défaut, il n’est pas
nécessaire de l’inclure.

Un autre aspect important de find est que le format


d’affichage des résultats dépend du chemin utilisé par la
recherche. Dans l’exemple précédent, nous avions utilisé un
chemin relatif, le résultat s’affichait donc avec des chemins
relatifs. Que se serait-il passé si, à la place, on avait utilisé
un chemin absolu commençant par / ?

$ find / -name "*Shaggs*"

/media/music/Outsider/Shaggs

/media/music/Outsider/Shaggs/Gimme Dat Ting (Live).mp3

/media/music/Outsider/Shaggs/My Pal Foot Foot.mp3

/media/music/Outsider/Shaggs/I Love.mp3

/media/music/Outsider/Shaggs/You're Somethin' Special To


Me.mp3

/media/music/Outsider/Shaggs/Things I Wonder.mp3

Si vous formulez votre recherche avec un chemin relatif,


les réponses sont affichées avec des chemins relatifs ; si
vous la formulez avec un chemin absolu, les réponses sont
affichées avec des chemins absolus. Nous réutiliserons ce
principe plus loin ; gardez-le en tête.

Info
Pour en savoir plus sur The Shaggs, faites une recherche avec «
Shaggs » sur www.allmusic.com. Vous n’avez jamais vécu de
soirée réussie si vous n’avez pas passé au moins une fois My Pal
Foot Foot au cours de l’une d’elles.

Rechercher des fichiers en fonction du


propriétaire
find –user

find -group

Vous pouvez aussi effectuer une recherche en fonction du


propriétaire des fichiers. Vous souhaitez trouver tous les
fichiers appartenant à scott sur le disque contenant de la
musique ? Utilisez find avec l’option -user suivie du nom de
l’utilisateur (ou du numéro d’utilisateur que vous trouverez
dans /etc/passwd) :
$ find . -user scott

Ouh la ! Il y a beaucoup trop de résultats. Peut-être


serait-il plus simple de rechercher les fichiers qui
n’appartiennent pas à scott. Pour cela, placez un ! en face
de l’option dont vous souhaitez inverser le fonctionnement :

$ find . ! -user scott

./Punk/Stooges/Fun House/01 Down on the Street.mp3

$ ls -l "Punk/Stooges/Fun House/01 Down on the Street.mp3"

gus music ./Punk/Stooges/Fun House/01 Down on the Street.mp3

Un morceau de The Stooges appartient à gus et non à


scott. Souvenez-vous que l’option ! peut être assimilée à un
opérateur NOT (pour, par exemple, « trouver les fichiers dont
le propriétaire n’est pas scott »).
Si vous souhaitez à la place rechercher les fichiers qui
appartiennent un groupe précis, utilisez simplement l’option
-group, suivie du nom ou du numéro du groupe. Sur le disque
externe, scott pourrait être le propriétaire et music, le
groupe. Voyons si des fichiers n’appartiennent pas au
groupe music :

$ find . ! -group music

./Disco/Brides of Funkenstein/Disco to Go.mp3

./Disco/Sister Sledge/He’s The Greatest Dancer.mp3

./Disco/Wild Cherry/Play That Funky Music.mp3

./Electronica/New Order/Substance/11 - Bizarre Love


Triangle.mp3

Seuls quatre, parmi un grand nombre de fichiers, ne se


trouvent pas dans le groupe music. Vous remarquerez que
nous avons de nouveau utilisé le symbole ! pour exprimer «
trouver les fichiers qui ne sont pas détenus par le groupe
music ».

Rechercher des fichiers en fonction de


leur taille

file -size

Parfois, il peut être utile de rechercher des fichiers en


fonction de leur taille. Pour préciser cette information,
utilisez l’option -size suivie d’une lettre représentant le type
d’unité choisie. Si vous ne saisissez pas cette lettre, la
recherche sera effectuée avec l’unité par défaut, qui est un
nombre de blocs de 512 octets. Il est donc plus simple
d’utiliser un suffixe définissant l’unité de mesure en termes
plus classiques, comme au tableau 11.1.

Tableau 11.1 Rechercher des fichiers en fonction de leur taille


Suffixe Signification
b Blocs de 512 octets (unité par défaut)
c Octets
k Kilo-octets (ko)
M Mégaoctets (Mo)
G Gigaoctets (Go)
Info
À strictement parler, et même si la page de manuel de find
mentionne des kilo-octets, mégaoctets et gigaoctets, ces
termes sont erronés (voir la section « Afficher les premiers
octets, kilo-octets ou mégaoctets d’un fichier » du chapitre 6).
Un grand nombre de programmes les emploient encore, mais ils
ne sont plus exacts. Pour de plus amples informations à ce
propos, consultez la page https://fr.wikipedia.org/wiki/Octet.

Imaginons que vous souhaitiez trouver tous les titres de


plus de 10 Mo dans l’immortel album London Calling des
Clash (oui, je les ai encodés en très haute qualité). Cette
tâche est aisée grâce à find :

$ cd Punk/Clash/1979_London_Calling

$ find . -size 10M

./07 - The Right Profile.mp3

./08 - Lost In The Supermarket.mp3

./09 - Clampdown.mp3

./12 - Death Or Glory.mp3

Quatre fichiers seulement ? C’est bizarre... Lorsque vous


indiquez 10M à find, il recherche les fichiers dont la taille fait
exactement 10 Mo (en arrondissant bien sûr). Si vous
recherchez les fichiers de plus de 10 Mo, placez le symbole +
avant de préciser la taille ; si vous cherchez les fichiers de
moins de 10 Mo, placez le symbole - avant la taille.

$ find . -size +10M

./03 - Jimmy Jazz.mp3

./15 - Lover’s Rock.mp3

./18 - Revolution Rock.mp3

Houston, nous avons un problème... Si nous utilisons la


syntaxe 10M, nous n’obtenons que les fichiers dont la taille
fait précisément 10 Mo en excluant ceux qui sont plus gros.
Si nous utilisons la syntaxe +10M, nous ne trouvons que ceux
qui font plus de 10 Mo, ce qui exclut les fichiers dont la taille
est exactement 10 Mo. Comment faire pour que le résultat
affiche les deux ? Consultez pour cela la section « Afficher
un résultat lorsque l’une des expressions est vraie (OR) »,
un peu plus loin.

Astuce
Si vous souhaitez trouver de gros fichiers texte, placez un c
après la taille. Comme le montre le tableau 11.1, l’option c
correspond à une unité en nombre d’octets. Chaque caractère
dans un fichier texte est un octet, un moyen mnémotechnique
consiste donc à associer c au mot caractère.

Si vous souhaitez rechercher d’énormes fichiers texte, vous


pouvez utiliser ce code :
$ find /home/scott/documents -size 500000c

Rechercher des fichiers en fonction de


leur type

find -type

Une des options les plus utiles de find est -type car elle
permet d’indiquer le type d’élément recherché. Souvenez-
vous que, dans un système UNIX, tout est fichier (voir la
section « Tout est fichier » du chapitre 1, « Les commandes :
ce qu’il faut savoir »), vous pouvez donc préciser le type de
fichier que vous souhaitez trouver. Le tableau 11.2 les
énumère tous.

Tableau 11.2 Rechercher des fichiers en fonction de leur type


Lettre Signification
f Fichier classique
d Répertoire
l Lien symbolique
b Fichier spécial en mode bloc
c Fichier spécial en mode caractère
p FIFO (Firstin First Out)
s Socket

Supposons que vous ayez besoin d’une liste de toutes les


versions de la chanson « Come Fly With Me » de Frank
Sinatra présentes sur le disque music. Vous pouvez
commencer par cette suite de commandes (les résultats ont
été tronqués ; ils sont en réalité au nombre de 14) :

$ cd "Jazz - Vocal/Frank Sinatra"

$ find . -name "*Come Fly With Me*"

./1962 Live In Paris/26 - Come Fly With Me.mp3

./1957 Come Fly With Me

./1957 Come Fly With Me/01 - Come Fly With Me.mp3

./1966 Sinatra At The Sands/01 - Come Fly With Me.mp3

Prêtez attention au deuxième résultat. Il s’agit d'un


répertoire pour l’album de 1957 intitulé « Come Fly With Me
». Puisque seuls les fichiers nous intéressent, non les
répertoires, nous devons utiliser -type f pour limiter les
résultats aux fichiers :

$ find . -name "*Come Fly With Me*" -type f

./1962 Live In Paris/26 - Come Fly With Me.mp3

./1957 Come Fly With Me/01 - Come Fly With Me.mp3

./1966 Sinatra At The Sands/01 - Come Fly With Me .mp3

Cette liste est utile, mais, comme le nom du répertoire de


chaque album commence par l’année de sortie, nous
pouvons être plus précis en effectuant un tri par année :

$ find . -name "*Come Fly With Me*" -type f | sort

./1957 Come Fly With Me/01 - Come Fly With Me.mp3

./1962 Live In Paris/26 - Come Fly With Me.mp3

./1966 Sinatra At The Sands/01 - Come Fly With Me.mp3

L’utilisation d’un tube pour filtrer une liste produite par


find peut être très utile ; plus vous travaillerez avec find,
plus vous rencontrerez ce type de code.

Rechercher des fichiers en fonction de la


date

find -amin|-cmin|-mmin

find -atime|-ctime|-mtime

find -anewer|-cnewer|-newer|-newerXY

Jusqu’à présent, nous avons utilisé find pour rechercher des


fichiers en fonction de leur nom, de leur propriétaire, de leur
taille et de leur type. La commande find est également
capable de les rechercher en fonction des dates associées,
de différentes manières.
Par exemple, une fois, j’ai dû retrouver tous les fichiers
d’un répertoire et de ses sous-répertoires qui dataient de
plus de quatre heures. Avec find, aucune difficulté :
$ find . -mmin +240

Cette commande signifie « recenser tous les fichiers qui


ont été modifiés depuis plus de 240 minutes ». Pour
employer find de cette manière, nous devons, en général,
préciser une valeur numérique, qui peut être exprimée de
trois manières (voir le tableau 11.3).

Tableau 11.3 Argument numérique pour la recherche de fichiers en


fonction de la date
Valeur numérique Signification
+n Supérieur à n
-n Inférieur à n
n Égal à n

La valeur n peut être le nombre de minutes ou le nombre


d’heures, en fonction du test choisi. Certains tests employés
par find se fondent sur la date à laquelle les fichiers ont été
consultés, à laquelle ils ont ont été changés ou à laquelle ils
ont été modifiés. On pourrait croire que ces tests sont
synonymes, mais, pour votre système Linux, ces opérations
sont très différentes.
• La consultation signifie que le contenu a été lu, mais
que rien n’a été modifié, comme avec less.
• Le changement signifie que les métadonnées (ou l’état
du fichier) a été altéré, non son contenu, comme avec
chmod, chown, link et rename.
• La modification signifie que les données ont été
altérées, par exemple à l’aide d’un éditeur.

Astuce
Vous pouvez voir tout cela vous-même sur n’importe quel fichier
de votre système Linux en exécutant la commande stat sur ce
fichier (seule les résultats pertinents sont donnés, mais sachez
que stat fournit de nombreuses informations très utiles) :
$ stat foobar.txt

Access: 2013-04-14 16:57:24.768011000 -0500

Modify: 2012-12-01 22:27:24.424000023 -0600

Change: 2012-12-01 22:27:24.424000023 -0600

Puisque nous connaissons à présent les différences entre


l’accès, la modification et le changement, passons aux tests
disponibles avec find. Leur regroupement logique dans le
tableau 11.4 devrait faciliter leur compréhension. N’oubliez
pas que la valeur n dans ce tableau peut être tout argument
numérique décrit au tableau 11.3.
Tableau 11.4 Tests pour la recherche des fichiers en fonction de la date
Test Signification
Minutes
-amin n Accès il y a n minutes
-cmin n État changé il y a n minutes
-mmin n Données modifiées il y a n minutes
Heures (les fractions de jour sont ignorées)
-atime n Accès il y a n x 24 heures
-ctime n État changé il y a n x 24 heures
-mtime n Données modifiées il y a n x 24 heures

Info
Vous vous demandez peut-être pourquoi l’heure de la création
ne dispose pas de son test. La raison en est simple : le noyau
Linux n’assure pas le suivi des dates de création des fichiers.

Pour découvrir les fichiers auxquels on a accédé il y a


plus de 45 minutes, il suffit d’utiliser -amin +45.
Pour connaître ceux dont l’état a été changé dans les
derniers 24 heures, optez pour -ctime 0. (Puisque find ignore
les fractions de jour et puisque nous voulons moins d’une
journée, nous devons indiquer 0 – oui, c’est déroutant.)
Qu’en est-il de ces fichiers dont les données ont été
modifiées entre deux et quatre jours ? Pour ceux-là, utilisez
-mtime +2 -a -mtime +4. (Nous effectuons un ET entre les
expressions, comme nous le verrons à la section « Afficher
un résultat lorsque plusieurs expressions sont vraies (AND)
».) Vous obtiendrez probablement des fichiers qui ont été
modifiés le jour précédent, mais ils peuvent être retirés avec
grep -v (voir la section « Afficher les lignes ne contenant pas
les mots » au chapitre 10). N’oubliez pas que -atime, -ctime
et -mtime utilisent n × 24 heures à partir de l’heure courante.
Vous devez donc vous attendre à des résultats assez larges.

Info
find reconnaît d’autres expressions fondées sur la date, mais
nous n’avons pas assez de place pour les décrire. Puisque l’une
d’elles correspondra peut-être à vos besoins, consultez la page
de manuel pour les descriptions de -anewer, -cnewer, -newer et -
newerXY.

Afficher un résultat lorsque plusieurs


expressions sont vraies (AND)

find -a

Avec find, il est possible d’utiliser plusieurs options


simultanément pour améliorer la précision des recherches.
Vous pouvez lier autant d’options que nécessaire grâce à -a
(ou -and). Par exemple, pour retrouver la chanson « Let It
Bleed » des Rolling Stones, vous pouvez utiliser simplement
-name “*Let It Bleed*”, mais cela ne fonctionnera pas
nécessairement, car les Stones ont également enregistré un
album intitulé Let It Bleed. Nous devons donc faire une
distinction entre les fichiers et les répertoires.

$ cd Rolling_Stones

$ find . –name "*Let It Bleed*" -a –type f

./1972 More Hot Rocks/17 - Let It Bleed.mp3

./1995 Stripped/08 - Let It Bleed.mp3

./1969 Let It Bl eed/5 - Let It Bleed.mp3

Voila qui est plus intéressant, mais combien de morceaux


des Stones y a-t-il sur le disque dur ? Redirigez le résultat de
find vers wc (qui signifie word count, ou nombre de mots, et
décrite à la section « Dénombrer les mots, les lignes et les
caractères dans un fichier » du chapitre 7) accompagnée de
son option -l qui permet d’obtenir le nombre de lignes à la
place du nombre de mots :

$ cd Rolling_Stones

$ find . -name "*mp3*" -a -type f | wc -l

1323

Mille trois cent vingt-trois morceaux des Stones, voilà de


quoi s’occuper pendant un moment.

Afficher un résultat lorsque l’une des


expressions est vraie (OR)

find -o

À la section « Rechercher des fichiers en fonction de leur


taille », nous avons vu que nous pouvions utiliser find pour
afficher la liste des morceaux de l’album London Calling,
dont la taille faisait exactement 10 Mo, puis ceux dont la
taille excédait 10 Mo. En revanche, nous ne disposions
d’aucun moyen pour afficher la combinaison de ces deux
critères. Nous venons de voir qu’il était possible d’utiliser -a
pour combiner des options avec l’opérateur logique AND (ET)
Vous pouvez également employer -o pour combiner des
options avec l’opérateur logique OR (OU).
Pour trouver les morceaux de n’importe quel album des
Clash dont la taille est supérieure ou égale à 10 Mo, il suffit
donc d’utiliser la commande qui suit :

$ cd Clash

$ find . -size +10M -o -size 10M

./1977 The Clash/01 - Clash City Rockers.mp3

./1977 The Clash/13 - Police And Thieves.mp3

./1979 London Calling/15 - Lover’s Rock.mp3

./1979 London Calling/18 - Revolution Rock.mp3

./2007 The Sandinista Project/04 - Jason Ringenberg - Ivan


Meets

➥G.I. Joe.m4a

./1980 Sandinista!/01 - The Magnificent Seven.mp3

./1980 Sandinista!/02 - Hitsville U.K.mp3

[liste largement coupée en raison de sa longueur]

Ici, on trouve également dans les résultats des morceaux


qui proviennent de The Sandinista Project, un album de
reprises de chansons des Clash, qui ne nous intéresse pas.
Nous devons donc exclure les morceaux de l’album The
Sandinista Project et utiliserons pour cela un symbole !
devant l’expression (voir à la section « Rechercher des
fichiers en fonction du propriétaire »).
Mais quelle expression ? Pour exclure The Sandinista
Project, vous pourriez penser ajouter ! -name "*Project*" à la
fin de la commande, ce qui donnerait find . -size +10M -o -
size 10M ! -name "*Project". Mais cela ne fonctionne pas, pour
plusieurs raisons.
-name n’est pas correct, car cette option examine
uniquement le nom de fichier réel en ignorant tout ce qui
vient avant le symbole / dans le nom. Puisque le nom que
nous souhaitons exclure (Project) est un répertoire -name ne
le verra jamais. Nous devons employer à la place -wholename,
qui recherche l’intégralité du chemin, y compris le nom du
fichier.
Le deuxième problème vient de la structure de la
commande. Nous avons deux expressions réunies par un OU
et une autre expression pour wholename. Afin que le OU
s’applique aux deux expressions pertinentes, nous devons
les entourer de parenthèses (comme dans un calcul !).
Toutefois, il faut protéger les parenthèses par une barre
oblique inverse (\) afin que le shell les interprètes
correctement. Nous devons également ajouter des espaces
avant et après l’instruction pour qu’elle fonctionne.

$ find . \( -size +10M -o -size 10M \) -a ! -wholename


"*Project*"

./1977 The Clash/01 - Clash City Rockers.mp3

./1977 The Clash/13 - Police And Thieves.mp3

./1979 London Calling/15 - Lover’s Rock.mp3

./1979 London Calling/18 - Revolution Rock.mp3

./1980 Sandinista!/01 - The Magnificent Seven.mp3

./1980 Sandinista!/02 - Hitsville U.K.mp3

The Sandinista Project est un très bon album, mais seuls


les morceaux des Clash joués par les Clash m’intéressent.
Grâce à la commande find, je suis satisfait.

Info
Pour en apprendre davantage sur l’album London Calling des
Clash, consultez les sites Allmusic
(www.allmusic.com/album/london-callingmw0000189413) ou
Wikipédia (https://fr.wikipedia.org/wiki/London_Calling).

Nous pouvons également utiliser -o pour déterminer


combien de morceaux sont stockés sur le disque music.
Commençons par cette commande que nous exécuterons
depuis la racine de /media/music, et qui exploite -a (patience,
vous utiliserez bientôt -o) :

$ find . -name "*mp3" -a -type f | wc -l

105773

Cent cinq mille ? C’est faux. Mais bien sûr, la recherche


ne porte que sur les MP3, or le disque contient des fichiers
au format M4A. Recherchons tous les fichiers mp3 et M4A et
comptons le résultat avec wc -l :

$ find . \( -name "*mp3" -o -name "*.m4a" \) -a -type f | wc -


l

106666

C’est mieux, mais il y a aussi des fichiers FLAC ; ajoutons


un autre -o à la formule :

$ find . \( -name "*mp3" -o -name "*.m4a*" -o -name "*.flac"


\)

➥-a -type f | wc -l

109709

Cette fois-ci, le compte est bon ; presque cent dix mille


fichiers, et ce n’est qu’un début !

Info
Dans l’édition précédente de cet ouvrage, je disposais des
fichiers et des formats suivants :
23 407 mp3
0 m4a
18 224 ogg (je n’en ai plus)
556 flac
Cela faisait au total 42 187 morceaux. J’ai clairement été très
actif depuis !

Afficher un résultat lorsqu’une


expression est fausse (NOT)

find -n

Nous avons déjà utilisé ! pour inverser une expression (voir


« Rechercher des fichiers en fonction du propriétaire » et «
Afficher un résultat lorsque l’une des expressions est vraie
(OR) »), mais voyons maintenant cet opérateur plus en
détail. Nous nous sommes servis de find précédemment
pour compter le nombre de fichiers mp3, m4a, ogg et flac
présents sur le disque externe, mais combien y a-t-il de
fichiers en tout sur ce disque ? Une commande find très
simple va nous apporter la réponse.

$ find . | wc -l

122255

Bien… 122 255 fichiers en tout, mais si j’ai 109 709


fichiers mp3, m4a ou flac (comme je l’ai découvert à la
section précédente), à quoi correspondent les 12 546 autres
? Créons une commande find qui exclut les fichiers mp3,
m4a et flac, ainsi que les répertoires. Ces quatre conditions
doivent être placées entre parenthèses et précédées de !
pour indiquer l’inversion de ces critères. Nous voulons
trouver les fichiers qui ne sont ni des mp3, ni des m4a, ni
des flac, ni des répertoires :

$ find . ! \( -name "*mp3" -o -name "*m4a" -o-name "*flac" -o

➥-type d \)

./Rock - Folk/Band/1970 Stage Fright/Art/Cover.png

./Rock - Folk/Bob Dylan/2007 Dylan Hears a Who/Art/Cover.jpg

./Rock - British Blues/Rolling Stones/1973 0908 Wembley,


London/

➥Info.txt

./Classical - Opera/Puccini/Turandot/1972 Sutherland,


Pavarotti,

➥Caballe/Libretto.pdf

./Rock - Pop/ABBA/1993 Abba Gold Greatest Hits/01 - Dancing

➥Queen.MP3

./Rock/Neil Young/1970 0301 Tea Party, Boston/Info.htm

./Rock - Punk/Clash/2007 The Sandinista Project/Booklet.pdf

./Jazz - Vocal/Frank Sinatra/1963 The Concert Sinatra/07 -


This

➥Nearly Was Mine.Mp3

[liste coupée en raison de sa longueur]

Nous avons une réponse ou, du moins, un début de


réponse. Nous avons donc des fichiers PDF, des fichiers
texte, des fichiers HTML et des fichiers dont l’extension est
MP3 au lieu de mp3 (il y a aussi des gif, des jpg et des
vidéos). La commande find, comme toutes les commandes
Linux, est sensible à la casse. Une recherche sur "*mp3*" ne
fait donc pas apparaître les fichiers dont l’extension est
MP3. Y a-t-il un moyen rapide de modifier l’extension de ces
fichiers pour qu’ils affichent la bonne extension en
minuscules ? Bien sûr, et nous allons utiliser find pour cela.

Astuce
L’expression -name est sensible à la casse, contrairement à
l’expression -iname (le « i » signifie « insensible »). Par
conséquent, si nous voulons trouver tous les fichiers mp3 quelle
que soit la casse de l’extension, nous pouvons exécuter find . -
iname "*mp3*", qui trouvera tous les fichiers qui se terminent par
mp3, MP3, Mp3 ou mP3.

Exécuter une commande sur tous les


fichiers trouvés

find -exec

Découvrons maintenant la vraie puissance de find : vous


pouvez exécuter des commandes sur les fichiers trouvés.
Après avoir énuméré les options qui permettent de réduire
le champ des recherches, comme -name, -type ou -user,
ajoutez -exec suivi des commandes que vous souhaitez
exécuter sur chaque fichier. Utilisez les symboles { } pour
représenter tous les fichiers et terminez votre commande
par un anti-slash (\) pour protéger le point-virgule afin que
le shell ne l’interprète pas comme une indication de
chaînage de commandes (voir le chapitre 5, « Création de
blocs de commandes »).
Dans l’exemple précédent, nous avions découvert que
certains fichiers portaient l’extension MP3. Comme nous
préférons afficher les extensions en minuscules, nous allons
convertir toutes les occurrences de MP3 en mp3 afin
d’homogénéiser l’organisation des fichiers. Pour parvenir à
nos fins, nous allons nous servir de l’option -exec de find.
Commençons par vérifier que des fichiers se terminent bien
par MP3 (bien entendu, nous n’affichons que quelques-uns
des résultats) :

$ find . -name "*MP3"

./Blues - Delta/Robert Johnson/1990 Complete Recordings/29 -

➥Malted Milk.MP3

./Blues - Delta/Robert Johnson/1990 Complete Recordings/16 -

➥Dead Shrimp Blues.MP3

./Blues - Delta/Robert Johnson/1990 Complete Recordings/11 -

➥Terraplane Blues.MP3

Utilisons maintenant find avec -exec pour modifier


l’extension des fichiers. La commande à utiliser est rename,
qui permet de modifier les noms de fichiers :
$ find . -name "*MP3" -exec rename 's/MP3/mp3/g' {} \;

Astuce
Il existe au moins deux versions différentes de la commande
rename, chacune avec une syntaxe et des options propres. Dans
cet exemple, j’utilise celle écrite par Larry Wall (inventeur du
langage de programmation Perl) dont la syntaxe de substitution
vient de Perl. Pour moi, le meilleur article sur ce sujet et « A
Tale of Two Renames » de Tim Heaney (http://chnsa.ws/68).

Pour connaître la version dont vous disposez, affichez la page


du manuel de rename et consultez la section AUTHOR. Si votre
système Linux ne propose pas de commande rename (et c’est bien
possible), vous pouvez l’installer conformément aux instructions
données au chapitre 14, « Installation de logiciels ».
rename est suivie des instructions pour le changement de
nom sous la forme s/ancien/nouveau. (Le s signifie «
substitution ».) Voyons ce que donne la commande dans la
pratique :

$ find . -name "*MP3"

./Blues - Delta/Robert Johnson/1990 Complete Recordings/29 -

➥Malted Milk.mp3

./Blues - Delta/Robert Johnson/1990 Complete Recordings/16 -

➥Dead Shrimp Blues.mp3

./Blues - Delta/Robert Johnson/1990 Complete Recordings/11 -

➥Terraplane Blues.mp3

Astuce
Dans cet exemple, nous avons utilisé s/ancien/nouveau, mais il est
plus fréquent d’employer à la place s/ancien/nouveau/g (le g signifie
« global »). Si chaque nom de fichier ne comprend qu’une seule
instance de ancien à remplacer par new, comme dans « Terraplane
Blues.MP3 », alors s/MP3/mp3 convient parfaitement. Mais, si
Robert Johnson avait, dans un moment de devination futuriste,
écrit une chanson intitulée « Corrupted MP3 Blues », le fichier
aurait été « Corrupted MP3 Blues.MP3 ». Pour remplacer les
deux instances de MP3 par mp3, nous devons utiliser s/MP3/mp3/g.
Ainsi, rename sait que nous voulons changer MP3 en mp3, mais pas
uniquement la première occurrence, contrairement à s/MP3/mp3/.

La commande semble fonctionner. Testons un processus


similaire dans une autre situation. À la section précédente,
nous avions également constaté que la plupart des fichiers
étaient des fichiers m3u. Malheureusement, certains
contiennent des caractères de soulignement dans leur nom,
que je préfère remplacer par des espaces. Commençons par
générer une liste de ces fichiers. Pour les recenser, nous
pouvons effectuer une recherche à l’aide de caractères
jokers placés autour d’un caractère de soulignement (*_*m3u)
:

$ find . -name "*_*m3u"

./Holiday_-_Christmas/Christmas_With_The_Rat_Pack.m3u

./Holiday_-_Christmas/Boots_For_Your_Stockings.m3u

./Classical_-_Baroque/Handel/Chamber_Music.m3u

./Classical_-_Opera/Famous_Arias.m3u

./R&B_-_Doo_Wop/Doo_Wop_Box.m3u

./Electronica/Aphex_Twin/I_Care_Because_You_Do.m3u

Lorsqu’un fichier contenant des caractères de


soulignement dans son nom est trouvé, nous exécutons la
commande rename. Nous remplaçons alors « _ » par « \ » (en
protégeant l’espace pour que find comprenne ce que l’on
cherche et que le shell ne fasse pas d’erreur
d’interprétation) :

$ find . -name "*_*m3u" -exec rename 's/_/\ /g' {} \;

$ find . -name "*_*m3u"

La commande a fonctionné comme prévu : les caractères


de soulignement ont disparu.

Info
Avant d’exécuter des commandes sur des fichiers, vérifiez
toujours quels sont ceux qui vont être affectés par les
commandes. C’est une mesure de prudence qui permet d’éviter
des modifications accidentelles.

Exécuter plus efficacement une


commande sur tous les fichiers trouvés

find +

find | xargs

J’ai travaillé il y a quelque temps sur le serveur d’un client


sur lequel on trouvait plus d’1,5 million de fichiers
temporaires en raison d’une mauvaise configuration. Vous
avez bien lu, plus d’un 1,5 million. Vous pensez peut-être
qu’une utilisation de la commande find avec un tube simple
vers rm va corriger cette situation. Si vous essayez, vous
obtenez le résultat suivant :

$ ls | less

sess_000000001.txt

sess_000000002.txt

sess_000000003.txt

[liste tronquée de 1,5 million d’entrées]

$ find . -name "sess_*" -exec rm {} \;

/bin/rm Argument list too long

En raison d’une limitation du noyau de Linux, il est


impossible de passer un nombre gigantesque d’arguments à
une commande sans obtenir un message d’erreur. Pourtant,
nous devons nous débarrasser de tous ces fichiers.
La solution dernier cri consiste à employer find de la
manière suivante (et d’attendre patiemment que tous les
fichiers disparaissent) :

$ find . -name "sess_*" -exec rm {} +

Par rapport à la commande précédente, la différence


réside dans le remplacement de \; par +. Normalement, find
exécute rm une fois pour chaque fichier trouvé, ce qui est
terriblement inefficace et conduit également à l’erreur liée à
la liste d’arguments trop longue. En revanche, le symbole +
demande à find de créer des groupes de fichiers identifiés
et d’exécuter rm sur chaque groupe, non sur chaque fichier.
Dans ce cas, pourquoi ne pas employer + à chaque fois ?
Cette option est relativement récente dans le monde Unix –
elle n’est apparue qu’en 2006 – et n’est pas présente sur
toutes les versions de find sur tous les systèmes. Pour
savoir si elle est reconnue par la vôtre, faites un test non
dangereux : find . -exec ls {} +. Si vous obtenez des
résultats à la place d’un message d’erreur, cela signifie que
+ est pris en charge (soyez prêt à appuyer sur Ctrl+C si la
liste ne semble jamais vouloir s’arrêter !).
La solution classique consiste à utiliser xargs. Cette
commande lit à partir de l’entrée standard et utilise le
contenu obtenu comme argument aux commandes
indiquées. xargs fonctionne car elle traite l’entrée par lots au
lieu d’un élément à la fois (devinez à qui find a emprunté la
solution pour +). Le nombre des commandes exécutées est
donc moindre et le problème de la liste d’arguments trop
longue est résolu. Si vous souhaitez connaître la taille des
groupes, exécutez xargs --show-limits (appuyez sur Ctrl+D
pour arrêter xargs).

Info
Les tubes et xargs sont similaires en cela qu’ils prennent tous
deux la sortie d’une commande et l’utilise – et xargs se sert
presque toujours de tubes –, mais présentent également des
différences importantes. Un tube prend la sortie de la première
commande et l’utilise comme entrée de la seconde. En
revanche, la commande xargs prend la sortie de la première
commande (grâce au tube) et l’utilise comme arguments de la
seconde commande.

Par exemple, ls -1 | wc -l prend la sortie de ls -1 et l’utilise


comme entrée de wc -l, car wc se fonde sur stdin. Mais, ls -1 | echo
n’affiche aucun résultat, car echo attend des arguments, non
stdin. C’est pourquoi ls -1 | xargs echo fonctionne. En effet xargs
transforme les résultats de ls -1 en arguments pour echo. (Oui,
c’est idiot d’employer echo pour répéter les résultats de ls, mais
j’essaie juste de donner un exemple !)

Revenons au problème des 1,5 million de fichiers. Au lieu


d’utiliser l’action -exec avec find, envoyons les résultats de
find à xargs et utilisons cette commande pour supprimer les
fichiers :

$ find . -name "sess_*" | xargs rm

$ ls

[Rien ! 1,5 million de fichiers ont disparu !]

Il faut un long moment pour que cette commande se


termine (supprimer autant de fichiers n’est pas rien) mais
cela fonctionne, et tout le monde est content.

Astuce
Si find est souvent associée à xargs, vous pouvez évidemment
employer xargs avec d’autres commandes. C’est juste que 90 %
des exemples proposés sur le Web semblent commencer avec
find !

Exécuter une commande sur les fichiers


trouvés dont les noms contiennent des
espaces

find -print0 | xargs -0

Dans la section précédente, nous devions supprimer 1,5


million de fichiers, tous nommés sur le modèle
sess_000000001.txt. Nous avons donc employé find avec xargs
de la manière suivante :

$ find . -name "sess_*" | xargs rm

Si la commande a bien fonctionné, c’est uniquement


parce que les noms de sess_000000001.txt et de sa cohorte de
compagnons ne comportaient aucun espace. Si les fichiers
avaient été nommés sur le modèle sess 000000001.txt, le
résultat aurait été différent :

$ find . -name "sess_*" | xargs rm

rm: cannot remove ‘./sess’: No such file or directory

rm: cannot remove ‘000000001.txt’: No such file or directory

rm: cannot remove ‘./sess’: No such file or directory

rm: cannot remove ‘000000002.txt’: No such file or directory

^C

Grâce à Ctrl+C j’ai pu interrompre l’affichage de 3


millions de lignes (deux lignes pour chaque fichier, puisque
les noms comportent un espace). Pourquoi ces espaces
posent-ils un problème ?
La commande xargs se sert de l’espace pour découper la
sortie. Par conséquent, lorsque find transmet sess
000000001.txt, xargs transforme cela en rm sess et rm
000000001.txt. Ces deux fichiers n’existant pas, rm affiche une
erreur. Par ailleurs, ce fonctionnement peut être dangereux,
car tout fichier nommé 000000001.txt aurait disparu.
Les espaces ne sont pas les seuls à pouvoir déformer la
commande indiquée à xargs. Les guillemets, les
apostrophes, les passages à la ligne et les barres obliques
inverses peuvent également conduire à des résultats
inattendus. Pour résoudre ce problème, il faut utiliser la
commande suivante :

$ find . -name "sess_*" -print0 | xargs -0 rm

Normalement, find envoie chaque nom de fichier complet


suivi d’un caractère de passage à la ligne invisible (c’est
pourquoi chaque résultat de find s’affiche sur sa propre
ligne). L’action -print0 demande à find de faire suivre
chaque nom de fichier complet par le caractère null.
L’option -0 indique à xargs de découper la sortie en fonction
du caractère null à place de l’espace. Puisque find et xargs
coopèrent, vous ne constatez plus d’erreurs. En prime, -0
demande à xargs d’ignorer les guillemets et tout autre
caractère qui pourraient provoquer son échec.

Conclusion
La commande find offre de nombreuses possibilités et
dispose d’un grand nombre d’autres fonctions qui n’ont pas
été abordées ici. Pour en savoir plus, je vous conseille de lire
les pages de manuel qui s’y rapportent et de consulter les
différents didacticiels à son sujet qu’on trouve sur le Web. Si
la commande find permet d’effectuer diverses recherches
sur des fichiers et des répertoires grâce à ses nombreuses
options, elle montre toute sa puissance avec l’option -exec
pour appliquer d’autres commandes aux résultats d’une
recherche. Vous pouvez aussi rediriger sa sortie vers
d’autres commandes grâce à un tube. C’est l’une des
commandes les plus intéressantes de Linux, alors, ne vous
privez pas de son utilisation.
Chapitre 12
Le shell
Jusqu’à présent, vous avez exécuté des commandes dans le
shell, mais vous ne vous êtes pas penché sur son
fonctionnement. Au cours de ce chapitre, vous allez
découvrir des commandes qui affectent son fonctionnement
: history, qui permet d’afficher la liste des commandes
saisies dans l’interpréteur de ligne de commande, alias, qui
permet de créer des raccourcis pour les commandes, et les
fonctions, qui sont comme les alias mais en vingt fois plus
puissant. Toutes sont utiles et peuvent vous faire gagner
beaucoup de temps lorsque vous travaillez en ligne de
commande. La paresse est une qualité lorsque l’on travaille
avec des ordinateurs et ces commandes vous permettront
d’être aussi paresseux que possible dans votre utilisation de
Linux.

Afficher l’historique de l’interpréteur de


la ligne de commande

history

Toute commande saisie à partir du shell bash est enregistrée


dans un fichier nommé .bash_history dans votre répertoire
personnel (le point qui précède le nom du fichier signifie
que le fichier est caché, sauf si l’on utilise ls -a). Par défaut,
ce fichier contient les cinq cents dernières lignes saisies.
(Cette limite peut être repoussée, comme l’explique la page
http://chnsa.ws/ul.) Pour afficher la liste de ces
commandes, saisissez simplement history.

$ history

496  ls

497  cd rsync_ssh

498  ls

499  cat linux

500  exit

Attention
Vous comprenez maintenant pourquoi vous devez être prudent
lorsque vous saisissez des mots de passe ou d’autres
informations importantes sur la ligne de commande. N’importe
qui peut afficher le contenu du fichier .bash_history pour
récupérer ces informations sensibles. Vous devez donc faire très
attention à ce que vous saisissez dans le shell.

Si vous souhaitez retrouver une commande précise dans


votre historique, vous disposez de plusieurs solutions. La
première est manuelle. Puisque vous examinez 500
résultats, ils vont s’afficher trop rapidement pour que vous
puissiez en voir ne serait-ce qu’un avant d’arriver à la fin.
Pour parcourir les résultats page par page, tournez-vous
vers notre ami less :

$ history | less

Si less ne vous convient pas, vous pouvez à la place saisir


history suivi d’une valeur représentant le nombre de lignes
de commandes enregistrées qui seront affichées sur la
console. Par exemple, history 50 listera les cinquante
dernières commandes exécutées. Vous pouvez ainsi
examiner les résultats plus facilement.
Parcourir les commandes est très pratique, mais assez
fastidieux. Pour rendre les choses plus automatiques,
redirigez la commande history vers grep (voir le chapitre 10,
« Recherche d’éléments ») de façon à délimiter rapidement
la recherche :

$ history | grep pandoc

105 pandoc -o temp.html temp.md

Et voilà ! Si seulement il existait une solution simple pour


exécuter de nouveau cette commande... Elle existe, dans la
section suivante.

Astuce
Si vous constatez un emploi fréquent de history | grep (c'est mon
cas), simplifiez-vous la vie en créant un alias pour cette
construction dans votre fichier .bash_aliases :
alias histg="history | grep"
Qu’est-ce qu’un alias ? Vous trouverez la réponse un peu plus
loin dans ce chapitre !

Répéter la dernière commande

!!

Si vous souhaitez exécuter de nouveau la dernière


commande, saisissez simplement deux points
d’exclamation.

$ pwd

/home/scott $

!!

pwd

/home/scott

Notez que vous voyez d’abord la commande qui va être


exécutée, puis son résultat. Elle est affichée uniquement
pour information afin que vous sachiez ce qui se passe, car
son exécution est déjà en cours au moment où vous le
voyez. Lorsque l’exécution de la commande ne prend
qu’une fraction de seconde, au moment où elle apparaît,
vous obtenez également ses résultats.
Cela peut conduire à quelques surprises. Il est possible
que vous pensiez exécuter une commande mais que la
commande réellement exécutée ne soit pas celle-ci (parce
que des pages de résultats séparent la dernière commande
de l’invite actuelle, ou parce que vous avez oublié que vous
aviez demandé à bash de ne pas conserver certaines
commandes dans l’historique).
Il existe cependant une solution pour éviter ce problème
avant qu’il ne se pose. Ajoutez les lignes suivantes à .bashrc,
puis rechargez ce fichier :

# Verify substituted history expansion before running

shopt -s histverify

La première ligne est un commentaire, tandis que la


seconde demande à bash d’afficher toute commande venant
de l’historique et de l’afficher sans l’exécuter réellement.
Vous devrez ensuite confirmer son exécution en appuyant
sur Entrée, mais c’est un petit prix à payer pour avoir
l’opportunité d’examiner en amont ce qui va se passer.
Si la saisie de !! vous perturbe trop, servez-vous de la
touche Flèche haut pour parcourir l’historique. Lorsque vous
arrivez à la commande souhaitée, appuyez sur Entrée.

Astuce
Lorsque vous exécutez une commande occupant plusieurs
lignes, bash enregistre par défaut chaque ligne comme une
entrée séparée. Il est donc difficile d’exécuter une commande
multiligne à l’aide de la touche Flèche haut ou de   !!. Toutefois,
en ajoutant les deux lignes suivantes à votre fichier .bashrc (la
première étant un commentaire, elle n’est pas indispensable
mais permettra de vous rappeler ce que vous faites), vous
résolvez ce problème particulier.
# Save each line of a multi-line command in the same history
entry shopt -s cmdhist
Rechargez votre fichier .bashrc (voir au chapitre 1, « Les
commandes : ce qu’il faut savoir ») et entrez dans le paradis de
la commande multiligne.

Voilà un bon moyen de laisser l’ordinateur s’acquitter de


tâches fastidieuses à votre place.

Répéter une commande précédente en


utilisant des nombres

![numéro]

Lorsque vous exécutez history, un numéro s’affiche en face


de chaque commande précédente. Pour répéter une
commande antérieure dont vous connaissez le numéro,
saisissez un point d’exclamation immédiatement suivi du
nombre correspondant à la commande à répéter.

$ pwd

/home/scott

$ whoami

scott

$ !499

pwd

/home/scott

Si vous avez des doutes sur le numéro d’une commande,


faites history. Dans cet exemple, la commande pwd portait le
numéro 499, mais après avoir été répétée par !499, elle
porte désormais le nombre 498 car elle est remontée d’une
place dans la liste de l’historique.

Répéter une commande précédente en


utilisant une chaîne

![chaîne]

Pouvoir répéter une commande en utilisant son numéro


dans l’historique est intéressant, mais encore faut-il
connaître ce numéro. Sa récupération peut être un peu
fastidieuse (vous pouvez bien sûr rediriger la sortie de
history vers grep, mais ce n’est quand même pas la solution
idéale). Il est souvent plus facile de se référer à une
commande précédente en utilisant son nom. Si vous
saisissez un point d’exclamation suivi des premières lettres
de la commande, le shell exécute la première commande de
.bash_history en partant de la fin de la liste qui commence
par ces lettres.

$ cat /home/scott/todo.txt

Buy milk

Buy dog food

Renew Ars Technica subscription

$ cd /home/scott/pictures

$ !cat

cat /home/scott/todo.txt

Buy milk

Buy dog food

Renew Ars Technica subscription

Si la commande cat figure trois fois dans l’historique, par


exemple – à la ligne 35 (cat /home/scott/todo), à la ligne 412
(cat /etc/apt/ source.list) et à la ligne 496 (cat
/home/scott/music) – et que vous faites !cat, c’est la
commande de la ligne 496 qui est exécutée. Si vous
souhaitez exécuter la commande de la ligne 412, vous
devez saisir !412 ou ajouter suffisamment d’informations
après le point d’exclamation pour que le shell sache que
vous souhaitez répéter la commande de la ligne 412.

$ !cat /etc

cat /etc/apt/sources.list

deb http://us.archive.ubuntu.com/ubuntu precise main

deb-src http://us.archive.ubuntu.com/ubuntu precise main

Comme il est plus facile de mémoriser des mots que des


nombres, vous utiliserez sans doute cette commande pour
invoquer des commandes précédentes. Si vous avez un
doute sur les commandes déjà exécutées, tapez history.

Répéter une commande précédente et


l’exécuter

^-r (Ctrl-r)

^-s (Ctrl-s)

^-g (Ctrl-g)

Nous avons décrit plusieurs manières d’exécuter des


commandes précédentes, toutes très pratiques, mais nous
avons gardé le meilleur pour la fin. Supposons que votre
historique contienne les lignes suivantes :

1471 ssh hlp@azathoth.miskatonic-expedition.com

1472 cd /var/www

1473 chmod 755 ~/bin/backup.sh

1474 ssh hlp@nyarlathotep.miskatonic-expedition.com

1475 find /var/www -name "bootstrap.js"

1476 cd ~/bin

1477 ssh hlp@cthulhu.miskatonic-expedition.com

Vous êtes à présent 500 lignes plus loin et vous souhaitez


vous reconnecter à nyarlathotep.miskatonicexpedition.com avec
ssh (voir le chapitre 16, « Travail sur le réseau »). Toutefois,
vous n’avez aucune envie de ressaisir intégralement la
commande. Vous pouvez effectivement appuyer des
centaines de fois sur la touche Flèche haut ou utiliser history
| grep ssh pour retrouver le numéro de ligne de la
commande appropriée, mais votre fainéantise l’emporte.
Votre meilleure solution : la recherche !
Appuyez sur Ctrl-r (représenté sous la forme ^-r, et
parfois C-r dans la documentation habituelle) pour voir
apparaître l’invite suivante en bas de la fenêtre de la
console :

(reverse-i-search)' ':

Commencez à saisir ss. bash recherche (indiqué par search


dans l’invite) alors dans votre historique, des commandes
les plus récentes aux plus anciennes (indiqué par reverse
dans l’invite), toute correspondance avec ss. Vous pouvez,
par exemple, obtenir ceci :

(reverse-i-search)'ss': less /etc/inputrc

Si vous ajoutez le h, le critère de recherche devient ssh et


le premier résultat correspondant dans l’historique apparaît
(d’où la lettre i dans l’invite, comme « incrémental »). En
supposant que vous n’ayez pas utilisé ssh pour vous
connecter à d’autres serveurs depuis au moins cinq-cent
commandes, vous devez obtenir ceci :

(reverse-i-search)'ssh': ssh hlp@cthulhu.miskatonic-


expedition.

➥com

Ce n’est pas celle que vous souhaitez, mais le critère est


le bon. Pour revenir plus loin dans l’historique tout en
conservant le même critère de recherche – ssh dans ce cas –
appuyez de nouveau sur Ctrl-r. Le « r » signifie reverse (à
l’envers) et vous devez à présent arriver à la commande
attendue :

(reverse-i-search)'ssh': ssh hlp@nyarlathotep.miskatonic-

➥expedition.com

Mais, supposons que vous alliez trop vite et que vous


appuyiez encore une fois sur Ctrl-r. Vous êtes donc allé trop
loin et obtenez une correspondance plus ancienne :

(reverse-i-search)'ssh': ssh hlp@azathoth.miskatonic-


expedition.

➥com

Aucun problème. Vous avez trop reculé, il suffit donc de


revenir en avant en appuyant sur Ctrl-s, de façon à effectuer
la recherche dans les commandes plus récentes (vous
pouvez évidemment appuyer plusieurs fois sur ces touches).
Vous revenez alors à la commande qui vous intéresse :

(reverse-i-search)'ssh': ssh hlp@nyarlathotep.miskatonic-

➥expedition.com

À ce stade, vous pouvez appuyer sur Entrée pour soit


afficher la commande (si vous avez suivi le conseil donné à
la section « Répéter la dernière commande ») et l’examiner
avant d’appuyer sur Entrée pour l’exécuter, soit exécuter
simplement la commande (si vous n’avez pas suivi ce
conseil).

Astuce
Si Ctrl-s n’a pas d’effet, vous rencontrez un conflit avec ce
raccourci clavier. Sur de nombreux ordinateurs Linux, Ctrl-s
émet un contrôle de flux XOFF (voir l’article
https://fr.wikipedia.org/wiki/Contrôle_de_flux), qui aujourd’hui
date un peu et se révèle rarement utile, à l’exception de
quelques cas très particuliers. Pour désactiver temporairement
XOFF, saisissez la commande suivante dans la console :
$ stty -ixon
Ctrl-s doit à présent fonctionner, mais si vous vous déconnectez
et ouvrez de nouveau une session, XOFF sera de retour. Pour le
désactiver de façon permanente, ajoutez les lignes suivantes
dans le fichier .bashrc :
# Disable XOFF flow control so that Ctrl-s does forward history

➥searching

stty -ixon

Enregistrez le fichier, rechargez-le (source ~/.bashrc), et tout


devrait fonctionner parfaitement.

Vous êtes donc en train d’examiner la commande


trouvée, mais vous vous dîtes « Finalement, ce n’est pas ce
que je souhaite. Non seulement la commande n’est pas la
bonne, mais je ne veux plus rechercher de commande ! »
Pour terminer la recherche dans l’historique, appuyez
simplement sur Ctrl-g.
Tout cela est déjà très bien, mais il est possible d’obtenir
encore mieux !
Vous rappelez-vous de la recherche incrémentale dans
l’historique avec Ctrl-r et Ctrl-s ? Il est évident qu’elle peut
produire un grand nombre de faux positifs. Supposons que
nous soyons sur le serveur azathoth et que nous souhaitions
nous connecter à nyarlathotep par ssh. Nous appuyons sur
Ctrl-r, saisissons ssh et obtenons le résultat suivant en
appuyant plusieur fois sur Ctrl-r :

cat ~/.ssh/config

ssh hlp@nyarlathotep.miskatonic-expedition.com

cd ~/.ssh

man ssh

less intern-ssh-instructions.txt

Vous remarquerez que la recherche incrémentale trouve


la chaîne ssh quelle que soit sa place dans la ligne de
l’historique. Cela convient dans le cas d’une véritable
recherche, mais nous souhaitons simplement aller sur
nyarlathotep avec ssh, non parcourir toutes ces autres
correspondances. Voici comment arriver à ce
fonctionnement.
Dans votre fichier ~/.inputrc (voir la section « Fichiers
spéciaux qui affectent les commandes » au chapitre 1),
ajoutez ceci :

# When pressing up or down arrows, show only history that

# matches what was already typed

"\e[A":history-search-backward

"\e[B":history-search-forward

Enregistrez le fichier et rechargez-le en exécutant type


bind -f ~/.inputrc. (À la prochaine ouverture de session, bash
chargera automatiquement le fichier. Vous devez saisir cette
commande uniquement lorsque vous apportez une
modification sans relancer le shell.) Depuis la ligne de
commande, n’appuyez pas sur Ctrl-r pour démarrer une
recherche dans l’historique, mais saisissez simplement ssh
et appuyez sur la touche Flèche haut (le \e[A dans l’exemple
; \e[B correspond à Flèche bas). Voyez ce qui apparaît en
premier !

$ ssh hlp@nyarlathotep.miskatonic-expedition.com

Un appui sur Entrée et nous sommes connectés à


nyarlathotep. La touche Flèche haut a déclenché la recherche
des termes saisis, comme le faisait Ctrl-r, mais en
n’affichant que les lignes qui commencet par ces termes.
Faites l’essai et vous ne pourrez pas croire que vous avez pu
vivre sans !

Info
Pour vérifier que le rechargement de .inputrc a fonctionné,
saisissez la commande suivante :
$ bind -P | grep history-search

history-search-backward can be found on "\e[A".

history-search-forward can be found on "\e[B".

Les résultats indiquent que la recherche en arrière est associée


à la touche Flèche haut et celle en avant, à la touche Flèche
bas, exactement ce que nous voulions. En revanche, la sortie
suivante signale un problème :
$ bind -P | grep history-search

history-search-backward is not bound to any keys

history-search-forward is not bound to any keys

La solution la plus simple consiste à ouvrir un nouveau shell et à


refaire le test. S’il fonctionne, fermez l’ancien shell et
démarrez-en un autre. Dans le cas contraire, examinez
attentivement le fichier ~/.inputrc pour trouver l’origine de
l’erreur.

Afficher tous les alias de commandes

alias

Vous pouvez créer un alias pour invoquer rapidement une


commande que vous utilisez régulièrement ou qui est
longue à saisir ; il vous suffira ensuite de saisir le nom de
cet alias pour exécuter la commande correspondante. Bien
entendu, si une commande est particulièrement complexe
ou nécessite plusieurs lignes, vous pouvez en faire un script
ou une fonction (les fonctions sont décrites à la fin de ce
chapitre). En revanche, pour les commandes relativement
simples, les alias sont idéaux.
Les alias peuvent être temporaires et stockés en mémoire
jusqu’à la fin de la session du shell, ou « permanents » et
stockés dans un fichier de votre répertoire personnel. (Ils ne
sont pas réellement permanents car ils peuvent toujours
être supprimés.) Vous les trouverez sans doute dans .bashrc,
mais plus certainement dans .bash_aliases. (Pour de plus
amples informations sur .bashrc et .bash_aliases, consultez la
fin du chapitre 1.)
La plupart des distributions Linux contiennent déjà une
série d’alias préconfigurés. Pour en afficher la liste, saisissez
alias.

$ alias

alias la="ls -a"

alias ll="ls -l"

[liste coupée en raison de sa longueur]

En général, la quantité d’alias par défaut est réduite au


strict minimum. C’est à vous de créer ceux qui vous
conviennent.

Afficher l’alias d’une commande donnée

alias [nom d’alias]

Lorsque l’on a créé plusieurs alias, il peut être difficile d’en


localiser un en particulier avec la commande alias. Si vous
souhaitez des détails sur l’un d’eux, saisissez alias suivi du
nom de l’alias en question.

$ alias wgetpage

alias wgetpage="wget --html-extension --recursive --convert-


links

➥--page-requisites --no-parent"

Maintenant, vous savez exactement quelle est la fonction


de l’alias wgetpage.

Info
Vous en apprendrez davantage sur wget au chapitre 16.

Créer un nouvel alias temporaire

alias [nom d'alias]="[commande]"

Si vous passez votre temps à utiliser une même commande,


il est peutêtre temps de lui créer un alias. Par exemple, pour
afficher les sousrépertoires de votre répertoire courant, vous
utilisez ls -d */. Voici comment créer un alias temporaire
pour cette commande :

$ ls -d */

by_pool/  libby_pix/  on_floor/

$ alias lsd="ls -d */"

$ lsd

by_pool/  libby_pix/  on_floor/

Deux choses sont à retenir à propos de cette méthode de


création des alias. Le nom de l’alias ne peut pas contenir le
symbole = puisqu’il est immédiatement suivi d’un = qui
introduit sa définition. En revanche, l’alias lui-même peut
contenir un =. Par ailleurs, un alias créé de la sorte ne dure
que le temps de la session du shell. Si vous quittez la
console, il disparaît.
Pour créer un alias qui survit à la fermeture de la session,
lisez la prochaine section « Créer un nouvel alias permanent
».

Créer un nouvel alias permanent

alias [nom d’alias]="[commande]"

Si vous souhaitez que vos alias survivent entre les sessions,


vous devez les ajouter au fichier que votre shell utilise pour
les stocker. Avec bash, ce fichier est le plus souvent .bashrc
ou .bash_aliases. C’est ce dernier que nous allons utiliser.
Quel que soit le nom du fichier, faites attention lorsque vous
le modifiez car une erreur peut entraîner des problèmes par
la suite – si vous voulez être prudent, créez une sauvegarde
du fichier avant de l’éditer. Mieux vaut prévenir que guérir.

Info
Comment savoir quel fichier utiliser ? Saisissez simplement ls -a
~. Si vous voyez .bash_aliases, utilisez ce fichier ; sinon, regardez
dans .bashrc si des alias y sont définis. Si aucun alias ne figure
dans ce fichier, regardez dans .profile car il arrive que ce fichier
soit utilisé pour le stockage des alias.

Pour ajouter un alias à .bash_aliases, ouvrez ce fichier


avec votre éditeur de texte favori et ajoutez-y la ligne qui
suit :
alias lsd="ls -d */"

Une des règles dont il a été question à la section « Créer


un nouvel alias temporaire » s’applique également ici ; le
nom de l’alias ne peut contenir le symbole =. Après avoir
ajouté l’alias dans .bash_aliases, enregistrez ce fichier et
fermez-le. L’alias n’est pas encore disponible car le fichier
.bash_aliases (ou .bashrc) doit être rechargé :
$ source ~/.bash_aliases

Le nouvel alias est maintenant opérationnel.

Info
Certains déconseillent la création d’alias qui changent le
comportement normal d’une commande, comme alias rm="rm -i",
en expliquant que cela génère une dépendance envers un alias
non défini sur un autre ordinateur et une source d’erreurs
potentiellement désastreuses. Personnellement, je trouve cet
argument plutôt stupide. Si un alias vous simplifie la vie, je suis
certain que vous aurez suffisamment de cervelle pour vous
rappeler qu’il sera absent sur une autre machine.

Supprimer un alias

unalias

Toutes les bonnes choses ont une fin. Parfois un alias


devient inutile. Pour le supprimer, on utilise la commande
unalias.

$ ls -d */

by_pool/  libby_pix/  on_floor/

$ alias lsd="ls -d */"

$ lsd

by_pool/  libby_pix/  on_floor/

$ unalias lsd

$ lsd

Notez que cette commande n’est définitive que pour les


alias temporaires. Dans l’exemple précédent, l’alias lsd a
disparu définitivement. En revanche, si vous l’utilisez sur un
alias défini dans .bash_aliases, celui-ci sera également
supprimé, mais uniquement pour la durée de la session
courante. Si vous quittez la console et que vous la rouvrez
ou si vous rechargez .bash_aliases, l’alias sera de nouveau
opérationnel.
Pour supprimer un alias de .bash_aliases, vous devez
éditer ce fichier et supprimer manuellement la ligne qui
contient l’alias. Si vous pensez avoir de nouveau besoin de
cet alias à l’avenir et que vous souhaitez simplement le
désactiver, placez un symbole # devant, comme ceci :
# alias lsd="ls -d */"

Enregistrez .bash_aliases et rechargez-le avec source


~/.bash_ aliases, l’alias ne fonctionne plus. Pour le réactiver,
ouvrez le fichier, supprimez le symbole #, enregistrez-le et
rechargez-le. L’alias est de nouveau opérationnel.

Créer une nouvelle fonction temporaire

function [nom de fonction] { }

[nom de fonction] () { }

S’il vous faut quelque chose de plus complexe qu’un alias,


mais de plus simple qu’un script, vous avez besoin d’une
fonction.
Le manuel de référence officiel de bash décrit une fonction
du shell comme étant « une manière de regrouper des
commandes sous un nom unique en vue d’une exécution
ultérieure », ce qui est tout à fait exact. L’invocation d’une
fonction est similaire à celle d’un alias : il suffit de saisir le
nom de la fonction, suivi des arguments à passer. La grande
différence, comme l’expliquera la section « Choisir entre un
alias et une fonction », vient des possibilités offertes par
une fonction et dont un alias est incapable.
Il existe deux manières de déclarer une fonction. La
première se fonde sur la commande function, que l’on fait
suivre du nom de la fonction et, placées entre des accolades
({ et }) des commandes qu’elle devra exécuter. La seconde
est plus confortable pour le programmeur. Il suffit de
commencer par le nom de la fonction, puis d’ajouter des
parenthèses vides et des accolades. Vous choisirez la
méthode que vous préférez ; de mon côté j’ai adopté la
seconde et l’emploierait dans les exemples.
Les fonctions temporaires peuvent être créées sur une
seule ligne, comme dans l’exemple suivant. La fonction
commence par créer un répertoire avec mkdir -p, puis passe
dans ce répertoire avec cd :

$ mkcd () { mkdir -p "$1"; cd "$1"; }

$ mkcd lovecraft

$ pwd

/home/scott/lovecraft

Dans cette méthode, vous devez placer des points-


virgules après chaque commande, même la dernière.

Info
Vous l’avez probablement déjà deviné, le terme $1 dans la
fonction est un paramètre positionnel qui est remplacé par le
premier argument indiqué après le nom de la fonction. La
dernière section de ce chapitre, « Choisir entre un alias et une
fonction », reviendra en détail sur ces termes et leur
signification.

Les fonctions peuvent également s’étendre sur plusieurs


lignes. Si vous souhaitez la créer sur la ligne de commande
(la manière de créer une fonction temporaire), vous allez
probablement rencontrer une nouveauté. Lorsque vous
saisissez la première ligne de la nouvelle fonction et
appuyez sur Entrée, une invite secondaire apparaît sous la
forme d’un symbole supérieur (>). bash vous indique ainsi
que vous devez poursuivre la saisie pour terminer la
commande. Dans ce cas, puisque vous créez une fonction, il
attend l’accolade finale (}) et un appui sur la touche Entrée.
Jusqu’à ce que vous effectuiez cette opération, vous pouvez
saisir les lignes de la fonction et appuyer sur Entrée. Chaque
ligne suivante commence par le symbole > indiquant que
bash attend les éléments finaux.
Il n’est pas facile de représenter ce processus dans un
livre, mais l’exemple suivant devrait vous donner l’idée
générale. J’ai appuyé sur Entrée après chacune des quatre
lignes montrées ; après la première, une invite secondaire
est apparue, jusqu’à ce que je termine la fonction avec
l’accolade finale et la touche Entrée.

$ mkcd () {

>   mkdir -p "$1"

>   cd "$1"

> }

Quelle que soit la manière employée, une fonction créée


depuis la ligne de commande a la même durée de vie que la
session du shell. Si vous fermez la session, la fonction
disparaît.
Pour créer une fonction qui survit à la fermeture de
session, lisez la section suivante « Créer une nouvelle
fonction permanente ».

Astuce
Vous trouverez des fonctions très utiles et pédagogiques en
effectuant des recherches avec les termes «    bash fonctions
utiles» (ou en anglais «  bash useful functions ») ou équivalent.

Créer une nouvelle fonction permanente

function [nom de fonction] { }

[nom de fonction] () { }
Si vous souhaitez que vos fonctions soient conservées entre
les sessions du shell, vous devez les ajouter à un fichier
utilisé par le shell. En général, il s’agit de .bashrc ou de
.bash_aliases ; je préfère utiliser .bash_aliases car il existe
déjà et je le charge à partir de .bashrc.
Certaines personnes souffrent de dissonance cognitive
quand on leur dit d’utiliser un fichier nommé .bash_aliases
pour stocker des fonctions. Si c’est votre cas, vous pouvez
toujours créer un fichier .bash_functions dans votre répertoire
personnel et le charger depuis le fichier .bashrc :

if [ -f ~/.bash_functions ]; then

  source ~/.bash_functions

fi

Si vous créez de nombreuses fonctions ou si votre fichier


de fonctions devient trop volumineux, placez-les dans des
fichiers séparés stockés dans un répertoire caché. Il suffit
ensuite de les charger à partir de.bashrc :

if [ -d ~/.bash_functions ]; then

  for file in ~/.bash_functions/*; do

    source "$file"

  done

fi

Vous remarquerez l’option -d, pour « répertoire »


(directory), à la place de l’option -f, pour « fichier » (file),
utilisée dans l’exemple précédent.
Pour ajouter une fonction à .bash_aliases, ouvrez ce fichier
dans votre éditeur de texte préféré et saisissez les
commandes. Si la fonction est courte et si elle peut être
placée sur une seule ligne, voici comment procéder :

mkcd () { mkdir -p "$1"; cd "$1"; }

Si elle doit occuper plusieurs lignes, ce qui est souvent


préférable pour sa lisibilité, vous pouvez l’écrire de la
manière suivante :

knownhosts () {

  [ "${1}" ] || return

  local date=$(date +%Y-%m-%d-%H.%M.%S)

  sed -i_${date} -e "${1}d" ~/.ssh/known_hosts

Expliquons ce qui se passe dans ce cas. Il s’agit d’une


fonction plutôt utile avec ssh (voir la section « Se connecter
de façon sécurisée à un autre ordinateur » au chapitre 16).
De façon périodique, la clé SSH publique d’un serveur peut
changer. Il faut alors modifier le fichier known_hosts présent
dans le répertoire ~/.ssh afin de retirer la ligne qui fait
référence à ce serveur et que celui-ci fournisse une nouvelle
clé publique. Heureusement, dans son message d’erreur, ssh
indique la ligne à modifier :

Offending key in /home/scott/.ssh/known_hosts:8

J’ai de nombreux serveurs à gérer et ouvrir constamment


le fichier known_hosts pour supprimer des lignes devenait
fastidieux. J’ai donc écrit cette fonction. Pour l’utiliser, il
suffit de taper le nom de la fonction suivi du numéro de
ligne fourni par le message d’erreur de ssh :

$ knownhosts 8

La ligne étant supprimée, vous pouvez maintenant vous


connecter au serveur en question et obtenir une autre clé
publique. Facile. Mais comment travaille cette fonction ?
La première ligne, [ "${1}" ] || return, vérifie si un
argument (ici un numéro de ligne) a été précisé après la
commande. Si ce n’est pas le cas, la fonction se termine (un
test qu’il est souvent bon d’ajouter aux fonctions !).
La deuxième ligne, local date=$(date +%Y-%m-%d-%H.%M.%S),
crée une variable locale nommée date à partir de la sortie
produite par la commande date. Par défaut, toutes les
variables créées au sein d’une fonction sont globales ;
autrement dit, elles existent même après que la fonction est
terminée. À l’opposé, une variable locale n’est disponible
qu’à l’intérieur de la fonction. Lorsque celle-ci se termine, la
variable disparaît. La variable date va contenir la date
courante, par exemple 2015-07-25-22.21.41.
La troisième ligne, sed -i_${date} -e "${1}d" ~/.ssh/known_
hosts, utilise sed (voir la section « Transformer le texte d’un
fichier » du chapitre 7) pour différentes actions. L’option -i
demande à sed de modifier le fichier en place, mais en
commençant par effectuer une copie de sauvegarde dont le
nom contient la valeur de la variable date. La copie aura
donc un nom semblable à known_hosts_2015-07-25- 22.21.41.
(Vous l’avez compris, avec le temps, vous aurez plusieurs
fichiers de sauvegarde dans ~/.ssh, mais ce n’est pas très
grave : il suffit d’un petit nettoyage périodique.) L’option -e
supprime l’entrée qui pose problème. Le nombre donné en
argument à la fonction, 8 dans cet exemple, est passé à la
fonction au travers du paramètre ${1}.

Info
J’utilise des accolades autour des variables. Elles sont
facultatives, mais elles permettent de bien distinguer les
variables du texte environnant. Comparez par exemple ${1}d et
$1d. Ces deux manières d’écrire sont équivalentes, mais la
première est beaucoup plus lisible.

Quelle que soit la façon de saisir la fonction dans


.bash_aliases, terminez en enregistrant le fichier et en le
fermant. Vous devez ensuite le charger pour que la nouvelle
fonction soit reconnue :
$ source ~/.bash_aliases

La fonction est opérationnelle et, espérons-le, devrait


améliorer votre productivité !

Afficher toutes les fonctions

Pour obtenir la liste de tous les alias définis, il suffit


d’employer la commande alias. Malheureusement, il
n’existe aucun équivalent pour les fonctions. À la place,
vous pouvez employer la petite fonction pratique suivante,
qui affiche la liste de toutes les fonctions.

listfunc () {

  for func in $(compgen -A function | grep -v _);

  do

    declare -f $func;

    echo -e "\r";

  done

Elle se fonde sur une boucle for, une substitution de


commande (voir le chapitre 5, « Création de blocs de
commandes »), la commande grep (voir le chapitre 10) et les
commandes compgen et declare (que nous n’allons pas
décrire, charge à vous de vous documenter). Placez cette
fonction dans votre fichier .bash_aliases et exécutez listfunc
depuis la ligne de commande quand vous en avez besoin.

Info
Si vous faites quelques recherches, vous découvrirez peut-être
que declare -f permet d’afficher toutes les fonctions. C’est vrai,
mais vous obtenez l’intégralité des fonctions disponibles dans
le shell, y compris celles fournies par la distribution Linux. Avec
listfunc, j’ai constaté que les fonctions que j’avais ajoutées moi-
même occupaient 59 lignes. Lorsque j’ai exécuté declare -f,
toutes les autres fonctions que je n’avais pas créées sur mon
système faisaient monter le total à 2 213 lignes !

Supprimer une fonction

unset -f [nom fonction]

Pour se débarrasser d’un alias, c’est simple : unalias. En


revanche, unfunction n’existe pas. À la place, lorsqu’une
fonction est devenue inutile, il faut se tourner vers la
commande unset et son option -f (pour « fonction »).

$ mkcd () { mkdir -p "$1"; cd "$1"; }

$ mkcd lovecraft

$ pwd

/home/scott/lovecraft

$ unset -f mkcd

$ mkcd cthulhu

mkcd: command not found

Notez cependant que cette commande n’opère de façon


définitive que pour les fonctions temporaires du shell,
comme indiqué à la section «    Créer une nouvelle fonction
temporaire  ». La fonction mkcd de l’exemple précédent est à
présent perdue à tout jamais. Si vous appliquez la
commande unset à une fonction définie dans .bash_aliases
(ou .bash_functions), celle-ci disparaîtra également, mais
uniquement tant que la session reste ouverte. Lorsque vous
vous déconnectez et ouvrez une nouvelle session, ou
rechargez .bash_aliases, la fonction est de retour.
Pour retirer des fonctions de .bash_aliases, vous devez
éditer le fichier et supprimer manuellement la ou les lignes
concernées. Si vous pensez que la fonction peut redevenir
utile, mettez simplement un signe dièse devant les lignes de
la fonction (pour les mettre en commentaire) :
# mkcd () { mkdir -p "$1"; cd "$1"; }

Enregistrez .bash_aliases et rechargez-le avec la


commande source ~/.bash_aliases. La fonction n’est plus
disponible. Pour la réactiver, ouvrez .bash_aliases, retirez le
signe dièse, enregistrez le fichier et rechargez-le.

Choisir entre un alias et une fonction

Nous avons vu les alias et les fonctions. Quand vaut-il mieux


utiliser l’un à la place de l’autre ?
Il existe des similitudes entre les deux. Les alias et les
fonctions sont chargés en mémoire avec le shell. (Les
capacités des ordinateurs modernes sont élevées et les
fonctions occupent si peu de mémoire que vous n’avez pas
à vous soucier d’un quelconque impact négatif.) Tous deux
ne peuvent être utilisés que par le shell en cours et
n’affectent donc que son environnement actuel
(contrairement aux scripts).
En revanche, les différences ont leur importance. En fait,
le manuel de référence officiel de bash dit ceci à propos des
alias : « dans presque tous les cas, les fonctions du shell
sont préférables aux alias ». Pour quelle raison ?
D’une part, bash exécute toujours les alias après les
fonctions, mais, d’un point de vue pratique, vous ne devriez
pas vous en rendre compte.
Qu’en est-il de leurs objectifs ? Les alias servent
généralement, mais pas uniquement, à transformer une
longue commande en quelque chose de beaucoup plus
court, plus facile à mémoriser (par exemple, alias wgetpage =
"wget --html-extension --recursive --convert-links --page-
requisites --no-parent"), ou pourajouter les arguments
souhaités aux commandes (par exemple, alias lsd = "ls -d
* /"). Les fonctions correspondent à des séquences de
commandes beaucoup plus longues ou plus complexes,
souvent avec une logique et des boucles. Ainsi, les
opérations suivantes seront possibles avec une fonction
(voir la section « Afficher toutes les fonctions »), mais
impossible avec un alias :

listfunc () {

  for func in $(compgen -A function | grep -v _);

  do

    declare -f $func;

    echo -e "\r";

  done

Toutefois, la différence la plus importante, qui va mériter


quelques explications, réside dans la manière dont les alias
et les fonctions traitent les arguments. Les alias
transmettent essentiellement tous les arguments à la fin de
la commande qui est objet de l’alias, dans l’ordre dans
lequel ils ont été saisis. En revanche, les fonctions du shell
vous permettent de capturer les arguments, puis de les
réorganiser, de les tester, de les supprimer et de les
manipuler.

Info
Un argument est une entrée passée à une commande. Par
exemple, supposons que la fonction mkcd () { mkdir -p "$1"; cd "$1";
} soit définie. Lorsque vous saisissez mkcd cthulhu et appuyez sur
Entrée, cthulhu est un argument. Les paramètres sont définis par
la fonction ou le programme. Dans le cas de la fonction
précédente, $1 définit le paramètre. (De façon plus précise, $1
est un paramètre positionnel qui fait référence au premier
argument ; si la fonction l’exige, vous pouvez employer d’autres
paramètres positionnels numérotés pour faire référence aux
autres arguments.) La différence entre ces deux notions peut se
voir ainsi : lorsque vous le définissez, il s’agit d'un paramètre ;
lorsque vous l’utilisez, il s’agit d’un argument.
Vous voudrez peut-être essayer d’utiliser un paramètre
positionnel avec un alias, mais c’est une bataille perdue
d’avance. L’argument fourni à un alias de commande est
toujours utilisé à la fin :

$ alias lstest="ls -l $1 | grep tar"

$ lstest /bin

grep: /bin: Is a directory

$ unalias lstest

Quelle est la raison de cet échec ? Puisque bash ajoute


automatiquement l’argument, dans ce cas /bin, à la fin de la
commande, juste après grep tar, vous ne créez pas ls -l
/bin | grep tar, comme vous le voudriez, mais ls -l | grep
tar /bin. C’est pourquoi grep signale une erreur : vous lui
demandez de rechercher le mot « tar » dans un nom de
répertoire plutôt que dans un fichier ou une liste de fichiers.
Cela ne fonctionne pas.
Maintenant que nous comprenons où bash place les
arguments dans un alias – toujours à la fin de la ou des
commandes –, voyons ce qui se passe avec une fonction :

$ lstest () { ls -l $1 | grep tar; }

$ lstest /bin

-rwxr-xr-x root root tar*

-rwxr-xr-x root root unicode_start*

Cet exemple ne pose pas de problème car une fonction


permet de placer l’argument à l’endroit souhaité, ce qui,
dans ce cas, se situe juste après la première commande, ls
-l $1.
Les alias et les fonctions ont tous deux leur place dans
votre boîte à outils. Plus vous maîtriserez Linux, plus vous
commencerez à les utiliser.

Conclusion
Un des objectifs de tout utilisateur Linux est de réduire
autant que possible le nombre de caractères nécessaires
pour exécuter des commandes. Les premiers développeurs
d’Unix étaient sensibles à ce principe, c’est pourquoi on
tape ls et non list, et mkdir et non make- Directory. Les
commandes que vous venez de découvrir, history,    alias et
function, vous aideront dans ce sens. Vous en avez assez de
taper des commandes interminables ? Répétez-les grâce
aux informations contenues dans history, ou créez un alias
ou une fonction pour les invoquer plus rapidement. Cela
vous épargnera de la saisie et soulagera votre clavier (et
plus important, vos mains et vos poignets).
Chapitre 13
Surveillance des
ressources système
Un bon utilisateur d’ordinateur doit être un peu
administrateur système – il doit surveiller la santé de sa
machine pour s’assurer que tout fonctionne correctement.
Linux offre plusieurs commandes qui permettent de
surveiller les ressources du système. Vous en découvrirez
plusieurs au cours de ce chapitre. La plupart d’entre elles
ont de multiples utilisations, mais toutes ont une spécialité
en matière de surveillance. Ces commandes peuvent
conserver la trace des programmes en cours d’exécution (ps
et top), mettre fin à des processus (kill), énumérer tous les
fichiers ouverts (lsof) ou surveiller l’utilisation de la RAM
(free) et de l’espace disque (df et du). Apprenez à maîtriser
ces outils, car vous les utiliserez dans de nombreuses
situations.

Connaître la durée d’activité de votre


ordinateur

uptime

Si vous voulez savoir depuis combien de temps votre


ordinateur est en marche, servez-vous de la commande
uptime, plutôt facile à utiliser :
$ uptime

22:07:10 up 22 days, 23:29, 1 user, load average: 0.46, 0.63,


0.52

Mais pourquoi chercherait-on à connaître la durée de


fonctionnement de l’ordinateur ? Pour commencer, un peu
de vantardise ne fait pas de mal. Vingt-deux jours, ce n’est
pas si mal, mais j’ai vu des scores bien plus importants.
Faites quelques recherches et vous verrez que des gens
comparent les durées d’activité pour savoir qui affiche la
plus longue, ce qui est toujours amusant.
Une raison plus utile est de déterminer si un redémarrage
a bien eu lieu. Par exemple, j’utilise parfois ssh (voir le
chapitre 16, « Travail sur le réseau ») pour me connecter à
un serveur distant, le redémarrer, attendre quelques
instants, puis m’y reconnecter. Pour savoir si le redémarrage
a réussi, uptime est un moyen rapide.

Afficher tous les processus en cours


d’exécution

ps aux

Il arrive qu’un programme se bloque, cesse de répondre et


qu’il faille le fermer. On peut aussi souhaiter connaître les
programmes exécutés par un utilisateur donné ou savoir
quels sont les processus actifs sur sa machine. Dans tous
ces cas de figure et dans de nombreux autres, on peut se
servir de la commande ps (process status) pour afficher la
liste des processus existants sur le système.
Malheureusement, ps existe en différentes versions,
chacune dotée de différentes options. Elles peuvent même
avoir des significations différentes suivant que ces options
sont précédées d’un trait d’union ou non. u et -u sont deux
choses totalement différentes, par exemple. Jusqu’à
présent, toutes les options ont été introduites par un trait
d’union ; avec ps, ce n’est pas toujours le cas.
Pour afficher tous les processus du système exécutés par
n’importe quel utilisateur, utilisez ps suivi des options a
(pour all users, tous les utilisateurs), u (pour user-oriented,
afin d’afficher les utilisateurs propriétaires de processus) et
x (pour afficher tous les processus qui n’ont pas de terminal
de contrôle – une autre manière de dire « tous les processus
»). Sachez que la liste qui va s’afficher est généralement
longue (132 lignes sur mon ordinateur).

$ ps aux

USER       PID %CPU %MEM     VSZ   RSS TTY      STAT START  


TIME

➥ COMMAND

scott    24224  4.1  4.2 1150440 44036 ?        R   11:02  


12:03

➥/home/scott/.cxoffice/bin/wine-preloader

scott        5594    0.0    0.1        3432    1820


pts/6    S+  12:14    0:00

➥ssh scott@humbug.machine.com
scott        14957    0.3    7.5    171144 78628
?        Sl  13:01    0:35

➥/usr/lib/openoffice2/program/soffice.bin-writer

scott        12369    0.0    0.0            0        0 ?                Z   


15:43    0:00

➥ wine-preloader] <defunct>

scott        14680    0.0    0.1        3860    1044


pts/5    R+  15:55    0:00

➥ ps aux

Astuce
Si vous exécutez ps aux, vous noterez que, par défaut, la sortie
est coupée au niveau du bord de la fenêtre de la console. Il est
donc possible que certaines informations très utiles ou
importantes ne soient pas visibles. Pour voir l’intégralité des
lignes de la sortie, ajoutez l’option -w (comme wrap, pour
passage à la ligne automatique) : ps aux -w.
La commande ps donne de nombreuses informations,
dont l’utilisateur propriétaire du processus, le numéro
d’identifiant unique du processus (PID), le pourcentage
d’utilisation du processeur (%CPU) et de la mémoire (%MEM),
l’état courant (STAT) du processus et le nom du programme
auquel il est attaché.
La colonne STAT affiche différentes lettres, celles qui
suivent sont les plus importantes :

Lettre STAT Signification


R En cours d'exécution
S Endormi
T Arrêté
Z Zombie

Un Z est une mauvaise nouvelle, car cela signifie que le


processus est terminé mais qu’il ne peut être détruit
(heureusement pour vous, cela ne signifie pas qu’il va
tenter de vous manger le cerveau). Si vous avez un
problème avec un programme et que ps vous informe que
son état est Z, vous serez sans doute obligé de redémarrer
votre machine pour le détruire totalement (le processus, pas
le programme, bien sûr).
Comme ps aux affiche beaucoup de données et qu’il peut
donc être difficile de retrouver le programme que l’on
cherche, on filtre généralement la liste avec grep.

$ ps aux | grep [f]irefox

scott    25205    0.0    0.0        4336            8 ?                S   


Feb08    0:00

➥/bin/sh /opt/firefox/firefox
scott   25213  1.1 10.9  189092 113272 ?        Rl  Feb08  
29:42

➥/opt/firefox/firefox-bin

Vous savez maintenant quelles sont les instances de


Firefox qui s’exécutent sur cette machine, quel utilisateur
exécute ces programmes, quelle est la part des ressources
qu’ils utilisent et depuis combien de temps ils fonctionnent.
Utile, non ?

Astuce
Pourquoi avoir fait une recherche sur [f]irefox et non sur firefox ?
Vous trouverez la réponse à la section « Rechercher des mots
spécifiques dans la sortie d’autres commandes » du chapitre 10,
« Recherche d’éléments ».

Afficher l’arborescence des processus

ps axjf

Dans l’univers Linux, les processus ne naissent pas par


génération spontanée. Souvent, le fait de lancer un
programme lance des processus. Tous proviennent, au final,
de init, la mère de tous les processus, qui a toujours le PID
1. La commande ps affiche une représentation textuelle de
cette arborescence, ce qui permet de voir quels processus
ont donné naissance à d’autres processus. Pour afficher
cette arborescence, utilisez les options a et x avec en plus
l’option j (pour format de contrôle de job de BSD, qui
détermine les colonnes affichées) et l’option f (pour forêt,
ce qui évoque une arborescence).

$ ps axjf

PPID    PID COMMAND

   1   7558 /usr/sbin/gdm

 7558  7561  \_ /usr/sbin/gdm
 7561  7604      \_ /usr/X11R6/bin/X :0

 7561  8225      \_ /bin/sh /usr/bin/startkde

 8225  8279          \_ /usr/bin/ssh-agent

 8225  8341          \_ kwrapper ksmserver

   1   8316 kdeinit Running...

 8316 10842  \_ konqueror [kdeinit] --silent

 8316 29663  \_ quanta

 8316 30906  \_ /usr/bin/kwrite /home/scott/analysis

 8316 17893  \_ /usr/lib/opera/9.0-20060206.1/opera

17893 17960  |   \_ /usr/lib/opera/pluginwrapper

17893 17961  |   \_ /usr/lib/opera/plugincleaner

Info
Normalement, les colonnes suivantes sont affichées :
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND

Pour que l’arborescence des commandes soit plus facile à


comprendre, nous avons retiré une grande partie des colonnes
produites par ps axjf. Les résultats ont également été tronqués.

Notez que ps axjf affiche une nouvelle colonne, PPID


(Parent Process ID), qui est l’identifiant du processus parent
– celui qui a créé le PID. Grâce au PPID et au PID, vous allez
pouvoir mettre fin au processus en cours d’exécution,
comme vous le verrez bientôt à la section « Mettre fin à un
processus ».

Info
La commande pstree affiche elle aussi une arborescence des
processus. Puisqu’elle n’est pas fournie avec toutes les
distributions, vous devrez peutêtre l’installer vous-même (pour
savoir comment procéder, consultez le chapitre 14, «
Installation de logiciels »).

Afficher les processus d’un utilisateur


donné

ps U [nom utilisateur]
Jusqu’à présent, nous avons affiché la liste de tous les
processus du système. Pour limiter cet affichage aux
processus d’un seul utilisateur, utilisez l’option U suivie du
nom ou de l’identifiant de l’utilisateur.

$ ps U scott

  PID TTY   STAT TIME COMMAND


14928 ?     S    0:00 /usr/lib/openoffice2/program/soffice

➥-writer

14957 ?     Sl   0:42 /usr/lib/openoffice2/program/soffice.bin

➥-writer

4688  pts/4 S+   0:00 ssh scott@humbug.machine.com

26751 ?     Z    0:00 [wine-preloader] <defunct>

27955 pts/5 R+   0:00 ps U scott

Bien entendu, ps n’inclut pas le nom de l’utilisateur dans


le listing, puisqu’il est déjà présent dans la commande
saisie.

Astuce
Si vous ne connaissez pas l’identifiant d’un utilisateur, regardez
dans /etc/ passwd. Localisez le nom de l’utilisateur, son identifiant
figure dans la troisième colonne.

Mettre fin à un processus

kill

killall

Parfois, un programme rencontre des problèmes et il n’est


pas possible de le fermer normalement. Dans l’interface
graphique, comme GNOME ou KDE, vous cliquez de façon
répétée sur le bouton de fermeture, mais rien ne se passe ;
dans le shell, vous appuyez sur Ctrl+C sans parvenir à
stopper une commande en cours d’exécution. Lorsque cela
se produit, utilisez la commande kill.
Vous pouvez employer plusieurs signaux avec la
commande kill afin de modifier l’exécution d’un processus
donné, allant de « S’il te plaît, termine-toi en faisant le
ménage » à « Meurs maintenant ! », en passant par «
Termine-toi dès que tu le peux ». Nous allons nous pencher
sur les trois plus importants. Vous pouvez préciser l’intensité
de la « destruction » du processus à l’aide d’un mot ou d’un
nombre (l’utilisation d’un mot est plus compréhensible et
donc préférable), comme le montre le tableau 13.1.

Tableau 13.1 Signaux classiques associés à la commande kill


Numéro Mot Signification
du du
signal signal
-1 -HUP Le processus de contrôle est mort (si cela s'applique
(hang à un service système, recharger les fichiers de
up) configuration et redémarrer le processus)
-15 -TERM Met un terme au processus en douceur et nettoie les
processus et les fichiers
-9 -KILL Arrête immédiatement ce que tu es en train de faire
et meurs sur-le-champ

En principe, il faut commencer par essayer -15 (ce qui est


le comportement par défaut si vous utilisez kill sans
option). Vous laissez ainsi au programme la possibilité de
fermer tous les processus qui dépendent de lui, les fichiers
qu’il a ouverts, etc. Si vous attendez un moment et que le
processus ne répond toujours pas et ne se termine pas,
vous pouvez sortir l’artillerie lourde et utiliser -9. Cette
option équivaut à un arrêt brutal, avec des fichiers et des
processus qui peuvent rester ouverts et « polluer » votre
système, ce qui n’est jamais bon.
L’option -1 ou -HUP concerne essentiellement les services
comme Samba ou les connexions sans fil. Vous l’utiliserez
rarement, mais vous devez savoir à quoi elle correspond.
Voici ce que vous devez faire si gvim (qui fonctionne bien
en principe ; ce n’est qu’un exemple) semble bloquer votre
système.

$ ps U scott

  PID TTY   STAT TIME COMMAND


14928 ?     S    0:00 /bin/sh /usr/lib/openoffice2/program/

➥soffice -writer

4688  pts/4 S+   0:00 ssh admin@bacon.humbug.com

26751 ?     Z    0:00 [wine-preloader] <defunct>

  743 ?     Ss   0:00 /usr/bin/gvim

  833 pts/5 R+   0:00 ps U scott

$ kill 743

$ ps U scott

  PID TTY   STAT TIME COMMAND


14928 ?     S    0:00 /bin/sh /usr/lib/openoffice2/program/

➥soffice -writer

 4688 pts/4 S+   0:00 ssh admin@bacon.humbug.com

26751 ?     Z    0:00 [wine-preloader] <defunct>

  743 ?      Ss  0:00 /usr/bin/gvim

  833 pts/5 R+   0:00 ps U scott

Pour mettre un terme à gvim, on utilise ps pour connaître


son PID (743 dans cet exemple). On élimine ensuite ce PID
(souvenez-vous que par défaut, kill utilise l’option TERM) et
l’on vérifie que le processus a bien été détruit en utilisant de
nouveau ps. On constate que gvim a disparu.

Info
Pourquoi ne pas avoir éliminé le PID 26751 qui affiche l’état Z
(STAT) signifiant qu’il est considéré comme zombie ? Simplement
parce que -9 ne fonctionne pas sur un zombie ; comme il est
déjà « mort », la commande kill n’a aucun effet sur lui. Le seul
moyen de résoudre de problème (généralement peu important)
est de redémarrer.
Pour utiliser kill, nous devons indiquer un PID. Mais que
pouvonsnous faire lorsqu’un programme a plusieurs PID ?
Nous pourrions exécuter kill avec chaque PID, mais cette
méthode est fastidieuse, voire désagréable. Dans ce cas, il
est préférable d’employer killall à la place de kill. Cette
commande utilise non pas les PID mais les noms des
processus. Elle est donc d’un usage plus aisé dans ces
situations.
Supposons que cronolog (un programme qui permet de
contrôler la génération des journaux) est totalement
détraqué et que vous deviez l’arrêter. Sur l’un de mes
serveurs, il existe 84 processus pour cronolog et je n’ai
aucune envie d’arrêter chacun d’eux avec kill ! Voici
comment je vais les stopper tous, en un seul tir, avec
killall (cela dit, vous ne devriez procéder ainsi qu’en cas de
nécessité ; servez-vous de killall, et de kill, de manière
responsable).

$ ps aux | grep /usr/bin/cronolog| wc -l

84

$ killall cronolog

$ ps aux | grep /usr/sbin/cronolog | wc -l

La commande ps redirigée vers grep permet de connaître


les processus de cronolog. En envoyant ces résultats à wc -l
(voir le chapitre 7, « Manipulation de fichiers texte avec des
filtres »), nous obtenons le nombre de lignes de la sortie
(84). Nous exécutons killall avec le nom du processus
cronolog. Nous renouvelons la commande ps. Cette fois-ci ?
Plus rien !

Afficher une liste dynamique des


processus en cours
top

Il vous arrivera de constater un ralentissement de votre


machine sans raison apparente. Quelque chose tourne plein
pot sur votre ordinateur et pompe les ressources du
processeur. Ou peut-être avez-vous lancé une commande
sans supposer qu’elle allait utiliser beaucoup plus de cycles
de processeur que vous ne le pensiez. Pour déterminer ce
qui cause ce ralentissement ou si vous souhaitez
simplement savoir ce qui se passe sur votre système, vous
pourriez utiliser ps, mais il n’affiche pas des résultats en
temps réel. Il ne fournit qu’un instantané de l’état des
processus de votre système.
La commande top affiche une liste en temps réel des
processus en cours sur votre système, avec leur
consommation des ressources. C’est évidemment un peu
difficile à montrer dans un livre puisqu’il est impossible de
mettre à jour un listing imprimé, mais c’est à ça que
correspond le code qui suit :

$ top

top - 18:05:03 up    4 days,    8:03,    1 user,    load average:


0.83,

➥0.82, 0.97

Tasks: 135 total,   3 running, 126 sleeping,   2 stopped,

➥4 zombie

Cpu(s): 22.9% us,  7.7% sy,  3.1% ni, 62.1% id,  3.5% wa,

➥0.1% hi,  0.7%

Mem:  1036136k total,  987996k used,   48140k free,   27884k

➥buffers

Swap: 1012084k total,  479284k used,  532800k free,  179580k

➥cached  

   PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+

➥COMMAND

25213 scott      15   0  230m 150m  15m S  11.1 14.9  33:39.34

➥firefox-bin

  7604 root             15      0    409m 285m 2896 S    10.8 28.2


749:55.75

➥Xorg

 8323 scott      15   0 37396 7716 4860 S  2.0  0.7  142:50.89

➥kded

 8491 scott      15   0 45196 9.8m 6156 S  2.0  1.0    0:26.30

➥nautilus

 8378 scott      15   0 37084  10m 7456 S  1.0  1.1   13:53.99

➥kicker

La commande top donne des informations sur le système


dans les cinq premières lignes. Elle énumère ensuite les
processus actifs. Notez qu’elle trie automatiquement les
résultats en fonction de la valeur affichée par la colonne
%CPU. La position d’un même programme peut donc varier
dans le listing en fonction de l’utilisation qu’il fait du
processeur.

Astuce
En appuyant sur ?, vous obtiendrez une aide qui vous permettra
de mieux contrôler top et de l’utiliser au meilleur de ses
capacités. Ces écrans d’aide sont vraiment utiles.

Pour tuer un programme depuis top, appuyez simplement


sur k. En haut du listing, juste après la ligne qui commence
par Swap, vous verrez s’afficher :
PID to kill:

Saisissez le PID du processus à détruire (8026, par


exemple) et appuyez sur Entrée. On vous demande ensuite
de saisir le numéro de signal à utiliser (voir la section «
Mettre fin à un processus ») :
Kill PID 8026 with signal [15]:

Par défaut, top utilise 15. Si cela vous convient, appuyez


simplement sur Entrée ; sinon, saisissez le numéro de signal
à employer et appuyez sur Entrée. Quelques secondes plus
tard, le processus disparaît du listing de top.
Pour quitter top, appuyez sur q.
La commande top est très pratique et vous l’utiliserez
souvent, ne serait-ce que pour savoir ce qui se passe sur
votre machine. Lorsque vous vous posez des questions sur
l’activité de votre ordinateur, top vous apporte une réponse.

Info
L’utilitaire htop commence à prendre le pas sur la commande top
de base. Il propose un affichage déroulable, en couleur, avec des
menus et un joli graphique de l’utilisation de la mémoire. Pour
en savoir plus, consultez le site http://hisham.hm/htop/. Avec
ses fonctionnalités, htop est loin devant top (je l’utilise de
préférence sur le système Linux). Toutefois, il n’est pas toujours
présent sur les distributions standard et vous devrez l’installer
vous-même (voir le chapitre 14).

Afficher la liste des fichiers ouverts

lsof

Au chapitre 1, « Les commandes : ce qu’il faut savoir »,


vous avez vu que tout est fichier sous Linux, y compris les
répertoires, les connexions réseau et les périphériques. Cela
signifie que, si de votre point de vue, un seul fichier est
ouvert, votre système considère que des milliers (oui, des
milliers) de fichiers sont ouverts. Pour afficher la liste
complète des fichiers ouverts, utilisez la commande lsof
(pour list open files).
N’essayez pas pour l’instant : si vous utilisez lsof tout
seul (pour afficher la liste complète des résultats, vous
devez être root), vous verrez apparaître une liste de
plusieurs milliers de fichiers. Sur mon système, 5 497
fichiers sont ouverts et utilisés. lsof peut donc servir à
savoir ce qui se passe sur un système à un moment donné.
En redirigeant la sortie de lsof vers less, vous pouvez
afficher les résultats page par page.

# lsof | less

COMMAND     PID USER  FD  TYPE  DEVICE    SIZE  NODE NAME

init          1 root cwd   DIR     3,1     656     2 /

init          1 root rtd   DIR     3,1     656     2 /

init                    1 root txt    REG        3,1    31608    2072


/sbin/init

init          1 root mem   REG     0,0             0 [heap]

➥(stat: No such file or directory)

init          1 root mem   REG     3,1 1226096 27220 /lib/tls/

➥i686/cmov/libc-2.3.5.so

init          1 root mem   REG     3,1   86596 27536 /lib/

➥ ld-2.3.5.so

init                    1 root 10u    FIFO        0,12                    3915


/dev/initctl

ksoftirqd     2 root cwd   DIR     3,1    656      2 /

Avec 5 497 fichiers, cela fait quand même un nombre de


pages considérable. Vous pouvez donc rediriger lsof vers
grep. Toutefois, vous le verrez un peu plus loin, lsof propose
ses propres options afin de mettre en place un filtrage des
données et ne retenir que celles qui vous intéressent.

Info
La commande lsof dispose d’un nombre conséquent d’options, si
nombreuses que des signes moins et plus sont utilisés avant les
mêmes options de lettre. En d’autres termes, il y a +c et -c, et +d
et -d, et toutes signifient des choses différentes. Cette
commande va peut-être se révéler un peu complexe si vous
commencer à entrer dans les détails. Préparez-vous.

Énumérer les fichiers ouverts par un


utilisateur

lsof -u
Pour afficher les fichiers ouverts par un utilisateur donné
(n’oubliez pas que cela comprend, entre autres, les
connexions réseau et les périphériques), ajoutez l’option -u
à lsof, suivie du nom de l’utilisateur (souvenez-vous que
lsof doit être exécuté en tant que root).

# lsof -u scott

COMMAND        PID USER    FD    TYPE        DEVICE        SIZE    NODE


NAME

evolution    8603 scott 37u    unix 0xe73dc680                    13518


socket

evolution  8603 scott 38r  FIFO        0,5           13520


pipe

evolution  8603 scott 39w  FIFO        0,5           13520


pipe

evolution    8603 scott 40u    REG                3,2        49152 181419


/home/

➥scott/.evolution/addressbook/local/system/addressbook.db

opera     11638 scott cwd   DIR        3,2     7096      6


/home/

➥scott

opera     11638 scott rtd   DIR        3,1      656      2 /

opera        11638 scott txt    REG                3,1 13682540 109226


/usr/

➥lib/opera/9.0-20060206.1/opera

opera     11638 scott mem   REG        0,0               0


[heap]

➥(stat: No such file or directory)

opera        11638 scott mem    REG                3,1        34968 162978


/usr/

➥lib/X11/locale/common/xomGeneric.so.2.0.0

opera        11638 scott mem    REG                3,1    111724 109232


/usr/

➥lib/opera/plugins/libnpp.so

opera        11638 scott mem    REG                3,1        14776    27361


/lib/

➥tls/i686/cmov/libnss_dns-2.3.5.so

opera        11638 scott mem    REG                3,1    286620 103029


/usr/

➥share/fonts/truetype/msttcorefonts/Arial_Bold.ttf

[liste coupée en raison de sa longueur]

Même en filtrant tous les utilisateurs et en n’en


conservant qu’un, il subsiste 3 039 lignes. On trouve
toutefois quelques informations intéressantes. On constate
qu’Evolution (un logiciel de messagerie et d’agenda)
fonctionne tout le temps sans que vous le sachiez ou que
vous l’ayez lancé expressément. Le navigateur Opera est
également actif, ce qui est normal, et l’une des pages web
qu’il affiche utilise la police Arial Bold.
Si vous administrez une machine utilisée par plusieurs
utilisateurs, vous vous rendrez peut-être compte, avec lsof,
que certains programmes sont en cours d’exécution alors
qu’ils ne le devraient pas. Si vous êtes le seul utilisateur de
cette machine, utilisez lsof -u avec vous-même et vous
découvrirez peut-être l’activité de programmes dont vous
ignoriez l’existence.

Énumérer les utilisateurs d’un fichier


donné

lsof [fichier]

Nous venons de voir comment afficher les fichiers ouverts


par un utilisateur donné. Il est possible de faire l’inverse et
d’afficher les utilisateurs d’un fichier donné. Vérifions, par
exemple, qui utilise sshd (le démon SSH), qui sert à se
connecter à distance à cet ordinateur (souvenez-vous que
lsof doit être utilisé en tant que root).

# lsof /usr/sbin/sshd

COMMAND        PID USER    FD    TYPE        DEVICE        SIZE    NODE


NAME

sshd       7814 root  txt   REG        3,1   278492  67453


/usr/

➥sbin/sshd

sshd      10542 root  txt   REG        3,1   278492  67453


/usr/

➥sbin/sshd

sshd            10548 scott txt    REG                3,1    278492    67453


/usr/

➥sbin/sshd

C’est le résultat attendu, deux utilisateurs, root et scott.


Si vous aviez trouvé un utilisateur que vous n’attendiez pas,
c’est que votre sécurité aurait été compromise.

Info
Oui, sshd est un programme mais, du point de vue de Linux, c’est
un fichier.

Énumérer les processus d’un programme


donné

lsof -c [programme]

À la section précédente, nous avons trouvé qui utilisait


/usr/sbin/ sshd. Il est possible d’en apprendre davantage.
Chaque programme est constitué d’appels à des processus,
d’autres programmes, des sockets et des périphériques, qui
tous sont considérés comme des fichiers par Linux. Pour
connaître l’ensemble des fichiers utilisés par un programme
donné, utilisez lsof avec l’option -c suivie du nom du
programme. La commande lsof /usr/sbin/sshd nous indiquait
que deux utilisateurs et trois fichiers étaient associés à ce
fichier. Mais qu’en est-il avec la commande sshd ?

# lsof -c sshd

COMMAND        PID USER    FD    TYPE        DEVICE        SIZE    NODE


NAME

sshd      10542 root  mem   REG        3,1    37480  27362


/lib/

➥tls/i686/cmov/libnss_files-2.3.5.so

sshd      10542 root  mem   REG        3,1    34612  27396


/lib/

➥tls/i686/cmov/libnss_nis-2.3.5.so

sshd      10542 root  mem   REG        3,1    86596  27536


/lib/

➥ld-2.3.5.so

sshd      10542 root   0u   CHR        1,3            1237


/dev/

➥null

sshd      10542 root   1u   CHR        1,3            1237


/dev/

➥null

sshd      10542 root   2u   CHR        1,3            1237


/dev/

➥null

sshd      10542 root   3u  IPv6      28186                 TCP

➥192.168.0.170:ssh->192.168.0.100:4577 (ESTABLISHED)

sshd            10542 root    5u    unix 0xf2961680                    28227


socket

sshd      10548 scott cwd   DIR        3,1      656      2 /

sshd      10548 scott rtd   DIR        3,1      656      2 /

sshd            10548 scott txt    REG                3,1    278492    67453


/usr/

➥sbin/sshdp

sshd      10548 scott  3u  IPv6      28186                 TCP

➥192.168.0.170:ssh->192.168.0.100:4577 (ESTABLISHED)

[liste coupée en raison de sa longueur]

Le code précédent n’affiche que quelques-unes des 94


lignes (représentant 94 fichiers) associées au programme
sshd. Plusieurs d’entre elles sont des fichiers .so (shared
object, objet partagé, un peu comme les DLL de Windows).
Vous pouvez aussi constater qu’une connexion réseau est
établie entre cette machine et une autre (en fait, cette
machine sur le réseau est connectée à mon ordinateur via
SSH ; pour plus d’informations à ce sujet, consultez la
section « Se connecter de façon sécurisée à un autre
ordinateur » au chapitre 16).
En appliquant lsof aux différentes commandes de votre
ordinateur, vous constaterez à quel point les programmes
modernes sont complexes. Faites le test avec des
applications que vous utilisez tous les jours ; vous n’en
aurez que plus d’estime pour les programmeurs qui les ont
conçues.

Info
La commande lsof est dotée d’un nombre d’options assez
considérable dont nous n’avons présenté qu’un échantillon. Le
code source de lsof inclut un fichier nommé 00QUICKSTART (ce sont
des zéros au début), qui est un didacticiel pour certaines
fonctions plus puissantes de la commande. Vous pouvez aussi
rechercher des informations complémentaires à son sujet sur
Google.

Afficher des informations sur la RAM

free

Les ordinateurs actuels sont équipés de plusieurs gigaoctets


de RAM, mais il arrive encore qu’une machine ralentisse à
cause d’une utilisation intensive de la RAM ou des transferts
avec la mémoire virtuelle (swap). Pour afficher l’état courant
de la RAM sur votre machine, utilisez la commande free.

$ free

            total     used     free    shared   buffers   cach
ed

Mem:            1036136    995852        40284                0        80816   


332264

-/+ buffers/cache:  582772   453364

Swap:     1012084   495584   516500

Par défaut, free affiche le résultat en ko, comme si vous


aviez utilisé l’option -k. L’option -b permet d’afficher les
valeurs en octets et l’option -m (celle que vous utiliserez
sans doute le plus souvent) en Mo.

$ free

            total     used     free    shared   buffers   cach
ed

Mem:                1011            963            48               


0        78      316

-/+ buffers/cache:     569      442

Swap:         988      483      504

Vous pouvez constater que cette machine est dotée de 1


011 Mo de RAM physique (1 024 en fait, mais free affiche 1
011 car le noyau accapare les 13 Mo restants qui ne
peuvent être mis à disposition pour d’autres utilisations). La
première ligne indique que 963 Mo sont utilisés et qu’il reste
48 Mo libres. Le fichier d’échange ou la mémoire virtuelle
fait pratiquement 1 Go et 483 Mo sont utilisés. C’est du
moins ce que laissent supposer ces informations.
Les choses ne sont toutefois pas si simples. La ligne
importante est celle du milieu, celle nommée -/+
buffers/cache. Les disques durs utilisent des tampons (de la
mémoire que Linux réserve aux processus) et des caches
(des fichiers auxquels on a accédé récemment et stockés
dans de la mémoire inutilisée pour les retrouver
rapidement) afin de réduire les temps d’accès. Cette
mémoire peut être rapidement libérée et mise à la
disposition d’un programme qui en a besoin. Du point de
vue des applications qui fonctionnent sur cette machine,
569 Mo de RAM sont actuellement utilisés. Pour arriver à ce
total, prenez les 963 Mo de la première ligne, puis
soustrayez les 78 Mo des tampons et les 316 Mo des fichiers
en cache. Le résultat, 569 Mo, correspond à la valeur
indiquée dans la deuxième colonne. La quantité totale de
RAM disponible est de 442 Mo (1 011 Mo moins les 569 Mo).
Il faut y ajouter l’espace d’échange disponible. Linux est
tout sauf inefficace lorsqu’il s’agit de gérer la mémoire.
Astuce
Pour de plus amples informations sur free et la gestion de la
mémoire dans Linux, je vous recommande le site LinuxMM, « un
wiki de documentation sur le fonctionnement de la gestion de la
mémoire et de coordination des nouveaux projets de
développement de la gestion de la mémoire » (http://linux-
mm.org). Pour des informations un peu moins techniques,
consultez le site www.linuxatemyram.com.

Afficher l’utilisation des systèmes de


fichiers

df

La commande free concerne la RAM du système ; la


commande df (pour disk free) permet de connaître la
quantité d’espace libre sur des disques. Exécutez-la pour
obtenir une liste de l’espace disque disponible et utilisé pour
tous les systèmes de fichiers montés.

$ df

Filesystem  1K-blocks     Used Available Use% Mounted on

/dev/hda1     7678736  5170204   2508532  68% /

tmpfs          518068        0    518068   0% /dev/shm

tmpfs          518068    12588    505480   3% /lib/modules/

➥2.6.12-10-386/volatile

/dev/hda2    30369948 24792784   5577164  82% /home

Avant d’analyser les résultats en détail, facilitons leur


lecture. La commande df affiche par défaut les résultats en
ko, ils sont toutefois généralement plus faciles à
comprendre grâce à l’utilisation de l’option -h (ou --human-
readable).

$ df -h

Filesystem  Size  Used Avail Use% Mounted on

/dev/hda1   7.4G  5.0G  2.4G  68% /

tmpfs       506M     0  506M   0% /dev/shm

tmpfs       506M   13M  494M   3% /lib/modules/2.6.12-10-386/

➥volatile

/dev/hda2    29G   24G  5.4G  82% /home

Grâce à cette option, les kilo-octets sont représentés par


K, les mégaoctets par M et les gigaoctets par G.
Que signifient ces résultats ? Il y a deux partitions sur le
disque dur : /dev/hda1 montée sur / et /dev/hda2 montée sur
/home. La partition /home dispose de 29 Go dont 82 % sont
utilisés, ce qui laisse 5,4 Go de libre. Dans quelque temps,
cette partition sera pleine et vous devrez supprimer certains
fichiers qui y sont stockés pour libérer de l’espace.
La partition racine ou / n’a que 2,4 Go de libre sur 7,4 Go.
Cette partition ne devrait toutefois pas trop grandir car elle
ne contient que des programmes et des fichiers statiques.
Le répertoire /var y figure, et c’est là que que se trouvent les
utilitaires d’installation de logiciels (voir le chapitre 14) et
d’autres fichiers susceptibles de changer de taille, comme
les journaux du système. Il reste toutefois suffisamment
d’espace sur la partition, sauf si vous envisagez d’installer
de grosses applications ou un serveur Web ou de base de
données.
Les deux autres partitions sont nommées tmpfs et sont
des systèmes de fichiers temporaires utilisés par la mémoire
virtuelle (swap). Lorsque vous éteignez votre ordinateur, le
contenu de ces deux partitions est effacé.

Astuce
Pour plus d’informations sur tmpfs, consultez l’article Wikipédia à
l’adresse suivante : http://en.wikipedia.org/wiki/TMPFS.

Afficher l’espace disque utilisé par un


répertoire
du

La commande df s’applique à un disque entier, mais


comment faire pour connaître l’espace disque utilisé par un
répertoire et son contenu ? La commande du (pour disk
usage) permet d’afficher ce type d’informations. Utilisez
d’abord la commande cd pour atteindre le répertoire et,
ensuite, la commande du.

$ cd music

$ du

36582   ./Donald_Fagen

593985  ./Clash

145962  ./Hank_Mobley/1958_Peckin’_Time

128200  ./Hank_Mobley/1963_No_Room_For_Squares

108445  ./Hank_Mobley/1961_Workout

382615  ./Hank_Mobley

2662185 .

[liste coupée en raison de sa longueur]

Comme avec df, les résultats sont exprimés en ko. Là


encore, vous pouvez utiliser l’option -f (ou --human-readable)
pour faciliter la lecture des résultats.

$ cd music

$ du -h

36M     ./Donald_Fagen

581M    ./Clash

143M    ./Hank_Mobley/1958_Peckin’_Time

126M    ./Hank_Mobley/1963_No_Room_For_Squares

106M    ./Hank_Mobley/1961_Workout

374M    ./Hank_Mobley

2.6G    .

[liste coupée en raison de sa longueur]

Le résultat montre l’espace disque utilisé par chaque


sous-répertoire. Le répertoire Hank_Mobley occupe 374 Mo sur
ce disque. Ce total provient de la somme (arrondie du fait
de l’utilisation de -f) de la taille des trois sous-répertoires
qu’il contient. S’il avait été légèrement supérieur à la
somme de la taille de tous les sous-répertoires, ceci aurait
signifié que le répertoire Hank_Mobley contenait des fichiers
isolés, placés en dehors des sous-répertoires.
Pour finir, la totalité du répertoire /music représente 2,6
Go.

Astuce
Pour obtenir les tailles des répertoires et des fichiers, utilisez -a
(ou --all). Si vous souhaitez des résultats triés en fonction de
l’espace, utilisez du | sort -rn (ou --reverse et --numeric-sort). La
commande du génère les valeurs, sort (voir au chapitre 7) les
ordonne. L’option -r place la valeur la plus élevée au début, puis
viennent les valeurs par ordre décroissant. L’option -n s’assure
que les nombres sont triés correctement (essayez sans et vous
comprendrez). Si vous avez envie de vous amuser, redirigez les
résultats vers un fichier (> toomuchcrap.txt) dont le contenu sera
délimité par des tabulations, prêt à être importé dans une
feuille de calcul créée avec LibreOffice.

Si vous êtes particulièrement ambitieux et décidez d’exécuter du


sur l’intégralité du disque dur, n’oubliez pas d’ajouter un tube
vers grep (voir le chapitre 10) entre du et sort de façon à retirer
les répertoires inutiles. Par exemple : du | grep -v /dev -v /proc |
sort -rn.

Afficher uniquement l’espace total


occupé par un répertoire

du -s

Si vous ne souhaitez pas afficher d’informations sur les


sous-répertoires d’un répertoire, mais obtenir simplement sa
taille totale, utilisez l’option -s.
$ cd music

$ du -hs

2.6G    .

Concis et pratique.

Conclusion

Pratiquement toutes les commandes que vous avez


découvertes ici disposent d’équivalents dans l’interface
graphique. Mais si votre système ne répond plus, si vous
êtes connecté à une autre machine via SSH (voir chapitre
16) et que vous ne pouvez pas utiliser l’interface graphique,
ou encore si vous souhaitez utiliser l’outil le plus rapide,
vous devrez employer la ligne de commande. Les
commandes de ce chapitre sont faciles à mémoriser grâce à
leur nom :
• ps (affiche les processus en cours) ;
• kill (« tuer » un processus) ;
• top (liste des processus actifs, les plus gourmands en
tête) ;
• lsof (liste des fichiers ouverts) ;
• free (mémoire libre ou disponible) ;
• df (espace disque libre) ;
• du (utilisation du disque).
Familiarisez-vous avec ces commandes sur votre
ordinateur et n’ou-
bliez pas de consulter les pages man qui les concernent,
car vous n’avez vu ici qu’une infime partie des possibilités
qu’elles offrent. La plupart sont dotées de nombreuses
options, notamment ps, top et lsof, qui permettent de faire
un vrai travail de détective avec les ordinateurs placés sous
votre surveillance.
Chapitre 14
Installation de logiciels
Les distributions Linux sont formées par défaut de milliers
de paquetages logiciels. Immédiatement après l’installation
de base, vous pouvez surfer sur Internet, rédiger des
rapports, créer des feuilles de calcul, afficher et manipuler
des images et écouter de la musique. Même avec cette
abondance de logiciels, vous aurez sans doute besoin
d’installer d’autres outils plus spécifiques. Heureusement,
Linux vous facilite la tâche.
La croyance populaire veut qu’avec Linux il faille compiler
tous les logiciels que l’on souhaite installer. Vous pouvez
continuer à le faire (et de nombreuses personnes le font
encore), mais ce n’est pratiquement plus jamais nécessaire
aujourd’hui. Vous disposez désormais d’outils simples et
efficaces pour installer ce que vous souhaitez ajouter sur
votre système.
Il faut comprendre une chose importante avant de
poursuivre. Dans le monde Linux, il existe différents formats
de paquetages d’applications, dont les plus répandus sont
RPM et DEB (et ce sont les deux dont il sera question dans
ce chapitre). Le format RPM est utilisé par des distributions
telles que Red Hat (d’ailleurs, RPM signifie Red Hat Package
Manager), Fedora, Core, SUSE, etc. Le format DEB est utilisé
avec les distributions dérivées de Debian, comme Debian,
Ubuntu et ses nombreux descendants, Linux Mint, Knoppix
et bien d’autres. Il est souhaitable de savoir utiliser ces
deux formats, mais intéressez-vous plus particulièrement à
celui qui correspond à votre distribution.
Les sections de ce chapitre seront marquées par le format
de paquetage concerné : RPM pour les distributions qui
utilisent le format RPM et DEB pour les distributions
dérivées de Debian. Et, pour être certain que vous ne soyez
pas perdu, si vous voyez RPM, YUM ou APT, sachez que je
fais référence au système de gestion des paquetages, alors
que si vous voyez rpm, yum ou apt, il s’agit des commandes
réelles.

Astuce
Pour plus d’informations sur les différents formats et les
distributions qui les utilisent, consultez la page « Package
Management Cheatsheet » sur le site DistroWatch
(http://distrowatch.com/dwres.php?resource=package-
management).

Installer des paquetages RPM

rpm -ihv [paquetage]

rpm -Uhv [paquetage]

La commande rpm permet d’installer les paquetages logiciels


dont l’extension est .rpm, ce qui semble logique. Pour
installer un paquetage RPM, il faut commencer par le
télécharger. Prenons l’exemple du scanner de port nmap, dont
le paquetage de trouve à l’adresse
www.insecure.org/nmap/download.html. Une fois le
fichier récupéré, il suffit d’exécuter rpm avec trois options : -i
(pour install), -h (pour afficher la progression de l’installation
grâce à des caractères #) et -v (pour verbose) afin
d’afficher des détails sur l’installation. Voici la commande
correspondante, qui doit être exécutée en tant que root (ou
en utilisant sudo, si votre distribution l’exige ; voir la section
« Installer des paquetages DEB » plus loin dans ce chapitre)
:

# rpm -ihv nmap-6.40-4.el7.x86_64.rpm

Ce n’est toutefois pas la commande qu’il faut exécuter. Il


est préférable d’employer -Uhv ; le -U signifie Upgrade (mise
à jour). Pourquoi -U et non -i ? Simplement parce que -i
installe et -U met à jour et installe. Si un paquetage figure
déjà sur votre machine et que vous essayez d’en installer un
plus récent, -U effectue une mise à jour : si le paquetage
n’est pas présent, -U en prend note et l’installe. Utilisez
systématiquement -U. Que vous installiez ou mettiez à jour
un paquetage, il fera ce qui doit être fait sans que vous ayez
à trancher.

# rpm -Uhv nmap-6.40-4.el7.x86_64.rpm

Preparing...          ###################### [100%]

Updating / installing...

   1:nmap-2:6.40-4.el7 ###################### [100%]

Si vous souhaitez installer plusieurs RPM, ajoutez-les les


uns à la suite des autres en les séparant par un espace :

# rpm -Uhv nmap-6.40-4.el7.x86_64.rpm nmap-frontend-6.40-


4.el7.

➥noarch.rpm

Vous pouvez aussi utiliser des caractères jokers si vous


devez installer un grand nombre de paquetages. Si vous
avez, par exemple, vingt fichiers .rpm dans un répertoire
nommé software, vous pouvez les installer tous en utilisant
la commande qui suit :

# rpm -Uhv software/*.rpm


Attention
L’option -U est la plus appropriée, sauf pour l’installation d’un
noyau. Dans ce cas, choisissez l’option -i. Si vous utilisez -U et si
le nouveau noyau ne fonctionne pas, vous serez dans le pétrin.
Si vous installez avec -i, en revanche, l’ancien noyau figurera
toujours sur votre machine comme sauvegarde en cas de
défaillance du nouveau.

Désinstaller des paquetages RPM

rpm -e [paquetage]

Il est encore plus simple de désinstaller des paquetages que


de les installer. Utilisez simplement l’option -e (pour erase,
effacer), suivie du nom du paquetage à effacer.

# rpm -e nmap

C’est tout. L’option -e est silencieuse et n’affiche aucun


résultat. Lorsque vous installez un paquetage avec rpm -Uhv,
vous devez spécifier un nom de fichier, sinon rpm ne peut
pas savoir celui dont il s’agit. Pour supprimer un paquetage
avec rpm -e, en revanche, il suffit de préciser le nom du
paquetage car les fichiers utilisés pour l’installation ont
disparu depuis longtemps et rpm connaît le logiciel à
supprimer grâce au nom du paquetage.

Info
Pour déterminer les paquetages installés sur votre système et
leur identification, utilisez rpm -qa. Outre le nom du paquetage,
vous obtenez également sa version, ce qui peut se révéler
pratique.
Installer un paquetage RPM et ses
dépendances

yum install [paquetage]

La commande rpm est puissante, mais vous vous rendrez


rapidement compte qu’elle peut poser problème lorsque
vous souhaitez installer un paquetage qui dépend d’autres
paquetages. C’est ce que l’on appelle « l’enfer des
dépendances ». Pour installer le paquetage A, vous devez
télécharger et installer les paquetages B et C, mais pour
installer le paquetage    C vous devez aussi télécharger et
installer les paquetages D et E, et pour installer le
paquetage E… aaaaaargh !
Les distributions reposant sur Debian (dont il sera
question plus loin) ont résolu ce problème depuis des
années, grâce à la commande apt, qui est très simple et très
pratique. Les distributions reposant sur RPM peuvent aussi
utiliser apt, mais on lui préfère généralement la commande
yum. Développée à l’origine pour les distributions Yellow Dog
Linux (d’où son nom, qui signifie Yellow Dog Updater
Modified), yum est à présent largement utilisée.
yum installe, met à jour et désinstalle les paquetages en se
fondant sur RPM. Elle gère aussi automatiquement les
dépendances à votre place. Si vous installez le paquetage A,
comme dans l’exemple précédent, yum téléchargera et
installera tous les paquetages requis à votre place. Si, par la
suite, vous n’avez plus besoin du paquetage A, yum peut le
désinstaller, ainsi que toutes ses dépendances, tant que ces
dernières ne sont pas utilisées par d’autres applications sur
l’ordinateur. Enfin, des outils comme YUM (et APT, que nous
verrons plus loin) disposent d’un dépôt qui centralise les
logiciels (une sorte d’App Store, mais avec beaucoup moins
de restrictions !). Vous n’avez donc pas à passer des heures
à rechercher des fichiers RPM individuels.

Info
YUM devrait finir par être remplacé par DNF. DNF, qui signifie
Dandified Yum, est conçu pour être un YUM amélioré,
notamment dans le domaine des performances. Développé
initialement sur Fedora, le temps dira si cette solution sera
adoptée par les autres distributions.

Imaginons que vous vouliez installer Shotwell, un logiciel


de classement des images, qui nécessite d’installer
plusieurs dépendances. Grâce à yum, cette tâche est
beaucoup plus simple qu’avec rpm. Pour commencer, vous
n’avez pas à rechercher et à télécharger le paquetage
Shotwell, car la commande s’en chargera à votre place,
sans oublier ses dépendances.
Malheureusement yum est incroyablement bavarde
lorsqu’elle fonctionne. L’extrait de code qui suit a été
tronqué radicalement et pourtant il reste long. Il permet
quand même de se faire une idée de ce que yum affiche lors
d’une installation.

# yum install shotwell

Resolving Dependencies

--> Running transaction check


---> Package shotwell.x86_64 0:0.14.1-5.el7 will be installed

--> Processing Dependency: libraw.so.5()(64bit) for package:

➥shotwell-0.14.1-5.el7.x86_64
--> Processing Dependency: libgexiv2.so.1()(64bit) for
package:

➥shotwell-0.14.1-5.el7.x86_64
--> Running transaction check
---> Package LibRaw.x86_64 0:0.14.8-5 will be installed

---> Package libgexiv2.x86_64 0:0.5.0-9.el7 will be installed

--> Finished Dependency Resolution

Package    Version       Repository    Size

Installing:

shotwell   0.14.1-5.el7  base          2.8 M

Installing for dependencies:

LibRaw     0.14.8-5      base          250 k

libgexiv2  0.5.0-9.el7   base          61 k

Transaction Summary

Install 1 Package (+2 Dependent packages)

Total download size: 3.1 M

Installed size: 13 M

Is this ok [y/d/N]:

Dès que vous appuyez sur la touche y, yum télécharge et


installe les paquetages et continue de vous informer de la
progression de son travail.

Downloading packages:

(1/3): LibRaw-0.14.8-5.el7.x86_64.rpm   | 250 kB

(2/3): libgexiv2-0.5.0-9.el7.x86_64.rpm |  61 kB

(3/3): shotwell-0.14.1-5.el7.x86_64.rpm | 2.8 MB

Total                          1.9 MB/s | 3.1 MB

Running transaction check

Running transaction test

Transaction test succeeded

Running transaction

 Installing : LibRaw-0.14.8-5.el7.x86_64  1/3

 Installing : libgexiv2-0.5.0-9.el7.x86_64  2/3

 Installing : shotwell-0.14.1-5.el7.x86_64  3/3

 Verifying  : libgexiv2-0.5.0-9.el7.x86_64  1/3

 Verifying  : LibRaw-0.14.8-5.el7.x86_64  2/3

 Verifying  : shotwell-0.14.1-5.el7.x86_64  3/3

Installed:

 shotwell.x86_64 0:0.14.1-5.el7

Dependency Installed:

 LibRaw.x86_64 0:0.14.8-5.el7
 libgexiv2.x86_64 0:0.5.0-9.el7

 Complete!

Enfin, Shotwell est installé et prêt à servir. Voyons


maintenant comment désinstaller Shotwell si ce programme
ne vous convient pas.

Désinstaller un paquetage RPM et ses


dépendances

yum remove [paquetage]

Un des points positifs avec yum, c’est la simplicité de sa


syntaxe. Vous souhaitez installer un paquetage ? yum install.
Vous voulez le désinstaller ? yum remove. Pour supprimer
Shotwell, il suffit donc de saisir cette commande :

# yum remove shotwell

Resolving Dependencies

--> Running transaction check


---> Package shotwell.x86_64 0:0.14.1-5.el7 will be erased

--> Finished Dependency Resolution

Package    Version       Repository    Size

Removing:

shotwell   0.14.1-5.el7  @base         11 M

Transaction Summary

Remove 1 Package

Installed size: 11 M

Is this ok [y/N]:

Même pour un travail aussi simple qu’une désinstallation,


yum ne peut pas s’empêcher de détailler tout ce qu’elle fait.
Appuyez sur la touche y pour confirmer la désinstallation et
afficher encore quelques informations :

Downloading packages:

Running transaction check

Running transaction test

Transaction test succeeded

Running transaction

  Erasing  : shotwell-0.14.1-5.el7.x86_64  1/1

  Verifying : shotwell-0.14.1-5.el7.x86_64  1/1

Removed:

  shotwell.x86_64 0:0.14.1-5.el7

Complete!

Shotwell est désinstallé. Notez que les dépendances


installées par yum (voir section précédente) ne sont pas
supprimées. Comme elles peuvent aussi servir à d’autres
programmes, yum choisit de les laisser en place (c’est
également le comportement par défaut de apt, comme vous
le verrez un peu plus loin).

Info
Pour déterminer les paquetages installés sur votre système et
leur identification par YUM, utilisez yum list installed. Outre le
nom du paquetage, vous obtenez également sa version, ce qui
peut se révéler pratique.

Mettre à jour un paquetage RPM et ses


dépendances

yum update

Votre système Linux contient des centaines, voire des


milliers de paquetages logiciels et de nouvelles mises à jour
apparaissent constamment pour l’un ou l’autre. Surveiller
les mises à jour et les installer pour tous les paquetages de
votre ordinateur serait un travail à plein-temps.
Heureusement, yum facilite beaucoup cette tâche : yum update
permet de demander une vérification des mises à jour pour
les programmes qu’il connaît. Si de nouveaux paquetages
sont disponibles, yum vous en informe et vous demande la
permission de les installer.

# yum update

Resolving Dependencies

--> Running transaction check


---> Package kernel.x86_64 0:3.10.0-229.11.1.el7 will be
installed

---> Package openssl.x86_64 1:1.0.1e-42.el7 will be updated

---> Package openssl.x86_64 1:1.0.1e-42.el7.9 will be an


update

---> Package unzip.x86_64 0:6.0-13.el7 will be updated

---> Package unzip.x86_64 0:6.0-15.el7 will be an update

--> Running transaction check


--> Finished Dependency Resolution

Package    Version              Repository    Size

Installing:

kernel     3.10.0-229.11.1.el7  updates       31 M

Updating:

openssl    1:1.0.1e-42.el7.9    updates       711 k

unzip      6.0-15.el7           updates       166 k

Transaction Summary

Install  1 Package

Upgrade  2 Packages

Total size: 32 M

Is this ok [y/d/N]:

Appuyez sur la touche y pour autoriser yum à charger et à


installer les trois paquetages. Après avoir affiché de
nombreuses informations, yum se met au travail et votre
ordinateur est désormais à jour. Pensez à utiliser yum update
régulièrement car des mises à jour de sécurité sortent très
fréquemment et il est conseillé de les installer.

Trouver les paquetages RPM disponibles


yum search [chaîne]

yum list available

Vous savez maintenant installer et désinstaller des logiciels


avec yum, mais comment trouver des logiciels pour
commencer ? Imaginons que vous soyez intéressé par
Wireshark, un analyseur de paquets formidable. Vous voulez
donc savoir si des paquetages liés à Wireshark sont
disponibles pour une installation avec yum. Vous pourriez
faire yum search wireshark, mais ce ne serait pas une bonne
idée car cette commande recherche une correspondance du
nom saisi dans tous les noms, toutes les descriptions et tous
les résumés des paquetages. Vous allez vous retrouver avec
une liste aussi longue qu’un relevé bancaire de Bill Gates.
Il est préférable de faire une recherche avec yum (ce qui
produit encore une liste interminable) et de rediriger le
résultat vers grep pour filtrer la liste obtenue.

$ yum list available | grep wireshark

wireshark.i686          1.10.3-12.el7_0  base

wireshark.x86_64        1.10.3-12.el7_0  base

wireshark-devel.i686    1.10.3-12.el7_0  base

wireshark-devel.x86_64  1.10.3-12.el7_0  base

wireshark-gnome.x86_64  1.10.3-12.el7_0  base

Il n’y a plus que cinq résultats, ce qui est tout à fait


gérable. Si vous tenez absolument à faire une recherche
complète, utilisez yum search ; autrement, utilisez yum list
available et grep. La plupart du temps, vous utiliserez la
seconde solution.

Astuce
Il existe également des gestionnaires de paquetages graphiques
(voir l’astuce donnée dans la section « Trouver les paquetages
DEB disponibles au téléchargement »). Nombre d’entre eux ont
été conçus pour les distributions fondées sur RPM ou
fonctionnement merveilleusement bien avec elles (et avec
d’autres formats de paquetage également !).

Installer des paquetages DEB

dpkg -i [paquetage]

Comme vous l’avez déjà vu aux sections précédentes,


Debian utilise apt pour gérer l’installation de paquetages.
C’est, à mon avis, le plus simple et le plus puissant de tous
les gestionnaires d’installation de paquetages. Aussi
puissant soit-il, apt s’appuie en fait sur dpkg (tout comme yum
s’appuie sur rpm), qui s’occupe des installations et des
désinstallations sur les machines sous Debian. Avant
d’apprendre à utiliser apt, familiarisez-vous avec dpkg, car apt
ne peut pas tout installer.
Voici un exemple. Skype est l’un des logiciels de VoIP
(voice over IP, communication téléphonique par Internet) les
plus populaires. À cause de sa licence non libre, Skype n’est
pas installé par défaut sur la plupart des distributions. Si
vous voulez l’utiliser, vous devez le télécharger depuis le
site de son éditeur, puis l’installer manuellement. Pour
récupérer Skype pour Linux, rendez-vous sur la page
https://www.skype.com/fr/get-skype/ et sélectionnez le
paquetage qui correspond à votre distribution. Pour notre
exemple, nous utiliserons le paquetage Debian qui,
actuellement, s’appelle skype_debian-4.3.0.37-1_i386.deb.
Une fois le fichier .deb chargé sur votre système, il est
temps de l’installer. Utilisez cd pour atteindre le répertoire
qui contient le fichier .deb et utilisez dpkg pour l’installer.

Info
Sur la plupart des distributions Debian, toutes les commandes
dpkg sont à exécuter en tant que root. Avec Ubuntu, on n’utilise
pas le compte root – on lui préfère la commande sudo. En d’autres
termes, sous Debian, on a :
# dpkg -i skype_debian-4.3.0.37-1_i386.deb

et, avec Ubuntu et les autres distributions qui préfèrent sudo, on


utilise :
$ sudo dpkg -i skype_debian-4.3.0.371.2.0.18-1_i386.deb

Cet ouvrage a été rédigé en utilisant plusieurs machines qui


fonctionnent sous Ubuntu. Si vous voyez sudo à la place d’une
invite du compte root, vous en connaissez à présent la raison.

$ ls

skype_debian-4.3.0.3-1_i386.deb

$ sudo dkpg -i skype_debian-4.3.0.3-1_i386.deb

Selecting previously deselected package skype.

(Reading database ... 97963 files and directories currently

➥installed.)

Unpacking skype (from skype_debian-4.3.0.3-1_i386.deb) ...

Setting up skype (4.3.0.3-1) ...

Et voilà ! La commande dpkg est un modèle de concision ;


elle donne les informations essentielles et rien d’autre.

Désinstaller des paquetages DEB

dpkg -r [paquetage]

Si l’option -i utilisée avec dpkg signifie install, l’option -r


signifie remove ou désinstaller. Si Skype ne vous convient
plus, rien n’est plus simple que de le désinstaller.

# dpkg -r skype

(Reading database ... 98004 files and directories currently

➥installed.)

Removing skype ...

Lorsque vous employez dpkg -i, vous devez spécifier un


nom de fichier, sinon le programme ne saura pas quel
paquetage installer. En revanche, pour une désinstallation
avec dpkg -r, il suffit de spécifier le nom du paquetage car
les fichiers utilisés pour l’installation ont disparu depuis
longtemps et apt connaît le logiciel à supprimer grâce au
nom du paquetage.

Info
Pour déterminer les paquetages installés sur votre système et
leur identification par dpkg, utilisez dpkg -l. Outre le nom du
paquetage, vous obtenez également sa version, son
architecture (en général 32 ou 64 bits) et une courte
description.

Installer un paquetage DEB et ses


dépendances

apt -get install [paquetage]

La commande dpkg est puissante, mais vous vous rendrez


rapidement compte qu’elle peut poser problème lorsqu’on
souhaite installer un paquetage qui a des dépendances.
Pour installer le paquetage A, vous devez télécharger et
installer les paquetages B et C, mais pour installer le
paquetage C, vous devez aussi télécharger et installer les
paquetages D et E, et pour installer le paquetage E…
aaaaaargh ! Il vaut faut APT (Advanced Package Tool).
La commande apt installe, met à jour et désinstalle les
paquetages logiciels. Mieux encore, elle est capable de
gérer automatiquement les dépendances à votre place. Si
vous essayez d’installer le paquetage A, comme dans
l’exemple précédent, apt téléchargera et installera tous les
paquetages requis à votre place. Si par la suite, vous n’avez
plus besoin du paquetage, apt peut le désinstaller, ainsi que
toutes ses dépendances, du moment que ces dernières ne
sont pas utilisées par d’autres applications sur l’ordinateur.
La commande apt a été développée initialement pour la
distribution Debian, en tant qu’interface à dpkg. Elle est
aujourd’hui présente sur toutes les distributions reposant
sur Debian, ce qui comprend Debian, Ubuntu et toutes ses
variantes, Knoppix, Linux Mint et bien d’autres. C’est l’une
des fonctionnalités qui fait de Debian un modèle d’efficacité
et de simplicité. D’autres distributions non-Debian ont
réalisé la puissance de APT et Connectiva a fini par l’adapter
à la prise en charge des paquetages RPM. (Ce chapitre ne
traite de APT que dans le cadre d’une distribution Debian.)

Info
Bien que ce chapitre se focalise sur APT et son utilisation avec
Debian, vous pouvez l’employer avec certaines distributions qui
ont choisi RPM. Pour de plus amples informations, consultez le
site http://apt-rpm.org. L’article « Using apt in an RPM world »
(http://dag.wieers.com/blog/using-apt-in-an-rpm-world) de    Dag
Wieers propose une justification pertinente et un bon
didacticiel. J’ai rédigé un article pour Linux Magazine en 2003
intitulé « A Very Apropos apt » (www.linux-mag.com/id/1476/). Il
est évidemment obsolète sur de nombreux points, mais il
regorge néanmoins de conseils utiles.

Imaginons que vous souhaitiez installer l’éditeur Web


Bluefish avec apt. Pour cela, suivez ce processus et n’oubliez
pas que ces commandes doivent être exécutées en tant que
root :

# apt-get update

Get:1 http://security.ubuntu.com trusty-security Release.gpg

➥[933 B]

Ign http://extras.ubuntu.com trusty InRelease

Get:2 http://security.ubuntu.com trusty-security Release

➥ [63.5 kB]

Get:3 http://us.archive.ubuntu.com trusty-updates Release.gpg

➥[933 B]Fetched 3,353 kB in 7s (445 kB/s)

Reading package lists... Done


[Results greatly truncated for length]

# apt-get install bluefish

Reading package lists... Done


Building dependency tree

The following extra packages will be installed:

  bluefish-data bluefish-plugins

Suggested packages:

  bluefish-dbg libxml2-utils php5-cli tidy weblint

The following NEW packages will be installed:

  bluefish bluefish-data bluefish-plugins

0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.

Need to get 2,548 kB of archives.

After this operation, 9,484 kB of additional disk space will


be

➥used.

Do you want to continue? [Y/n] y

Get:1 http://us.archive.ubuntu.com/ubuntu/trusty/universe

➥bluefish-data all 2.2.5-1 [2,134 kB]

Get:2 http://us.archive.ubuntu.com/ubuntu/trusty/universe

➥bluefish-plugins amd64 2.2.5-1 [172 kB]

Get:3 http://us.archive.ubuntu.com/ubuntu/trusty/universe

➥bluefish amd64 2.2.5-1 [243 kB]

Fetched 2,548 kB in 3s (831 kB/s)

(Reading database ... 223602 files and directories currently

➥installed.)

Unpacking bluefish-data (2.2.5-1) ...

Unpacking bluefish-plugins (2.2.5-1) ...

Unpacking bluefish (2.2.5-1) ...

Setting up bluefish-data (2.2.5-1) ...

Setting up bluefish-plugins (2.2.5-1) ...

Setting up bluefish (2.2.5-1) ...

Voyons en détail ce qui se passe, car deux commandes


ont été exécutées : apt-get update télécharge une liste de
paquetages logiciels depuis des serveurs APT, appelés
dépôts, dont les adresses figurent dans votre fichier de
configuration APT, /etc/apt/source.list (si vous souhaitez
connaître les adresses de ces serveurs, faites cat /etc/
apt/source.list). Si le mot Get s’affiche en début de ligne
après que vous avez lancé la commande apt-get update, cela
signifie que la liste du serveur est plus récente que celle de
votre machine et apt la charge. Si c’est le mot Ign qui
s’affiche, c’est que la liste sur le serveur et celle de votre
ordinateur sont synchronisées et rien n’est chargé. En
exécutant apt-get update en premier, vous avez l’assurance
que votre liste de paquetages est correcte et à jour.

Info
Pour ajouter de nouveaux dépôts, vous ne devez pas modifier
directement le fichier sources.list, car il sera écrasé à chaque
mise à jour logicielle. À la place, il est préférable de créer un
fichier de configuration distinct pour chaque serveur de dépôt
dans /etc/apt/sources.d. Par exemple, Dropbox est disponible en
téléchargement sous forme de paquetage deb, mais je veux
l’ajouter à l’aide d’APT afin d’obtenir automatiquement les
mises à jour. Le site Web de Dropbox (recherchez « dropbox apt
repo » sur Google) explique comment ajouter son dépôt.

En tant que root, ou en utilisant sudo, créez un fichier nommé


dropbox.list dans le répertoire /etc/apt/sources.list.d. Dans ce
fichier, ajoutez deb http://linux.dropbox.com/ubuntu trusty main. (trusty
fait référence à la version du système dans le monde Ubuntu ; si
vous n’êtes pas certain de votre version d’Ubuntu, utilisez cat
/etc/os-release.) Enregistrez le fichier et fermez-le, puis, avant
tout autre chose, importez les clés GPG de Dropbox en
exécutant sudo apt-key adv --keyserver pgp.mit.edu --recv-keys 5044912E.
Vous pouvez alors lancer sudo apt-get update. Lorsque
l’actualisation est terminée, essayez apt-cache search dropbox. Vous
devez obtenir des résultats pour Dropbox. Lorsque vous
découvrez d’autres dépôts qui vous semblent intéressants,
ajoutez-les dans sources.list.d.

La commande apt-get install bluefish charge le


paquetage indiqué et ses dépendances (bluefish-data et
bluefish-plugins dans ce cas). Une fois qu’ils sont sur votre
ordinateur, apt (ou dpkg en sous-main, pour être exact)
installe les logiciels. Gardez à l’esprit que l’on utilise le nom
du paquetage et non celui d’un fichier. En d’autres termes,
utilisez la forme apt-get install bluefish et non apt-get
install bluefish_2.2.5-1_amd64.deb. Si apt trouve des
dépendances liées à un paquetage, elle vous demandera
l’autorisation de les charger et de les installer.
Pour installer plusieurs paquetages à la fois, énumérez-
les tous sur la ligne de commande. Pour installer bluefish et
pandoc, par exemple, utilisez l’instruction suivante :

# apt-get install bluefish pandoc

Les dépendances de ces deux programmes seront


trouvées et apt vous demandera de confirmer leur
installation. Simple, non ?

Astuce
Si vous ne connaissez pas encore pandoc, je vous conseille de
combler vos lacunes en commençant par le site Web officiel à
l’adresse http://pandoc.org. Sur mon blog Chainsaw on a Tire
Swing (www.chainsawonatireswing.com), j’ai écrit quelques
mots sur son utilisation (faites une recherche, je l’ai cité à
plusieurs reprises).

Désinstaller des paquetages DEB et leurs


dépendances

apt-get remove [paquetage]

Pour désinstaller un paquetage, utilisez la commande apt-


get remove. Son fonctionnement est l’inverse exact de apt-get
install. Elle désinstalle les paquetages indiqués ainsi que
leurs dépendances, si elles ne sont pas utiles à d’autres
programmes. Une fois encore, donnez le nom du paquetage
et non celui d’un fichier : utilisez apt-get remove sshfs et non
apt-get remove sshfs_2.5-1ubuntu1_amd64.deb.
# apt-get remove sshfs

Reading package lists... Done


Building dependency tree... Done

The following packages will be REMOVED:

  sshfs

0 upgraded, 0 newly installed, 1 to remove and 54 not


upgraded.

Need to get 0B of archives.

After unpacking 98.3kB disk space will be freed.

Do you want to continue [Y/n]?

Le fait de désinstaller un paquetage n’en supprime pas


tous les vestiges car, par défaut, les fichiers de
configuration des paquetages installés restent sur votre
ordinateur. Pour tout supprimer, utilisez l’option --purge.

# apt-get --purge remove sshfs

Reading package lists... Done


Building dependency tree... Done

The following packages will be REMOVED:

  sshfs*

0 upgraded, 0 newly installed, 1 to remove and 54 not


upgraded.

Need to get 0B of archives.

After unpacking 98.3kB disk space will be freed.

Do you want to continue [Y/n]?

Avec --purge, les paquetages que apt est sur le point de


supprimer affichent un astérisque pour indiquer que les
fichiers de configuration qui y sont associés seront
également effacés.

Info
Pour déterminer les paquetages installés sur votre système et
leur identification par APT, utilisez apt --installed list. Outre le
nom du paquetage, vous obtenez également sa version et son
architecture (en général 32 ou 64 bits).
Mettre à jour des paquetages DEB et
leurs dépendances

apt-get upgrade

Un système Linux moderne contient des milliers de


paquetages logiciels et l’on peut dire sans grand risque de
se tromper qu’il sort quotidiennement une mise à jour pour
au moins l’un d’entre eux. Grâce à apt, maintenir un
système à jour est aisé. Voici comment procéder (souvenez-
vous que cette commande doit être exécutée en tant que
root) :

$ sudo apt-get update

Get:1 http://security.ubuntu.com trusty-security Release.gpg

➥[933 B]

Get:2 http://security.ubuntu.com trusty-security Release

➥[63.5 kB]

Get:3 http://extras.ubuntu.com trusty Release.gpg [72 B]

Get:4 http://us.archive.ubuntu.com trusty-updates Release.gpg

➥[933 B]

Fetched 4,275 kB in 6s (694 kB/s)

Reading package lists... Done


[liste coupée en raison de sa longueur]

$ sudo apt-get upgrade

Reading package lists... Done


Building dependency tree

Reading state information... Done

Calculating upgrade... Done

The following packages have been kept back:

  system-config-printer-gnome
The following packages will be upgraded:

  firefox firefox-locale-en fonts-droid

511 upgraded, 0 newly installed, 0 to remove and 8 not


upgraded.

Need to get 349 MB of archives.

After this operation, 45.9 MB of additional disk space will be

➥used.

Do you want to continue? [Y/n]

Là encore, on exécute apt-get update une première fois


pour synchroniser la liste des paquetages de l’ordinateur
avec celle du serveur apt. Puis apt-get upgrade recherche les
différences entre ce qui est installé sur votre machine et les
versions de paquetages disponibles dans les dépôts. Si elle
trouve une différence, elle affiche la liste des paquetages
qu’elle souhaite charger et installer. Cette liste peut être
plus ou moins longue en fonction de la date de la dernière
mise à jour : ici, 511 paquetages peuvent être mis à jour.
Si vous appuyez sur la touche y, apt charge les 511
paquetages dans /var/cache/apt/archives puis les installe une
fois le chargement terminé. Si vous ne souhaitez pas
procéder à la mise à jour, appuyez sur la touche n.
Pour être plus direct encore, vous pouvez enchaîner les
deux commandes, comme ceci :

# apt-get update && apt-get upgrade

Le symbole && permet de s’assurer que apt-get upgrade ne


commencera pas avant que apt-get update ait correctement
effectué sa tâche. Pour aller encore plus vite, vous pouvez
créer un alias pour ces commandes dans le fichier
.bash_aliases (voir la section « Créer un nouvel alias
permanent » au chapitre 12).

alias upgrade=’apt-get update && apt-get upgrade’

Rechargez le fichier .bash_aliases, saisissez simplement


upgrade et appuyez sur Entrée, puis sur la touche y pour
accepter les mises à jour. Travail terminé. Le système de
mise à jour de Windows est dépassé.

Info
Lorsque vous utilisez apt-get upgrade, vous êtes informé des
paquetages qui ont été conservés et non mis à jour ou installés.
Si vous souhaitez installer automatiquement un nouveau
logiciel et supprimer les paquetages installés devenus inutiles,
vous devez employer la commande apt-get dist-upgrade. Ne
l’exécutez pas à la légère ! Faites attention à ce qu’elle va faire,
simplement pour vous tenir au courant des actions sur votre
système.

Trouver les paquetages DEB disponibles


au téléchargement

apt-cache search

On a beaucoup parlé de l’installation de logiciels avec apt,


mais comment savoir quels sont les paquetages disponibles
? Ce genre d’information peut être obtenu grâce à apt-cache
search, qui parcourt les listes de paquetages disponibles
dans les dépôts APT. Pour une fois, il n’est pas nécessaire
d’être root pour l’exécuter.

$ apt-cache search dvdcss

brasero - CD/DVD burning application for GNOME ubuntu-


restricted-extras - Commonly used restricted packages for

➥Ubuntu

arista - multimedia transcoder for the GNOME Desktop

gxine - the xine video player, GTK+/Gnome user interface

libdvdread4 - library for reading DVDs

python3-dvdvideo - Video DVD reader library

Voici quelques principes à retenir. Cette commande


fonctionne en faisant une recherche sur la chaîne que vous
avez saisie – dvdcss, ici – et non sur des mots exacts. La
chaîne est recherchée dans le nom des paquetages, mais
aussi dans leur description. Enfin, la recherche porte sur
toute la liste des paquetages, qu’ils soient installés ou non :
le résultat peut donc contenir des noms de paquetages déjà
installés.
Astuce
Les gestionnaires de paquetages avec interface graphique sont
nombreux. Ils facilitent toutes les opérations décrites dans ce
chapitre – affichage, gestion, mise à jour, installation,
désinstallation, etc. – en utilisant la souris à la place du clavier.
Nous allons présenter les plus importants, mais vous ne devez
pas oublier quelques petites choses.

Premièrement, les gestionnaires de paquetages graphiques


développés pour GNOME ou KDE fonctionneront évidemment sur
l’autre environnement de bureau, pour peu que les bonnes
bibliothèques soient installées. Deuxièmement, Wikipédia sera
un bon point de départ si vous souhaitez en savoir plus sur ces
outils.

Voici ceux que nous avons retenus, par ordre alphabétique :


• Apper : Nommée précédemment KPackageKit, cette
application KDE propose une interface au service PackageKit.
Elle fonctionne avec pratiquement toute sorte de paquetage
Linux  : YUM, APT, Entropy, Portage, urpmi, Pacman, zypp, Hif,
et d’autres. Elle est sortie en 2008 et a été adoptée par
Fedora, Red Hat et OpenSUSE.
• GNOME PackageKit : Cette interface GTK pour le service
PackageKit (voir Apper) est réservée aux utilisateurs avancés,
alors que GNOME Software est fait pour les utilisateurs
lambda.
• GNOME Software    : Il s’agit d’une interface GTK au service
PackageKit service (voir Apper). Comme GNOME nous en a
donné l’habitude, son nom totalement générique est
impossible à rechercher sur Google. Elle est sortie en 2013 et
reste active.
• Muon Discover : Interface Qt pour APT, elle est conçue pour
les utilisateurs lambda et on la retrouve sur Kubuntu.
• Octopi    : Interface Qt pour le gestionnaire de paquetages
Pacman de la distribution Arch Linux, présente depuis 2013,
elle se développe énormément.
• Smart : L’objectif de ce projet GTK ambitieux, compatible avec
les paquetages RPM, DPKG et Slackware, est de gérer plus
assez intelligemment l’installation et la mise à jour des
logiciels.
• Synaptic : Cette interface GTK pour APT (ou RPM) est très
populaire et encore largement utilisée. Elle n’est plus le
gestionnaire graphique par défaut sur certaines distributions.
Ses fonctionnalités sont nombreuses.
• Ubuntu Software Center : Il s’agit d’une application GTK pour
GNOME qui fonctionne avec APT et dpkg. Sortie en 2009 et
destinée aux utilisateurs lambda (les utilisateurs avancés lui
préféreront Synaptic), elle est aujourd’hui employée par
défaut sur Ubuntu.
• Yumex : Abréviation de YUM Extender, ce logiciel GTK fournit
une interface pour YUM et, à présent, pour DNF (le
gestionnaire de paquetages choisi par Fedora).
• Zero Install : Cette application GTK télécharge des
programmes dans leur propre répertoire et utilise ensuite des
variables d’environnement pour qu’ils trouvent leurs
bibliothèques. Elle fonctionne sur Linux, Mac OS X, Unix et
Windows. Seul un millier de paquetages sont disponibles.

Nettoyer les paquetages d’installation


DEB devenus inutiles

apt-get clean

Les fichiers .deb des paquetages sont téléchargés et


installés avec apt et conservés dans le répertoire
/var/cache/apt/archives/.    Avec le temps, ils peuvent donc
finir par prendre beaucoup de place. Pour supprimer tous les
fichiers .deb devenus inutiles, utilisez apt-get clean (en tant
que root, comme d’habitude) :

$ ls -1 /var/cache/apt/archives/

bluefish_2.2.5-1_amd64.deb

bluefish-data_2.2.5-1_all.deb
bluefish-plugins_2.2.5-1_amd64.deb

lock

partial/

$ sudo apt-get clean

$ ls -1 /var/cache/apt/archives/

lock

partial/

L’option clean de la commande apt-get se révèle


incroyablement utile, mais deux autres options pourraient
vous intéresser. En exécutant apt-get autoclean, seuls les
paquetages obsolètes sont supprimés. De manière
comparable, apt-get autoremove se débarrasse des
paquetages qui ont été installés en tant que dépendances
et qui sont devenus inutiles, comme les anciens noyaux.
Grâce à ces options, vous gardez un système propre,
désencombré des éléments superflus.
Si un téléchargement est interrompu pour une raison
quelconque, vous pouvez trouver un fichier .deb partiel dans
/var/cache/apt/ archives/partial/. Si vous savez que toutes
les mises à jour ont été téléchargées et installées
correctement, vous pouvez supprimer tout le contenu de ce
répertoire.

Résoudre des problèmes avec APT (DEB)

Bien entendu, aussi génial que soit APT, vous pouvez


rencontrer des problèmes. En voici quelques-uns classiques
avec leurs solutions.
Un problème courant est l’affichage du message erreur «
Could not open lock file » (impossible d’ouvrir le fichier
verrou). Vous exécutez apt-get, mais au lieu de fonctionner
normalement, vous obtenez le résultat suivant :

E: Could not open lock file /var/lib/dpkg/lock - open

➥(13 Permission denied)

E: Unable to lock the administration directory


(/var/lib/dpkg/),

➥are you root?

La solution au problème se trouve dans la seconde ligne :


vous n’êtes pas connecté en tant que root. Connectez-vous
sous ce compte et essayez de nouveau ; cela devrait
fonctionner.

Info
Si vous utilisez Ubuntu ou une autre distribution qui préfère
l’utilisation de la commande sudo à une connexion du compte
root, le message d’erreur signifie que vous avez oublié de faire
précéder la commande de sudo. Vous avez exécuté :
$ apt-get-upgrade
alors que vous auriez dû saisir :
$ sudo apt-get upgrade

Un autre problème peut survenir si apt ne parvient pas à


résoudre des dépendances brisées. Vous saurez que cela
vous arrive si apt vous invite à utiliser apt-get -f install.
Cette suggestion signifie qu’un problème avec les
dépendances du paquetage sur votre système empêchent
apt d’achever son travail d’installation.
Il y a deux solutions à ce problème. Vous pouvez suivre le
conseil de apt et exécuter apt-get -f install, qui tentera de
résoudre le problème en téléchargeant et en installant les
paquetages requis. En principe, cela devrait suffire.
Si vous ne voulez pas utiliser cette technique, vous
pouvez essayer apt-get -f remove afin de supprimer les
paquetages qui posent problème. Cette approche peut
sembler un peu dangereuse – et peut l’être si vous ne faites
pas attention – mais vous aurez la possibilité de confirmer
ou non toutes les suggestions. Examinez bien les
propositions de apt avant d’appuyer sur la touche y.
Enfin, apt peut indiquer que certains paquetages créent
des conflits (« packages have been kept back »). Cela
signifie qu’il y a conflit entre le paquetage choisi ou l’une de
ses dépendances et un autre paquetage figurant déjà sur
votre système. Pour résoudre le problème, tentez d’installer
le paquetage conflictuel avec l’option -u, qui permet de
savoir précisément ce qui doit être mis à jour.

Conclusion

En dépit de leurs différences, les distributions fondées sur


RPM et sur Debian présentent des points communs en
matière de gestion des paquetages. Elles sont toutes
conçues pour faciliter l’installation, la suppression et la mise
à jour des logiciels. Celles qui reposent sur RPM utilisent la
commande rpm, alors que celles dérivées de Debian se
servent de dpkg. Pour éviter le cauchemar des dépendances,
les distributions RPM disposent de yum, un emballage autour
de rpm, tandis que les distributions Debian ont APT, un
emballage autour de dpkg.
Au final, ce système est largement plus efficace que celui
de Windows qui ne charge que les mises à jour de Windows
et quelques pilotes de constructeurs tiers. yum et apt
assurent au contraire la mise à jour de tous les éléments
logiciels installés sur votre système. C’est un avantage
indéniable de Linux sur Windows.
Chapitre 15
Connectivité
Le réseau a toujours fait partie de Linux dès l’origine de ce
système, à l’époque où il n’était encore qu’un humble noyau
développé par un petit groupe de programmeurs.
Aujourd’hui, c’est un atout majeur de ce système
d’exploitation. Les connexions Linux sont stables, efficaces
et peuvent être paramétrées très précisément en fonction
des besoins.
La transition entre l’ancien et le nouveau se poursuit
depuis des années et nous sommes toujours en plein milieu.
Certains des outils présentés dans ce chapitre existent
depuis les débuts de Linux et sont aujourd’hui obsolètes :
ifconfig, iwconfig, host, ifup, ifdown et route (ping et traceroute
existent aussi depuis toujours, mais rien ne les remplace).
Par exemple, dans les noyaux Linux 3.x, route est obsolète
et son remplaçant, ip route show, est disponible dans une
suite d’outils appelée iproute2. Vous le verrez, le constat est
comparable pour toutes les autres commandes obsolètes
mentionnées.
Mon problème est que la plupart des distributions (la
grande majorité ?) incluent toujours route, ifconfig, ifup et
les autres. Nombre d’entre elles (encore une fois, la grande
majorité peut-être ? C’est difficile à dire) incluent également
iproute2, qui est aussi disponible en téléchargement pour les
autres. Ainsi, tout au long ce chapitre, je tenterais de couvrir
à la fois les anciennes et les nouvelles commandes. Un
contenu doublé, pour le même prix, vous êtes un lecteur
chanceux !
Ce chapitre est consacré aux tests, aux mesures et à la
gestion des périphériques réseau et des connexions.
Lorsque tout fonctionne correctement, comme c’est le cas la
plupart du temps, vous pouvez utiliser les outils de ce
chapitre pour surveiller les connexions réseau. Si vous
rencontrez un problème, vous trouverez également ici des
conseils pour tenter de le résoudre.

Astuce
Nous supposerons que vous utilisez un adressage IPv4 sous la
forme xxx.xxx. xxx.xxx. L’adressage IPv6 remplacera un jour
IPv4, mais on n’en est pas encore là (bien que cette évolution
soit désormais fortement amorcée). À ce momentlà, route et la
plupart des commandes que vous allez découvrir dans ce
chapitre changeront (sans surprise, la version la plus récente de
la commande ip prend en charge IPv6). Mais, pour l’instant,
vous pouvez vous contenter des informations contenues dans ce
chapitre. Pour plus d’informations sur l’adressage IPv6,
consultez Wikipédia (http://fr.wikipedia.org/wiki/Ipv6).

Info
Pour la deuxième édition de cet ouvrage, j’ai retiré le contenu
de la section qui concernait iwconfig (qui configure les interfaces
réseau sans fil). La section a néanmoins été conservé dans le
but d’expliquer pourquoi la description de la commande a été
enlevée. Le texte d’origine se trouve sur mon site Web
(granneman.com/writing/books/linux-phrasebook).

Afficher l’état des interfaces réseau

ifconfig
ip addr show

Tout dans ce chapitre dépend de vos connexions réseau. À


la fin de ce chapitre, dans la section « Dépanner des
problèmes réseau », vous découvrirez comment résoudre
les problèmes des connexions réseau. Mais, pour
commencer, il est nécessaire de recenser celles qui sont à
disposition et d’afficher leur état.
Pour afficher rapidement la liste de toutes vos interfaces
réseau actives, utilisez la commande ifconfig (qui signifie
interface configuration). Pour afficher toutes les interfaces
réseau, qu’elles soient actives ou non, ajoutez l’option -a
(pour all). Voici ce qui s’affiche lorsqu’on exécute cette
commande sur un portable (avec certaines distributions, il
faut être connecté en tant que root pour pouvoir l’exécuter)
:

$ ifconfig

ath0 Link encap:Ethernet  HWaddr 00:14:6C:06:6B:FD

     inet addr:192.168.0.101  Bcast:192.168.0.255

➥Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

lo   Link encap:Local Loopback

     inet addr:127.0.0.1  Mask:255.0.0.0

UP LOOPBACK RUNNING  NTU:16436  Metric:1

[liste coupée en raison de sa longueur]

Cet ordinateur dispose donc de deux interfaces : ath0


(une carte wifi) et lo (l’interface loopback, sur laquelle nous
reviendrons dans un instant). Pour chaque interface sont
indiqués entre autres le type de connexion, l’adresse MAC
(Media Access Control) ou adresse physique, l’adresse IP,
l’adresse de diffusion (broadcast), le masque de sous-réseau
et des informations sur les paquets envoyés et reçus. Si une
connexion est désactivée, par exemple eth0 dans ce cas,
mais qui reste visible avec l’option -a, la plupart de ces
informations sont manquantes, comme l’adresse IP ou le
mot UP sur la quatrième ligne.
Examinons les trois interfaces une par une dans l’ordre
inverse. lo est l’adresse loopback qui permet à la machine
de se désigner ellemême. Cette adresse est toujours
représentée par l’adresse IP 127.0.0.1. Pour faire simple,
votre système en a besoin pour fonctionner correctement. Si
vous disposez d’une adresse loopback, ne vous en occupez
pas ; si vous n’en avez pas, vous devez déjà le savoir, car
vous devez avoir rencontré toute une série de problèmes
importants.

Astuce
Pour plus d’informations sur l’interface loopback et sur son
adresse, consultez la page Wikipédia correspondante
(http://en.wikipedia.org/wiki/Loopback).

eth0 (qui apparaît uniquement avec l’option -a) est une


carte Ethernet sur laquelle aucun câble n’est branché, ce
qui fait qu’elle n’est pas activée, d’où l’absence d’adresses
(IP, broadcast et masque de sousréseau). Il est possible de
faire fonctionner simultanément une interface sans fil et une
interface filaire, mais ce n’est généralement pas nécessaire.
Pour finir, il y a ath0, une carte PCMCIA sans fil. Une
interface sans fil peut aussi apparaître sous le nom eth0 si
elle est l’interface réseau principale et sous le nom eth1 si
elle est l’interface secondaire. Lorsque la carte sans fil a été
insérée, Ubuntu l’a immédiatement reconnue, lui a donné le
nom ath0 et a configuré le système pour qu’il puisse
l’utiliser. Puisque les interfaces sans fil ne sont rien d’autre
que des interfaces Ethernet non filaires, les informations
affichées par ifconfig dans cet exemple ressemblent
beaucoup à celles qui auraient été affichées pour eth0 si elle
avait été active.

Info
On peut trouver d’autres noms pour les interfaces réseau,
comme wlan0 pour certaines cartes sans fil.
ifconfig permet donc de vérifier rapidement l’état des
interfaces réseau, en particulier pour déterminer notre
adresse IP. Mais cette solution représente la méthode
ancienne. Voici la nouvelle, qui se fonde sur la commande
ip.
La commande ip ne s’utilise jamais seule en tant que
telle. Elle doit être suivie d’un objet – le périphérique réseau
ou les informations à afficher ou à modifier –, puis les
actions à appliquer sur cet objet. Par exemple, voici
comment obtenir les mêmes informations qu’avec ifconfig :

$ ip addr show up

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state    UNKNOWN

   link/loopback 00:00:00:00:00:00 brd  00:00:00:00:00:00

   inet 127.0.0.1/8 scope host lo

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500   state UP

   link/ether 00:14:6C:06:6B:FD brd  ff:ff:ff:ff:ff:ff

   inet 192.168.0.101/24 scope global dynamic eth0

[liste coupée en raison de sa longueur]

Nous commençons avec ip, puis précisons l’objet    : addr


(ou address, voire même juste a !). Puisque nous voulons
afficher cette adresse, nous ajoutons l’action show. Mais,
seules les interfaces actives nous intéressent ; nous
précisons donc up. Les résultats sont identiques à ceux
fournis par ifconfig. Pour que la commande concerne toutes
les interfaces, même celles qui ne sont pas actuellement
connectées, il suffit d’exécuter ip addr show, comme ifconfig
-a.

Vérifier qu’un ordinateur fonctionne et


accepte des requêtes

ping

ping -c
La commande ping envoie un type de paquet spécial – un
message ICMP ECHO_REQUEST – à l’adresse indiquée. Si
une machine à cette adresse écoute les messages ICMP,
elle répondra avec un paquet ICMP ECHO_REPLY (certains
pare-feu peuvent bloquer les messages ICMP, ce qui rend
ping inutilisable mais, la plupart du temps, vous ne
rencontrerez pas de problème). Un ping réussi signifie
qu’une connexion a pu être établie entre les deux machines.

$ ping www.google.com

ping www.google.com

PING www.l.google.com (72.14.203.99) 56(84) bytes of data.

64 bytes from 72.14.203.99: icmp_seq=1 ttl=245 time=17.1 ms

64 bytes from 72.14.203.99: icmp_seq=2 ttl=245 time=18.1 ms

64 bytes from 72.14.203.99: icmp_seq=3 ttl=245 time=17.9 ms

64 bytes from 72.14.203.99: icmp_seq=4 ttl=245 time=16.9 ms

64 bytes from 72.14.203.99: icmp_seq=5 ttl=245 time=17.5 ms

--- www.l.google.com ping statistics ---

6 packets transmitted, 5 received, 16% packet loss, time


5051ms

rtt min/avg/max/mdev = 16.939/17.560/18.136/0.460 ms

La commande ping ne s’interrompt que lorsque vous


appuyez sur Ctrl+C. Cela peut être problématique si vous
oubliez que vous avez utilisé ping car il continuera à envoyer
des paquets tant que votre ordinateur sera actif ou que
votre connexion sera ouverte. Un jour j’ai oublié de fermer
une session ping active pendant dix-huit jours, ce qui fait
que j’ai envoyé plus de 1,4 million de pings sur un de mes
serveurs. Oups !
Si vous souhaitez fixer une limite à ping, utilisez l’option -
c suivie du nombre de paquets à envoyer. Une fois ce
nombre atteint, ping s’arrête et affiche le résultat.

$ ping -c 3 www.granneman.com

PING granneman.com (216.23.180.5) 56(84) bytes of data.

64 bytes from 216.23.180.5: icmp_seq=1 ttl=44 time=65.4 ms

64 bytes from 216.23.180.5: icmp_seq=2 ttl=44 time=64.5 ms

64 bytes from 216.23.180.5: icmp_seq=3 ttl=44 time=65.7 ms

--- granneman.com ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 4006ms

rtt min/avg/max/mdev = 64.515/65.248/65.700/0.510 ms

La commande ping est le moyen le plus pratique de tester


une connexion réseau entre deux machines. Et n’oubliez pas
l’option -c si vous voulez éviter de laisser tourner ping
pendant dix-huit jours. Faites cependant attention, car si
vous utilisez ping sur des serveurs gouvernementaux ou
militaires, vous risquez d’être considéré comme un pirate.
Au mieux vous serez ajouté sur la liste noire, au pire vous
recevrez la visite d’hommes en noir.
Pour en savoir davantage sur la façon d’utiliser ping pour
diagnostiquer des problèmes de connexion réseau,
consultez la section « Dépanner des problèmes réseau » un
peu plus loin.

Suivre la route des paquets entre deux


hôtes

traceroute

La commande traceroute affiche chaque étape de la route


empruntée par les données entre votre machine et l’hôte
indiqué. Imaginons que vous souhaitiez savoir pourquoi
vous ne pouvez pas atteindre le site
www.granneman.com. Hier, vous n’aviez aucun problème
pour y accéder mais, aujourd’hui, impossible de le contacter
dans le délai imparti. Où est le problème ?

$ traceroute www.granneman.com

traceroute to granneman.com (216.23.180.5), 30 hops max, 38


byte

➥packets

 1  192.168.0.1 (192.168.0.1)  1.245 ms  0.827 ms  0.839 ms

 2  10.29.64.1 (10.29.64.1)  8.582 ms  19.930 ms  7.083 ms

 3  24.217.2.165 (24.217.2.165)  10.152 ms  25.476 ms  36.617


ms

 4  12.124.129.97 (12.124.129.97)  9.203 ms  8.003 ms  11.307


ms

  5    12.122.82.241 (12.122.82.241)    52.901 ms    53.619


ms  51.215

➥ms

 6  tbr2-p013501.sl9mo.ip.att.net (12.122.11.121)  51.625 ms

➥ 52.166 ms  50.156 ms

  7    tbr2-cl21.la2ca.ip.att.net (12.122.10.14)    50.669


ms  54.049

➥ms  69.334 ms

 8  gar1-p3100.lsnca.ip.att.net (12.123.199.229)  50.167 ms  

➥48.703 ms  49.636 ms

 9  * * *

10    border20.po2-bbnet2.lax.pnap.net (216.52.255.101)    59.414


ms

➥62.148 ms  51.337 ms

11  intelenet-3.border20.lax.pnap.net (216.52.253.234)  51.930
ms

➥53.054 ms  50.748 ms

12    v8.core2.irv.intelenet.net (216.23.160.66)    50.611


ms  51.947 ➥ms  60.694 ms

13  * * *

14  * * *

15  * * *

Chaque * * * représente l’expiration d’un délai de cinq


secondes sur le noeud concerné. Parfois, cela signifie que la
machine ne sait pas comment gérer le paquet à cause d’un
bogue mais, en général, une suite continue de * * * indique
un problème avec le routeur de ce noeud (celui auquel
v8.core2.irv.intelenet.net transmet les paquets dans
l’exemple précédent). Si le problème persiste, contactez
l’administrateur de v8.core2.irv.intelenet.net et prévenez-le.
(Vous pourriez aussi signaler à l’administrateur de gar1-
p3100.lsnca. ip.att.net que son routeur a du mal à atteindre
border20. po2-bbnet2.lax.pnap.net, mais le problème est de
moindre importance.)
Un autre moyen de contourner un traceroute
problématique consiste à augmenter le nombre de sauts
que la commande peut utiliser. Par défaut, le nombre
maximal est 30, mais vous pouvez le changer grâce à
l’option -m comme dans traceroute -m 40 www.bbc.co.uk.

Astuce
Mieux que traceroute, il existe mtr (pour Matt’s traceroute), qui
est un peu une combinaison de ping et de traceroute. Si mtr est
disponible pour votre distribution, téléchargez-le et testez-le.
Pour plus d’informations, consultez les pages
www.bitwizard.nl/mtr et
https://en.wikipedia.org/wiki/MTR_(software).

Effectuer des recherches DNS

host

dig

DNS (Domain Name System) a été créé pour faciliter l’accès


aux ressources Internet pour les pauvres humains que nous
sommes. Les machines n’ont aucun problème avec les
nombres, mais il n’en est pas de même pour les hommes
qui, eux, mémorisent beaucoup plus facilement les mots.
L’adresse d’un site web peut être 216.58.198.195, mais
cette combinaison est impossible à retenir pour la plupart
des gens – il est beau-coup plus simple de retenir le nom de
la page www.google.fr. DNS est donc essentiellement une
base de données géante qui mémorise la relation qui lie
216.58.198.195 et www.google.fr. Il associe donc une
adresse IP à un nom de site et stocke ainsi des millions de
couples adresse IP/noms de domaine.
Astuce
DNS est un sujet fascinant, mais long et complexe. Pour plus
d’informations sur son fonctionnement, faites une recherche sur
Wikipédia ou lisez le livre de Paul Albitz et Cricket Liu, DNS et
Bind, publié par O’Reilly.

Pour connaître rapidement l’adresse IP correspondant à


un nom de domaine, utilisez la commande host :

$ host chainsawonatireswing.com

chainsawonatireswing.com has address 68.65.123.160

chainsawonatireswing.com mail is handled by 20

➥alt2.aspmx.l.google.com.

chainsawonatireswing.com mail is handled by 10

➥aspmx.l.google.com.

$ host www.chainsawonatireswing.com

www.chainsawonatireswing.com is an alias for

➥gawain.websanity.com.

gawain.websanity.com has address 23.239.25.194194

Vous remarquerez que des requêtes très proches


fournissent des réponses totalement différentes. On pourrait
croire que chainsawonatireswing.com et
www.chainsawonatireswing.com sont un seul et même site, mais
ce n’est pas le cas.
Vous pouvez également faire l’inverse, trouver un nom de
domaine à partir d’une adresse IP. Mais cela ne fonctionne
pas à tous les coups. Si aucun enregistrement DNS n’est
associé à une adresse IP, vous n’obtiendrez aucune réponse
exploitable.

$ host 23.239.25.19

19.25.239.23.in-addr.arpa domain name pointer

➥li708-19.members.linode.com

$ host 68.65.123.160

Host 160.123.65.68.in-addr.arpa. not found: 3(NXDOMAIN)

Dans la réponse, les adresses IP sont inversées. Cela est


tout à fait normal et attendu.
La commande host existe depuis longtemps et fait son
travail, mais il en existe une nouvelle qui la remplacera à
terme : dig (pour domain information groper). dig dispose
des mêmes fonctionnalités que host et en offre d’autres.
Vous pouvez effectuer différentes sortes de recherche
avec dig, dont le type sera indiqué après le nom de
domaine. Parmi toutes les options disponibles, vous avez
notamment le choix entre a (une adresse IPv4), aaaa (une
adresse IPv6), cname (un nom canonique qui pointe sur un
enregistrement A), mx (un serveur de courrier électronique),
soa (Start of Authority : informations officielles sur un
domaine, dont le serveur de noms principal, l’adresse mail
de l’administrateur et les minuteries d’actualisation des
enregistrements du domaine), et any (qui signifie
littéralement tout ce que la commande peut trouver, y
compris A, AAAA, CNAME, MX, SOA et d’autres).

$ dig www.chainsawonatireswing.com any

;; ANSWER SECTION:

www.chainsawonatireswing.com. 600 IN CNAME


gawain.websanity.com.

;; AUTHORITY SECTION:

chainsawonatireswing.com. 1800 IN NS dns1.registrar-


servers.com.

chainsawonatireswing.com. 1800 IN NS dns2.registrar-


servers.com.

De nombreuses informations supplémentaires ont été


omises dans cet exemple. Il n’affiche que cinq lignes alors
que la sortie réelle en comprend 21 ! Il existe cependant
une solution pour n’obtenir que les éléments importants :

$ dig +noall +answer www.chainsawonatireswing.com any

www.chainsawonatireswing.com. 600 IN CNAME


gawain.websanity.com.

L’option +noall demande à dig de désactiver tous les


autres paramètres d’affichage des résultats (il y en a
potentiellement un grand nombre) et +answer lui demande
d’afficher uniquement la section ANSWER. Le résultat de cette
requête est beaucoup plus court et propre.
Voyons ce qui se passe si nous retirons la partie www.

$ dig chainsawonatireswing.com any

;; ANSWER SECTION:

chainsawonatireswing.com. 3601 IN SOA dns1.registrar-


servers.com.

➥hostmaster.registrar-servers.com. 2015072302 43200 3600


604800

➥3601

chainsawonatireswing.com. 1800 IN NS dns1.registrar-


servers.com.

chainsawonatireswing.com. 1800 IN NS dns2.registrar-


servers.com.

chainsawonatireswing.com. 583  IN A 68.65.123.160

chainsawonatireswing.com. 600    IN MX 20
alt1.aspmx.l.google.com.

chainsawonatireswing.com. 600  IN MX 10 aspmx.l.google.com.

chainsawonatireswing.com. 600   IN  TXT ”v=spf1 include:_spf.

➥google.com ~all”

Il y avait cette fois-ci 31 lignes, raccourcies à seulement


huit dans l’exemple. Si vous voulez tout connaître d’un
domaine, passez l’option any à dig.
Vous vous en doutez certainement, dig est également
capable d’effectuer des recherches inverses. L’option -x fait
ce travail, mais nous profitons des autres options
mentionnées précédemment pour n’obtenir que la réponse
qui nous intéresse.

$ dig +noall +answer -x 23.239.25.194

194.25.239.23.in-addr.arpa. 86384 IN PTR gawain.websanity.com.

Nous l’avons déjà précisé, elle fonctionne dans cet


exemple, mais ce n’est pas toujours le cas.
host et dig sont toutes deux des commandes
extrêmement utiles. À la section « Dépanner des problèmes
réseau », vous verrez comment elles peuvent vous aider.

Configurer une interface réseau

ifconfig

ip addr

add ip link set

À la première section de ce chapitre, vous avez vu comment


utiliser ifconfig ou ip pour afficher l’état des interfaces
réseau. Ces commandes cachent d’autres fonctionnalités,
notamment la possibilité de configurer les interfaces.

Info
Bien que vous puissiez effectuer de nombreux réglages grâce à
ifconfig et ip, vous n’en verrez que quelques-uns ici. Pour plus
d’informations, consultez les pages de manuel de ces
commandes.

Pour changer l’adresse IP de la carte Ethernet eth0 en


192.168.0.125, utilisez cette commande (pratiquement
toutes les commandes associées à ifconfig doivent être
exécutées en tant que root) :

# ifconfig eth0 192.168.0.125

Si vous optez pour la commande ip, vous devez procéder


ainsi (tout en étant root) :

# ip addr add 192.168.0.125 dev eth0

Pour que certains outils de surveillance réseau


fonctionnent, comme l’admirable Wireshark
(www.wireshark.org), la carte réseau doit se trouver en
mode promiscuous. Par défaut, eth0 n’écoute en effet que
les paquets qui lui sont spécifiquement adressés, or, pour
surveiller le trafic des paquets sur l’ensemble du réseau,
vous devez demander à votre carte de tout écouter : c’est le
but du mode promiscuous.

# ifconfig eth0 promisc

Si vous exécutez maintenant ifconfig, vous constaterez


que votre carte surveille désormais tous les paquets
possibles. Notez la présence de PROMISC à la quatrième ligne
:

# ifconfig eth0

eth0 Link encap:Ethernet  HWaddr 00:02:8A:36:48:8A

     inet addr:192.168.0.143  Bcast:192.168.0.255

➥Mask:255.255.255.0

     inet6 addr: fe80::202:8aff:fe36:488a/64 Scope:Link

     UP BROADCAST PROMISC MULTICAST  MTU:1500  Metric:1

Lorsque vous avez fini d’utiliser Wireshark, n’oubliez pas


de désactiver le mode promiscuous (vérifiez que PROMISC a
disparu).

# ifconfig eth0 -promisc

# ifconfig eth0

eth0 Link encap:Ethernet  HWaddr 00:02:8A:36:48:8A

     inet addr:192.168.0.143  Bcast:192.168.0.255

➥Mask:255.255.255.0

     inet6 addr: fe80::202:8aff:fe36:488a/64 Scope:Link

     UP BROADCAST MULTICAST  MTU:1500  Metric:1

Avec la commande ip, l’activation du mode promiscuous


se fait de la manière suivante (vérifiez la ligne associée à
eth0) :

# ip link set dev eth0 promisc on

# ip addr show up

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state    UNKNOWN …

2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP>      mtu 1500


➥state UP

And now let’s change it back:


# ip link set dev eth0 promisc off

# ip addr show up

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state    UNKNOWN

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500   state UP

Vous pouvez même modifier l’adresse MAC de votre


périphérique réseau, ce qui n’est généralement nécessaire
que pour contourner les tentatives de certains FAI de lier un
service Internet à une machine spécifique. Faites attention
lors de cette opération car une erreur pourrait entraîner un
conflit avec d’autres interfaces réseau.
Commencez par exécuter ifconfig ou ip addr show up pour
récupérer l’adresse MAC d’origine de façon à pouvoir la
restaurer en cas de besoin. Ensuite, arrêtez le périphérique,
effectuez la modification et redémarrez-le. Si vous ne
reconnaissez pas les commandes qui arrêtent et
redémarrent le périphérique, ce n’est pas grave, vous les
verrez plus loin dans ce chapitre. Pour finir, utilisez de
nouveau ifconfig ou ip addr show up pour vérifier que
l’adresse MAC a bien été modifiée. Celle de l’exemple est
totalement fausse, n’essayez pas de l’utiliser.

# ifdown eth0

# ifconfig eth0 hw ether 12:34:56:78:90:aa

# ifup eth0

Voici l’équivalent avec la commande ip :

# ip link set dev eth0 down

# ip link set dev eth0 address 12:34:56:78:90:aa

# ip link set dev eth0 up

Les commandes ifconfig et ip sont des outils parfaits


lorsque l’on travaille avec les interfaces réseau. Prenez le
temps d’apprendre à les maîtriser pour en exploiter toutes
les possibilités.

Afficher l’état des interfaces réseau sans


fil

iwconfig

nmcli

La commande ifconfig affiche l’état de toutes les interfaces


réseau, y compris celui des interfaces sans fil. Elle ne peut
toutefois pas afficher toutes les données associées au
fonctionnement de ces dernières, simplement parce qu’elle
ne les connaît pas. Pour obtenir le maximum d’informations
sur celles-ci, utilisez plutôt iwconfig.

$ iwconfig

lo   no wireless extensions.

eth0 no wireless extensions.

ath0 IEEE 802.11g  ESSID:»einstein»

     Mode:Managed  Frequency:2.437 GHz  Access Point:

➥00:12:17:31:4F:C6

     Bit Rate:48 Mb/s  Tx-Power:18 dBm  Sensitivity=0/3

     Retry:off  RTS thr:off  Fragment thr:off

     Power Management:off

     Link Quality=41/94  Signal level=-54 dBm  Noise level=-95

➥dBm

          Rx invalid nwid:1047    Rx invalid crypt:0    Rx invalid


frag:0

          Tx excessive retries:73    Invalid misc:73    Missed


beacon:21

Notez la présence d’informations relatives aux interfaces


sans fil que seule iwconfig peut fournir, comme le type de
carte (802.11g dans ce cas), l’ESSID ou nom du réseau
(l’ESSID de ce réseau est einstein), le type de réseau auquel
vous êtes connecté, l’adresse MAC du point d’accès
(00:12:17:31:4F:C6) et diverses autres informations sur la
qualité de la liaison sans fil.
La combinaison de ifconfig et de iwconfig permet de tout
savoir sur les interfaces réseau ; et, tout comme ifconfig
permet de configurer les interfaces filaires, iwconfig peut
servir à configurer les interfaces réseau sans fil.
À l’instar de ifconfig qui est devenue obsolète et
remplacée par ip, iwconfig subit le même sort, même si elle
existe dans pratiquement toutes les principales
distributions. La nouvelle commande qui doit prendre sa
place est iw. En attendant sa large diffusion, je remets sa
description à la troisième édition de cet ouvrage. Si vous
souhaitez de plus amples informations sur iw, consultez la
page
https://wireless.wiki.kernel.org/en/users/documentati
on/iw.
La plupart des distributions proposent à présent
l’application graphique NetworkManager. Elle simplifie la
connexion aux réseaux filaires et sans fil, ainsi que leur
gestion. Mais, pour nous, tout son intérêt réside dans son
équivalent en ligne de commande appelée nmcli (interface
en ligne de commande NetworkManager).
Pour consulter l’état d’un périphérique sans fil, utilisez
nmcli avec son option -p (pour pretty, car elle affiche des
résultats adaptés aux humains) et appliquez-la à l’objet
device avec l’action status :

$ nmcli -p device status

======================================

         Status of devices

======================================

DEVICE TYPE     STATE       CONNECTION

wlan0  wifi     connected   Home

eth0   ethernet unavailable --

lo     loopback unmanaged   --

Le Wi-Fi est donc connecté, mais quid des détails ? Nous


pouvons exécuter nmcli -p connection show Home (l’objet
connection, avec l’action show et le nom de la connexion,
comme Home dans l’exemple), mais ce n’est pas une très
bonne idée. Nous obtiendrions effectivement tous les
détails, mais ils représenteraient 126 lignes dans ce cas !
À la place, nous limitons l’affichage aux informations dont
nous avons besoin (j’ai néanmoins retiré plusieurs lignes
des résultats, qui en comprenaient 36) :

$ nmcli -p -f GENERAL,IP4,WIFI-PROPERTIES dev show wlan0

GENERAL.DEVICE       wlan0

GENERAL.TYPE         wifi

GENERAL.VENDOR       Intel Corporation

GENERAL.PRODUCT      PRO/Wireless 5100 AGN [Shiloh]

GENERAL.DRIVER       iwlwifi

GENERAL.HWADDR       12:34:56:78:90:ab

GENERAL.STATE        100 (connected)

GENERAL.CONNECTION   Home

IP4.ADDRESS          ip=192.168.1.100/24, gw=192.168.1.1

IP4.DNS[1]           192.168.1.1

IP4.DNS[2]           208.67.220.220

WIFI-PROPERTIES.WEP  yes

WIFI-PROPERTIES.WPA2 yes

L’option -f demande de n’afficher que les champs


sélectionnés (GENERAL, IP4 et WIFI-PROPERTIES) de l’objet device,
wlan0 dans ce cas. Les résultats comprennent d’autres
informations très utiles : le fabricant et l’ID du produit, le
pilote, l’adresse matérielle (MAC), l’état de connexion, le
nom de la connexion, l’adresse IP et les adresses associées,
et les types de chiffrement pris en charge. Tout cela est bon
à connaître.
Configurer une interface réseau sans fil

Dans la version précédente de cet ouvrage, je décrivais la


commande iwconfig et son utilisation dans la configuration
de la carte sans fil sur un système Linux. Ce passage a été
retiré dans la deuxième édition, mais vous pourrez le
retrouver sur mon site Web.
Plusieurs raisons ont justifié ce choix.
Lorsque j’ai écrit cet ouvrage en 2005, la configuration de
la connexion sans fil sur un ordinateur Linux était souvent
très complexe. Les explications de iwconfig avaient pour
objectif d’aider le lecteur dans cet exercice frustrant.
Aujourd’hui les choses sont très différentes.
Il est devenu extrêmement rare que l’utilisateur d’un
système Linux sur un ordinateur fixe ou portable ait besoin
d’employer la ligne de commande pour configurer sa
connexion sans fil. Si vous exploitez un serveur, vous
utilisez probablement la ligne de commande, mais pas le
Wi-Fi. Vous avez besoin d’Ethernet, très facile à configurer
sans interface graphique.
La section précédente a relevé que la plupart des
distributions Linux disposent à présent de NetworkManager.
Cet outil graphique supprime en général toute la difficulté
de configuration des connexions Wi-Fi. Par ailleurs, il prend
en charge WPA2, le standard actuel du chiffrement sans fil.
La configuration d’une connexion sans fil avec WPA2 en
utilisant la ligne de commande reste complexe et difficile, et
peu amusante. L’outil nmcli apporte peu d’aide dans ce
domaine. La meilleure solution consiste à passer par
NetworkManager (ou tout autre équivalent sur votre
distribution). Vous n’en serez que plus heureux.

Obtenir une nouvelle adresse avec DHCP


dhclient

La plupart des réseaux domestiques et des réseaux


d’entreprise utilisent DHCP (Dynamic Host Control Protocol)
pour attribuer les adresses IP et d’autres informations clés
aux machines qui se connectent au réseau. Sans lui, il
faudrait configurer manuellement toutes les informations
réseau sur chaque nouvelle machine désireuse de se
connecter. Grâce à lui, au contraire, la machine se connecte
simplement au réseau, demande au serveur DHCP de lui
fournir une adresse IP et les autres éléments dont elle a
besoin et incorpore automatiquement les réponses du
serveur DHCP à sa configuration réseau.

Info
On suppose que vous avez déjà configuré votre périphérique
réseau pour utiliser DHCP et non des paramètres saisis
manuellement. En fonction des distributions de Linux, cette
information peut figurer dans différents fichiers de
configuration. Avec les distributions reposant sur Debian,
cherchez la ligne iface [interface] inet dhcp dans
/etc/network/interfaces. Avec les distributions reposant sur Red
Hat, recherchez BOOT-PROTO=dhcp dans /etc/syscon- fig/network-scripts-
ifcfg-[interface]. Dans ces exemples, remplacez [interface] par le
nom de votre interface. Pour de plus amples informations, faites
une recherche Google avec « dhcp votre-distribution ».

Parfois, une machine peut être incapable de se connecter


au serveur DHCP lorsqu’elle démarre. Dans ce cas, il faut
lancer manuellement la requête DHCP. Il se peut aussi qu’à
cause d’un problème réseau, vous ayez besoin d’une autre
adresse IP. Quelle que soit l’origine du problème, la
commande dhclient tente d’interroger tout serveur DHCP
disponible pour récupérer les informations dont elle a besoin
(dhclient doit être exécuté en tant que root).
# dhclient eth0

Internet Systems Consortium DHCP Client V3.0.2

Copyright 2004 Internet Systems Consortium.

All rights reserved.

For info, please visit http://www.isc.org/products/DHCP

Listening on LPF/eth0/00:0b:cd:3b:20:e2

Sending on   LPF/eth0/00:0b:cd:3b:20:e2

Sending on   Socket/fallback

DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 8

DHCPOFFER from 192.168.0.1

DHCPREQUEST on eth0 to 255.255.255.255 port 67

DHCPACK from 192.168.0.1

bound to 192.168.0.104 -- renewal in 37250 seconds.

# ifconfig eth0

eth0 Link encap:Ethernet  HWaddr 00:0B:CD:3B:20:E2

     inet addr:192.168.0.104  Bcast:192.168.0.255

➥Mask:255.255.255.0

     inet6 addr: fe80::20b:cdff:fe3b:20e2/64 Scope:Link

[liste coupée en raison de sa longueur]

Pour libérer ou abandonner l’adresse IP qui vous a été


attribuée, utilisez l’option -r (pour release).

# dhclient -r eth0

Internet Systems Consortium DHCP Client V3.0.2

Copyright 2004 Internet Systems Consortium.

All rights reserved.

For info, please visit http://www.isc.org/products/DHCP

sit0: unknown hardware address type 776

sit0: unknown hardware address type 776

Listening on LPF/eth0/00:0b:cd:3b:20:e2

Sending on   LPF/eth0/00:0b:cd:3b:20:e2

Sending on   Socket/fallback

Dans l’idéal, la commande dhclient devrait être exécutée


automatiquement au démarrage de l’ordinateur, lorsqu’une
carte sans fil est activée ou qu’un câble Ethernet est
connecté, mais ce n’est pas toujours le cas. Vous pouvez
alors l’exécuter manuellement. La commande étant
particulièrement bavarde, vous pouvez aisément voir ce qui
se passe et diagnostiquer le problème.

Activer une connexion réseau

ifup

ip link set

Vous utilisez la commande ifup constamment sans même


vous en rendre compte. Lorsque vous démarrez votre
ordinateur et qu’il se connecte avec succès à Internet, vous
pouvez remercier ifup. Si vous branchez un câble Ethernet à
votre ordinateur et qu’au bout de quelques secondes vous
pouvez consulter vos mails, c’est à ifup que vous le devez.
ifup s’exécute lorsqu’un événement réseau est détecté,
comme un redémarrage ou le branchement d’un câble. Il
exécute alors les instructions contenues dans les fichiers de
configuration de l’interface réseau (si vous êtes curieux, une
note à la section précédente indique les noms et les
emplacements de ces fichiers).
Parfois, cependant, des problèmes réseau peuvent nous
obliger à exécuter ifup manuellement. Il suffit alors de se
connecter en tant que root et de faire suivre ifup du nom de
l’interface réseau que l’on souhaite activer.

# ifconfig

lo Link encap:Local Loopback

   inet addr:127.0.0.1  Mask:255.0.0.0

   inet6 addr: ::1/128 Scope:Host

   UP LOOPBACK RUNNING  MTU:16436  Metric:1

# ifup eth0

# ifconfig

eth0 Link encap:Ethernet  HWaddr 00:0B:CD:3B:20:E2

     inet addr:192.168.0.14  Bcast:192.168.0.255

➥Mask:255.255.255.0

     inet6 addr: fe80::20b:cdff:fe3b:20e2/64 Scope:Link

     UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

lo   Link encap:Local Loopback

     inet addr:127.0.0.1  Mask:255.0.0.0

     inet6 addr: ::1/128 Scope:Host

     UP LOOPBACK RUNNING  MTU:16436  Metric:1

[liste coupée en raison de sa longueur]

Notez que ifup ne vous prévient pas en cas de succès.


Comme bon nombre de commandes Linux, elle reste
silencieuse et ne se manifeste que lors d’un échec ou d’une
erreur. Pour vérifier ce qu’a fait ifup, utilisez ifconfig comme
dans l’exemple précédent.

Info
Vous pouvez également utiliser ifconfig [interface] up ou iwconfig
[interface] up pour activer des connexions avec ou sans fil. Si
vous préférez la version en ligne de commande de
NetworkManager, l’équivalent est nmcli connection up id nom-de-
connexion ou nmcli connection down id nom-deconnexion.

Pour activer une interface, la nouvelle commande fournie


avec iproute2 est ip link set eth0 up (à exécuter en tant que
root, évidemment).

# ip addr show up

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state    UNKNOWN

# ip link set eth0 up

# ip addr show up

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state    UNKNOWN

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500   state UP

Désactiver une connexion réseau

ifdown

ip link set
La commande ifdown fait l’inverse de ifup : elle permet de
désactiver une connexion. Pourquoi désactiver une
connexion réseau ? La plupart du temps, parce que vous
essayez d’en activer une et que ifconfig signale qu’elle est
déjà activée, mais mal configurée. Il faut alors commencer
par l’éteindre pour pouvoir la reconfigurer en la réactivant.

# ifup eth0

ifup: interface eth0 already configured

# ifdown eth0

# ifup eth0

Notez que ifdown, comme ifup, n’affiche rien en cas de


succès : si rien ne s’affiche après ifdown, c’est que la
commande a fonctionné et que l’interface est éteinte.

Info
Vous pouvez également utiliser ifconfig [interface] down ou iwconfig
[interface] down pour désactiver des connexions avec ou sans fil.

Pour activer une interface, la nouvelle commande fournie


avec iproute2 est ip link set eth0 down (root ou sudo requis).

# ip addr show up

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state    UNKNOWN

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500   state UP

# ip link set eth0 down

# ip addr show up

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state    UNKNOWN

Personnellement, je trouve que ifup est plus facile à


utiliser (et à retenir), mais c’est probablement parce que je
la connais depuis long-temps.

Afficher la table de routage IP


route

ip route

Lorsqu’on essaye d’utiliser SSH (Secure Shell) pour se


connecter à un autre ordinateur sur son réseau local (voir le
chapitre 16, « Travail sur le réseau »), comment l’ordinateur
sait-il que les paquets échangés doivent être confinés au
réseau local au lieu d’être envoyés vers un routeur qui les
enverra sur Internet ? Si vous cherchez à afficher la page
www.ubuntu.com, comment votre ordinateur sait-il qu’il doit
envoyer la requête au routeur et non à la machine de votre
voisin ?
Le noyau Linux contient une table de routage qui
consigne ce type d’informations. Pour l’afficher, saisissez
simplement route (il n’est pas nécessaire d’être root pour
afficher la table de routage, mais c’est indispensable pour la
modifier). Il n’y a qu’une interface réseau sur cette machine,
la table de routage est donc simple. Sur un portable équipé
d’un port Ethernet et d’une carte sans fil, vous verriez des
entrées supplémentaires.

$ route

Kernel IP routing table

Destination Gateway          Genmask              Flags Metric


Ref       Use

➥Iface

192.168.0.0 *           255.255.255.0 U     0      0        0

➥ eth0

default     192.168.0.1 0.0.0.0       UG    0      0        0

➥eth0

Info
La commande suivante fournit des résultats proches de ceux de
route  : netstat -nr (ou --numeric et --route). La commande netstat est
incroyablement complète et quelque peu complexe. N’hésitez
pas à rechercher des didacticiels sur le Web.
Une adresse IP est constituée de quatre octets sous la
forme xxx. xxx.xxx.xxx, – 192.168.0.124, par exemple.
Lorsque vous envoyez un paquet à l’extérieur de votre
machine, l’adresse IP qui correspond à la destination du
paquet est comparée à la colonne Destination de la table de
routage. La colonne Genmask (masque de réseau) fonctionne
avec la colonne Destination pour déterminer lesquels des
quatre octets déterminent la destination du paquet.
Imaginons, par exemple, que vous saisissiez ping
192.168.0.124 dans votre shell. Le masque de réseau
255.255.255.0 signifie que seul le dernier octet (représenté
par 0) compte. Autrement dit, dans l’adresse 192.168.0.124,
seul 124 est important pour le routage des paquets vers
cette adresse. Tous les paquets à destination de 192.168.0.1
à 192.168.0.255 (les limites d’une adresse IP)
correspondent donc à Destination et Genmask ; ils resteront
donc sur le réseau local et éviteront le routeur. C’est pour
cela qu’on trouve un * dans la colonne Gateway, à côté de
192.168.0.0 : nous n’avons pas besoin de passerelle
puisque le trafic est local.
En revanche, tout le reste est destiné par défaut (default)
au routeur, qui dans cet exemple est à l’adresse
192.168.0.1 dans la colonne Gateway. Le masque de réseau
de cette colonne est 0.0.0.0, ce qui signifie que tout paquet
envoyé à une adresse autre que 192.168.0.1 à
192.168.0.255 doit l’être à 192.168.0.1 (car 192.168.0.1 est
la passerelle, c’est un cas particulier). 72.14.203.99,
82.211.81.166 et 216.35.180.5 passent tous trois le crible
du masque 0.0.0.0, ils sont donc destinés à être expédiés
sur Internet par le biais de la passerelle.
Un autre élément intéressant de la table de routage est la
colonne Flags qui donne des informations sur le routage. Il y
a plusieurs flags possibles, mais le plus commun est U (la
route est libre ou up) et G (utilisation de la passerelle ou
gateway). Dans l’exemple précédent, vous pouvez constater
que les deux routes sont « libres », mais que seule la
seconde est la passerelle.
Voyons à présent la nouvelle manière de procéder. Sur la
même machine, nous exécutons la commande suivante :

$ ip route show

default via 192.168.0.1 dev eth0

192.168.0.0/24 dev eth0  proto kernel  scope link  src

➥192.168.0.10

La première ligne est relativement simple : tout le trafic


envoyé sur eth0 et destiné à sortir du réseau local doit être
dirigé par défaut vers le routeur, à l’adresse 192.168.0.1.
La seconde ligne est un peu plus complexe.
192.168.0.0/24 équivaut à l’adresse 192.168.0.0 avec le
Genmask 255.255.255.0 de la commande route ; ce n’est
qu’une manière différente d’exprimer la même chose (de
façon plus compliquée, à mon avis). Si vous souhaitez
vérifier cette équivalence, recherchez « calculateur de
masque ip » sur le Web et saisissez les valeurs.
dev eth0 désigne le périphérique, tandis que proto kernel
indique qui a créé la route en premier lieu. Dans ce cas,
kernel signifie simplement que le noyau a installé cette
route grâce a une configuration automatique. Ensuite, scope
link indique la zone dans laquelle l’adresse est valide ; link
veut dire que l’adresse n’est valide que sur ce périphérique.
Enfin, src 192.168.0.10 établit l’adresse source que votre
ordinateur devra indiquer lorsqu’il envoie des paquets à
l’adresse de destination. Personnellement, je trouve que la
bonne vieille commande route est plus facile à appréhender.
Vous ferez votre propre choix, mais je vais commencer à
apprendre ip route show, car elle deviendra un jour la
méthode par défaut.

Modifier la table de routage IP


route

ip route

La commande route peut également servir à modifier la


table de routage. Soyez très prudent, car cela peut
endommager le réseau.
Imaginons que votre machine ne parvienne pas à trouver
la passerelle, ce qui empêche l’envoi de paquets vers
Internet. Exécutez la commande route, vérifiez si la
passerelle est manquante et ajoutez-la avec route (pour
modifier la table de routage, vous devez être root).

# route

Kernel IP routing table

Destination Gateway Genmask       Flags Metric Ref   Use Iface

192.168.0.0 *       255.255.255.0 U     0      0       0 eth0

# route add -net default gw 192.168.0.1 dev eth0

# route

Kernel IP routing table

Destination Gateway     Genmask       Flags Metric Ref   Use

➥Iface

192.168.0.0 *           255.255.255.0 U     0      0       0


eth0

default     192.168.0.1 0.0.0.0       UG    0      0       0
eth0

Analysons cette commande. add indique que vous ajoutez


une nouvelle route (pour en supprimer une, utilisez del).
L’option -net indique au noyau que la cible que vous ajoutez
est un réseau, avec la destination default dans le cas
présent. gw signifie que vous souhaitez router vers la
passerelle, à l’adresse 129.168.0.1, tous les paquets qui
corresponde à la destination (ici par défaut, donc en
utilisant le Genmask 0.0.0.0). Pour finir, dev eth0 précise
l’interface à utiliser, la carte Ethernet eth0 dans ce cas.
Avec les nouveaux outils, voici comment procéder :
# ip route show

192.168.0.0/24 dev eth0 proto kernel scope link 192.168.0.101

# ip route add default via 192.168.0.1

# ip route show

default via 192.168.0.1 dev eth0 proto static metric 1024

192.168.0.0/24 dev eth0 proto kernel scope link 192.168.0.101

Plutôt facile. Il suffit de donner à la commande l’adresse


IP de la passerelle. Bien joué, ip.
Imaginons qu’en plus de votre carte Ethernet, eth0, vous
ayez aussi une carte sans fil ath0. Vous voulez que votre
carte sans fil puisse accéder aux ressources réseau ayant
une adresse IP de la forme 10.1.xxx. xxx. Vous voulez aussi
empêcher totalement la carte sans fil d’accéder à Internet.
Pour ajouter une route répondant à ces besoins, utilisez les
commandes qui suivent :

# route

Kernel IP routing table

Destination Gateway     Genmask       Flags Metric Ref   Use

➥Iface

192.168.0.0 *           255.255.255.0 U     0      0       0


eth0

default     192.168.0.1 0.0.0.0       UG    0      0       0
eth0

# route add -net 10.1.0.0 netmask 255.255.0.0 dev ath0

# route

Kernel IP routing table

Destination Gateway     Genmask       Flags Metric Ref   Use

➥Iface

192.168.0.0 *           255.255.255.0 U     0      0       0


eth0

10.1.0.0    *           255.255.0.0   U     0      0       0
ath0

default     192.168.0.1 0.0.0.0       UG    0      0       0
eth0

Vous avez désigné la carte sans fil à l’aide de dev ath0 et


un masque de réseau avec netmask 255.255.0.0 pour que le
routage se déroule correctement. Si par la suite, vous
souhaitez supprimer cette route, procédez comme ceci :

# route

Kernel IP routing table

Destination Gateway     Genmask       Flags Metric Ref   Use

➥Iface

192.168.0.0 *           255.255.255.0 U     0      0       0


eth0

10.1.0.0    *           255.255.0.0   U     0      0       0
ath0

default     192.168.0.1 0.0.0.0       UG    0      0       0
eth0

# route del -net 10.1.0.0 netmask 255.255.0.0 dev eth0

# route

Kernel IP routing table

Destination Gateway     Genmask       Flags Metric Ref   Use

➥Iface

192.168.0.0 *           255.255.255.0 U     0      0       0


eth0

default     192.168.0.1 0.0.0.0       UG    0      0       0
eth0

C’est exactement la même chose, sauf que vous avez


utilisé del à la place de add.
Qu’en est-il avec ip route ? Pour ajouter une route
destinée à la carte Wi-Fi qui l’empêchera d’aller sur Internet,
exécuter les commandes suivantes :

# ip route show

default via 192.168.0.1 dev eth0 proto static metric 1024

192.168.0.0/24 dev eth0 proto kernel scope link 192.168.0.101

# ip route add 10.1.0.0/16 dev ath0

# ip route show

default via 192.168.0.1 dev eth0 proto static metric 1024

192.168.0.0/24 dev eth0 proto kernel scope link 192.168.0.101

10.1.0.0/16 dev ath0 scope link

Nous ajoutons simplement la route avec l’adresse IP de


notre réseau et son masque 16 (255.255.0.0), sans oublier le
nom du périphérique.
La suppression de la route est tout aussi facile :

# ip route show

default via 192.168.0.1 dev eth0 proto static metric 1024

192.168.0.0/24 dev eth0 proto kernel scope link 192.168.0.101

10.1.0.0/16 dev wlan0 scope link

# ip route del 10.1.0.0/16 dev ath0

# ip route show

default via 192.168.0.1 dev eth0 proto static metric 1024

192.168.0.0/24 dev eth0 proto kernel scope link 192.168.0.101

De nouveau, nous remplaçons simplement add par del, et


nous revenons à la normale.

Dépanner des problèmes réseau

Les distributions Linux d’aujourd’hui ne posent


généralement pas de souci en matière de connexion réseau,
mais un problème peut toujours arriver. Suivez ces conseils
élémentaires pour dépanner d’éventuels aléas.
Si votre interface réseau semble être active mais ne peut
pas se connecter à Internet, commencez par tenter un ping
de localhost (127.0.0.1). Si cela ne fonctionne pas, inutile
d’aller plus loin car vous avez un gros problème système. Si
cela fonctionne, tentez un ping de l’adresse IP externe de
votre machine. Si cela ne fonctionne pas, assurez-vous que
la mise en réseau est active sur votre machine. Si cela
fonctionne, essayez des ping sur d’autres machines de votre
réseau s’il y en a. Si cela ne fonctionne pas, le problème
vient de votre interface (en supposant que le routeur
marche). Vérifiez que vos câbles sont bien connectés
(sérieusement). Utilisez ifconfig ou ip addr show, si le réseau
est filaire, et iwconfig ou nmcli -p device status, s’il est san fil,
pour contrôler l’état de votre interface, et ifup ou ip link set
eth0 up pour l’activer si nécessaire. Tentez de nouveau des
ping sur les autres machines du réseau.
Si la tentative de ping sur un autre ordinateur local
fonctionne, essayez un ping sur le routeur. Si vous ne pouvez
pas contacter un routeur avec son adresse IP, redémarrez-le
et voyez si cela corrige le problème. Si vous avez accès à
d’autres machines de votre réseau, mais pas au routeur, il
est temps de vérifier votre table de routage avec route (voir
la section « Afficher la table de routage IP »). S’il manque
des éléments dans votre table de routage, ajoutez-les en
suivant les instructions de la section « Modifier la table de
routage IP ».

Info
Il est bien plus facile de diagnostiquer et de résoudre des
problèmes si vous disposez de repères. Lorsque le réseau est
opérationnel, exécutez route et enregistrez le résultat de
manière à disposer d’informations correctes au cas où vous
rencontreriez un problème de routage à l’avenir.

Si vous ne parvenez pas à atteindre le routeur, faites un


ping sur une machine active sur Internet, comme
www.google.com ou www.ubuntu.com. Si cela ne
fonctionne pas, tentez un ping sur la même machine, mais
en utilisant son adresse IP cette fois-ci. Pour cela, vous
devez avoir à portée de main l’adresse IP de quelques
machines de référence. Bien entendu ces adresses peuvent
changer, alors à vous de les tenir à jour.

Site Adresse actuelle


www.google.com 172.217.18.196
www.debian.org 130.89.148.14
www.ubuntu.com 91.189.89.118
www.distrowatch.com 82.103.136.226
www.granneman.com 23.239.25.194
Info
Comment récupérer ces adresses IP    ? Vous pouvez utiliser ping
sur ces machines en utilisant leur nom de domaine ; la
commande vous révélera leur adresse IP. Vous pouvez aussi
obtenir ces informations avec traceroute. Une autre méthode
encore plus rapide consiste à utiliser host, comme nous l’avons
vu précédemment à la section « Effectuer des recherches DNS ».

Si le ping réussit avec l’adresse IP mais pas avec le nom


de domaine, vous avez un problème de DNS. Si vous utilisez
DHCP, il est temps d’exécuter dhclient (voir « Obtenir une
nouvelle adresse avec DHCP ») pour tenter de renouveler
les informations DNS fournies par votre serveur DHCP. Si
vous n’utilisez pas DHCP, cherchez les informations DNS
dont vous avez besoin sur votre routeur ou demandez à
votre administrateur ou à votre fournisseur d’accès. Ajoutez
cette information manuellement dans /etc/resolv.conf,
comme dans cet exemple :
nameserver 24.217.0.5
nameserver 24.217.0.55
La syntaxe est nameserver (un mot requis), suivie de
l’adresse IP que vous êtes censé utiliser pour le DNS. Si
votre routeur dispose d’un DNS local et si vous connaissez
son adresse IP (192.168.0.1, ici), essayez d’abord :
nameserver 192.168.0.1
Essayez ifdown puis ifup et voyez si cela suffit.
À ce stade, il me faut souligner un problème que Brian
Greer a porté à mon attention : « l’ajout manuel d’un
serveur de nom à /etc/resolv. conf n’est qu’une solution
temporaire, car dhclient écrase ce fichier lors d’un
renouvellement ou d’un redémarrage ». Merci Brian, tu as
parfaitement raison ! Si vous voulez que les modifications
du DNS persistent entre les renouvellements et les
redémarrages de DHCP, vous devez suivre plusieurs étapes.
Commencez par sauvegarder le fichier resolv.conf actuel
pour le cas où un problème surviendrait.
$ sudo cp /etc/resolv.conf /etc/resolv.conf.auto
Vous devez ensuite modifier votre fichier dhclient.conf,
mais il faut tout d’abord le trouver, car son emplacement
dépend de la distribution. (Sur mon système Ubuntu 14.04,
son chemin est /etc/dhcp/ dhclient.conf.) Si vous avez du
mal à le trouver, servez-vous de la commande find (voir le
chapitre 11, « La commande find ») :
$ sudo find /etc -name dhclient.conf
Ouvrez dhclient.conf dans votre éditeur préféré, mais en
vous assurant que ce programme a été lancé avec sudo ou
que vous avez la possibilité de vous authentifier au
chargement de dhclient.conf, car les privilèges de
l’utilisateur root sont obligatoires pour modifier ce fichier.
Ajoutez-y la ligne suivante, avant la ligne return subnet-
mask  (n’oubliez pas le point-virgule à la fin !).
prepend domain-name-servers 208.67.222.222, 208.67.220.220;
Enregistrez et fermez dhclient.conf. Désactivez la
connexion et réactivez-la, puis vérifiez que votre DNS est en
place avec cat /etc/ resolv.conf.

Info
Les utilisateurs de SUSE, Mint et Cinnamon trouveront les
instructions équivalentes à
https://support.opendns.com/forums/21618384-Computer-
Configuration.

Si les problèmes persistent, il faut recommencer, en


commençant toujours par le matériel. Tout est-il bien
enfiché ? Tout est-il branché ? Une fois que vous en êtes sûr,
vérifiez votre logiciel. Dans le pire des cas, votre matériel
n’a tout simplement pas de pilotes pour fonctionner avec
Linux. C’est rare, et de plus en plus rare, mais cela arrive
encore.
Les cartes sans fil peuvent connaître des problèmes de
compatibilité avec Linux à cause des constructeurs qui ne
souhaitent pas aider les développeurs Linux à faire
fonctionner leur matériel. Pour éviter les maux de tête,
vérifiez sur le Web la compatibilité avec Linux de la carte
sans fil que vous êtes sur le point d’acquérir. Vous trouverez
ce type d’information sur le site Linux Wireless LAN Support
(http://linux-wless.passys.nl) et la page
WirelessCardsSupported du site Ubuntu Wiki
(https://help.ubuntu.com/community/WifiDocs/Wirele
ssCards-Supported).
Pour finir cette section sur le dépannage, si un ping
parvient à contacter une adresse IP et le nom de domaine
correspondant, vous pouvez arrêter de lire, car vous êtes
connecté.

Conclusion

Vous avez découvert un certain nombre d’outils réseau dans


ce chapitre. La plupart d’entre eux, comme ifconfig, iwconfig
et route, ont une double fonction : ils informent sur l’état
d’une connexion et permettent d’en modifier les
paramètres. D’autres servent davantage à poser des
diagnostics, c’est le cas de ping, traceroute et host. Pour finir,
d’autres régissent votre capacité à vous connecter à un
réseau    : dhclient, ifup et ifdown. Si vous voulez être un
utilisateur Linux sérieux, vous devrez apprendre à vous en
servir. Rien n’est plus frustrant qu’une connexion réseau qui
ne fonctionne pas mais, avec le bon programme, la
réparation ne prend généralement que quelques secondes.
Si vous maîtrisez vos outils, vous pourrez résoudre la
plupart des problèmes qui surviennent.
Chapitre 16
Travail sur le réseau
La plupart des commandes abordées dans ce chapitre sont
si riches et si puissantes qu’elles mériteraient qu’on leur
consacre un livre entier. Cet ouvrage ne peut pas décrire
toutes les fonctionnalités de ssh, rsync, wget et curl, par
exemple. La meilleure chose à faire est donc de se
familiariser avec elles, de comprendre leur principe de base,
puis d’explorer celles qui vous intéressent plus
particulièrement : cela devrait vous occuper un bon
moment. Puis faites fonctionner votre imagination et vous
trouverez des centaines d’applications aux commandes de
ce chapitre.

Se connecter de façon sécurisée à un


autre ordinateur

ssh

Comme Unix a été conçu avec le réseau comme objectif, il


n’est pas surprenant que ses premiers développeurs aient
créé des programmes permettant de se connecter à
d’autres machines pour exécuter des programmes, afficher
des fichiers et accéder à des ressources. Pendant
longtemps, telnet a été le programme à utiliser, mais il
n’était absolument pas sécurisé : tout ce qui était envoyé
(nom d’utilisateur, mot de passe, commandes et données)
l’était sans aucun chiffrement. Toute personne à l’écoute
pouvait donc intercepter ce qui était échangé.
Pour résoudre ce problème, ssh (Secure Shell) a vu le jour.
Il peut s’acquitter des mêmes tâches que telnet et bien plus
encore. Par ailleurs, le trafic de ssh est protégé par
chiffrement. Si vous devez vous connecter à une autre
machine, qu’elle soit à l’autre bout de la planète ou juste à
côté de vous, utilisez ssh.
Imaginons que vous souhaitiez utiliser la commande ssh
depuis votre portable (nommé pound et à l’adresse
192.168.0.15) pour vous connecter à votre PC de bureau
(nommé eliot et à l’adresse 192.168.0.25) afin d’y
récupérer un fichier. Votre nom d’utilisateur sur le portable
est ezra, mais c’est tom sur le PC de bureau. Pour établir une
connexion ssh avec eliot, il faut saisir ce qui suit (il est aussi
possible d’utiliser un nom de domaine lorsqu’il y en a un) :

$ ssh tom@192.168.0.25

tom@192.168.0.25’s password:

Last login: Mon Feb 6 22:40:31 2006 from 192.168.0.15

Après connexion, un mot de passe vous est demandé. Il


ne s’affiche pas en clair pour empêcher son interception par
quelqu’un qui regarderait par-dessus votre épaule. Une fois
le mot de passe saisi, appuyez sur la touche Entrée et, s’il
est correct, des informations sur la machine à laquelle vous
venez de vous connecter s’affichent (nom, noyau, date,
heure et date de dernière connexion, entre autres). Vous
pouvez alors exécuter toute commande autorisée sur cette
machine, comme si vous étiez assis devant elle. Du point de
vue de SSH et d’eliot, peu importe le lieu sur Terre où vous
vous trouvez réellement. Vous êtes connecté et prêt à
oeuvrer.
Si c’est votre première connexion sur eliot, le message
d’accueil sera différent :
$ ssh tom@192.168.0.25

The authenticity of host ‘192.168.0.25(192.168.0.25)’ can’t be

➥established.

RSA key fingerprint is 54:53:c3:1c:9a:07:22:0c:82:7b:38:53:21:

➥23:ce:53.

Are you sure you want to continue connecting (yes/no)?

ssh vous prévient qu’il ne reconnaît pas cette machine et


vous demande de vérifier son identité. Tapez yes et appuyez
sur Entrée. Un autre message s’affiche avec une invitation à
saisir un mot de passe :

Warning: Permanently added ‘192.168.0.25’ (RSA) to the list of

➥known hosts.1

tom@192.168.0.25’s password:

À partir de là, procédez normalement. Ce message


s’affiche uniquement parce que c’est la première fois que
vous vous connectez à eliot et que ssh stocke une clé RSA
dans ~/.ssh/known_hosts sur pound. Examinez ce fichier et vous
constaterez qu’une ligne y a été ajoutée. En fonction de la
façon dont l’option HashKnownHosts a été configurée dans
votre fichier /etc/ssh/ssh_config, cette ligne peut apparaître
sous deux formes. Si HashKnownHosts vaut no, la ligne
ressemblera à  ceci :

192.168.0.25 ssh-rsa
SkxPUQLYqXSzknsstN6Bh2MHK5AmC6Epg4psdNL69R5

➥pHbQi3kRWNNNNO3AmnP1lp2RNNNNOVjNN9mu5FZel6zK0iKfJBbLh/Mh9KOhB
Nt

➥rX6prfcxO9vBEAHYITeLTMmYZLQHBxSr6ehj/9xFxkCHDYLdKFmxaffgA6Ou2
ZU

➥X5NzP6Rct4cfqAY69E 5cUoDv3xEJ/gj2zv0bh630zehrGc=

Vous pouvez observer l’adresse IP, ainsi que des


informations de chiffrement brouillées. Mais ce n’est rien
comparé à ce qui s’affiche lorsque l’option HashKnownHosts
vaut yes :
NNNNO3AmnP1lp2RNNNNOVjNNNVRNgaJdxOt3GIrh00lPD6KBIU1kaT6nQoJUMV
Tx2

➥tWb5KiF/LLD4Zwbv2Z/j/0czCZIQNPwDUf6YiKUFFC6eagqpLDDB4T9qsOajO
PLN

➥inRZpcQoPlXf1u6j1agfJzqUJUYE+Lwv8yzmPidCvOuCZ0LQH4qfkVNXEQxmy
y6i

➥z6b2wp=?

Ici, tout est brouillé, même l’adresse IP et le nom de


domaine. C’est une bonne chose du point de vue de la
sécurité, mais cela posera un problème si le système
d’exploitation d’eliot est changé. En d’autres termes, si
vous devez réinstaller Linux sur eliot, la prochaine fois que
vous vous y connecterez depuis pound, vous verrez le
message suivant :

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY

Someone could be eavesdropping on you right now(man-in-the-


middle

➥attack)!

It is also possible that the RSA host key has just been
changed.

The fingerprint for the RSA key sent by the remote host is

19:85:59:5c:6a:24:85:53:07:7a:dc:34:37:c6:72:1b.

Please contact your system administrator.

Add correct host key in /home/pound/.ssh/known_hosts to get


rid

➥of this message.

Offending key in /home/pound/.ssh/known_hosts:8

RSA host key for 192.168.0.125 has changed and you have
requested

➥strict checking.

Host key verification failed.

Le problème est dû au fait que la clé ssh d’eliot a changé


puisque son système a été réinstallé. Lorsque ssh vérifie la
clé d’eliot qu’il a stockée dans le fichier known_hosts sur
pound, il constate que les deux clés sont différentes et vous
prévient. Pour résoudre ce problème, il suffit de supprimer la
ligne qui correspond à eliot dans le fichier known_hosts de
pound, d’enregistrer le fichier et de vous reconnecter. Pour
ssh, ce sera la première fois que vous vous connectez et il
vous demandera donc si vous souhaitez accepter la clé.
Répondez par l’affirmative et tout rentrera dans l’ordre.

Astuce
Dans la section « Créer une nouvelle fonction permanente » du
chapitre 12, je propose une fonction shell qui permet de retirer
très facilement la ligne problématique du fichier known_hosts.

Se connecter de façon sécurisée à un


autre ordinateur sans mot de passe

ssh

Le titre de cette section peut sembler paradoxal, mais il est


parfaitement possible de se connecter via ssh sans fournir
de mot de passe. Si vous vous connectez quotidiennement à
un ordinateur donné, la technique présentée ici devrait
grandement vous simplifier la vie.
Disons que vous souhaitez pouvoir vous connecter à eliot
(nom d’utilisateur : tom) depuis pound (nom d’utilisateur :
ezra) sans avoir à saisir de mot de passe. Pour commencer,
il faut créer une clé d’identification ssh sur pound à l’aide de
la commande suivante :

$ ssh-keygen

Generating public/private rsa key pair.

Enter file in which to save the key (/home/ezra/.ssh/id_rsa):

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /home/ezra/.ssh/id_rsa.

Your public key has been saved in /home/ezra/.ssh/id_rsa.pub.

The key fingerprint is:

d0:c8:8c:a3:6e:c5:bd:d5:e8:0f:c8:45:6c:75:09:25ezra@pound

The key’s randomart image is:

Info
Vous avez le choix entre trois types de clé créée avec -t : dsa
(pour Digital Signature Algorithm), rsa (nommé d’après les noms
de famille ses créateurs) et ecdsa (pour Elliptic Curve Digital
Signature Algorithm). DSA a été déclaré obsolète par OpenSSH
en août 2015 en raison de problèmes de sécurité (voir
http://lists.mindrot.org/pipermail/openssh-unix-announce/2015-
August/000122.html) ; ne l’utilisez pas. ECDSA n’étant pas
encore très répandu, attendez encore un peu avant de l’utiliser.
Il ne reste plus que RSA, que l’on trouve partout et qui est
relativement sûr, pour peu que l’on utilise une clé de longueur
supérieure ou égale à 2 048 bits (la valeur indiquée après -t). Si
vous craignez pour votre sécurité, allez jusqu’à 3 072, voire 4
096, mais sachez que plus la clé est longue, plus le temps de
chiffrement et de déchiffrement sera long. Cependant, avec la
rapidité des ordinateurs actuels, vous ne remarquerez
probablement aucune différence. Par exemple, puisque ssh-keygen
crée par défaut des clés RSA, la génération d’une clé sur 4 096
bits se fait à l’aide de la commande ssh-keygen -b 4096.

Acceptez l’emplacement par défaut de sauvegarde de la


clé en appuyant sur la touche Entrée. Laissez la zone de
mot de passe vierge en appuyant sur Entrée deux fois de
suite lorsqu’on vous le demande. Vous venez de créer une
clé privée stockée dans ~/.ssh/id_dsa et une clé publique
stockée dans ~/.ssh/id_dsa.pub.
Maintenant, vous devez transférer la clé publique (non la
clé privée) de pound sur eliot. Les développeurs de ssh ont
anticipé ce besoin et proposent un programme qui simplifie
cette opération. Pour copier automatiquement la clé
publique de pound vers eliot, utilisez la commande qui suit
sur pound :
$ ssh-copy-id -i ~/.ssh/id_rsa.pub tom@192.168.0.25
Ensuite, essayez de vous connecter à la machine avec ssh
tom@192.168.0.25 et contrôlez le fichier .ssh/authorized_keys
pour vérifier que vous n’avez pas ajouté des clés
supplémentaires indésirables.
Vous avez fini. Regardez ce qui se produit lorsqu’on utilise
maintenant ssh de pound vers eliot :

$ ssh tom@192.168.0.25

Last login: Sun Sep 20 19:52:53 2015 from 192.168.0.15

On ne vous a pas demandé de mot de passe.


Certains s’interrogent probablement sur les problèmes de
sécurité liés à l’utilisation de cette astuce. Pas de mot de
passe ? Un échange de clés ? C’est vrai que c’est
surprenant, mais réfléchissez un instant. Si quelqu’un a
accès à pound, il pourra bien sûr se connecter à eliot sans
mot de passe. Mais cela signifie simplement qu’il faut bien
protéger pound. Si la sécurité de ce dernier est compromise,
vous avez de toute façon un gros problème, que le pirate
comprenne ou non qu’il a accès à eliot. Par ailleurs, vous
envoyez en permanence des mots de passe sur Internet
lorsque vous connectez à des sites Web. Si un assaillant
obtient votre mot de passe, il peut créer des dommages
importants. Quant à l’échange de clés via ssh, il est au
moins aussi protégé que l’échange de mots de passe, sinon
plus, et la clé offre une protection bien supérieure à celle
apportée par un mot de passe.

Astuce
Si travailler avec une clé sans mot de passe vous donne des
sueurs froides, regardez du côté de ssh-agent. Ce programme
s’occupe de la gestion de vos clés à votre place. Vous saisissez
le mot de passe associé à votre clé et ssh-agent le conserve en
mémoire. Cette méthode est certainement plus sûre que les clés
sans mot de passe, mais elle soulève plusieurs problèmes dont
vous devez tenir compte. L’un des plus importants est son
exécution automatique ; pour une très bonne explication de ce
problème, consultez la page
http://unix.stackexchange.com/questions/90853/how-can-i-run-
ssh-add-automatically-without-password-prompt.

Si vous préférez utiliser des mots de passe, c’est votre


choix. C’est d’ailleurs le principe de base de l’Open Source
et de Linux : la possibilité de choisir.

Sécuriser le transfert de fichiers entre


deux machines

sftp

Tout comme ssh représente un bien meilleur choix que


telnet, SFTP est bien plus intéressant que FTP. Comme
telnet, ce dernier envoie votre nom, votre mot de passe et
les données en clair, ce qui fait que n’importe quelle
personne à l’écoute peut intercepter ces informations
cruciales. SFTP, en revanche, a recours à ssh pour tout
chiffrer : nom d’utilisateur, mot de passe et données. Outre
le fait qu’il soit beaucoup plus sûr que FTP, il reprend la
plupart des commandes de son « ancêtre », il est donc très
simple à apprendre et à utiliser.
Info
Pour une remise en question fantastique, rigoureuse et parfois
profane de FTP, consultez la page
http://mywiki.wooledge.org/FtpMustDie.

Si vous pouvez accéder à une machine via SSH, vous le


pouvez également via SFTP. Pour utiliser la commande sftp
depuis pound (192.168.0.15 ; nom d’utilisateur : ezra) vers
eliot (192.168.0.25 ; nom d’utilisateur : tom), utilisez cette
commande :

$ sftp tom@192.168.0.25

Connecting to 192.168.0.25...
tom@192.168.0.25’s password:

sftp>

Si vous avez lu la section « Se connecter de façon


sécurisée à un autre ordinateur sans mot de passe », vous
serez peut-être surpris qu’on vous demande un mot de
passe et vous aurez raison. L’exemple précédent a été
réalisé avant la désactivation de la demande de mot de
passe. Avec l’annulation de cette demande, le code
ressemble à ceci :

$ sftp tom@192.168.0.25

Connecting to 192.168.0.25...
sftp>

Une fois connecté via sftp, vous verrez que les


commandes à utiliser sont relativement standard. Le
tableau 16.1 énumère les plus courantes ; pour une liste
complète, faites man sftp.

Tableau 16.1 Commandes SFTP utiles


Commande Signification
cd Changer de répertoire
exit Fermer la connexion au serveur SSH distant
get Copier le fichier indiqué sur la machine locale
help Obtenir de l'aide sur les commandes
lcd Changer de répertoire sur la machine locale
lls Lister les fichiers sur la machine locale
ls Lister les fichiers du répertoire de travail du serveur SSH
distant
put Copier les fichiers indiqués vers le serveur SSH distant
rm Supprimer le fichier indiqué du serveur SSH distant

Astuce
Lors de la configuration de serveurs SSH, les administrateurs
changent parfois le port utilisé par défaut par SSH. À la place du
port 22, ils en choisissent un autre de façon à améliorer la
sécurité. Cela n’a rien de magique, mais peut ralentir les pirates
débutants.

Si le serveur SSH auquel vous vous connectez via sftp a changé


de port, vous ne pourrez pas vous connecter. Pour employer un
port SSH autre que celui par défaut (ou pour composer avec
tout autre modification particulière apportée à SSH par
l’administrateur du serveur), vous devez passer cette
information à la commande sftp par l’intermédiaire de l’option -
o. Par exemple, si le serveur SSH utilise non pas le port 22 mais
2345, la connexion se fera à l’aide de la commande sftp -
oPort=2345 (remarquez l’absence d’espace entre -o et l’option
SSH). Si vous devez inclure d’autres informations SSH, répétez
simplement l’option -o    : sftp -oPort=2345 -oPasswordAuthentication=no
(la liste complète est disponible dans la page man de ssh_config).

Copier de façon sécurisée des fichiers


entre deux hôtes

scp
Si vous êtes pressé et que vous devez copier un fichier
d’une machine vers une autre de façon sécurisée, utilisez
scp (secure copy). Voici sa syntaxe de base :
scp utilisateur@hote1:fichier1 utilisateur@hote2:fichier2
Elle est pratiquement identique à celle de cp, mais
étendue à un réseau. Prenons un exemple. Supposons que
vous souhaitiez copier backup.sh de pound (192.168.0.15 ;
nom d’utilisateur : ezra) vers eliot (192.168.0.25 ; nom
d’utilisateur : tom) à l’aide de scp :

$ pwd

/home/ezra

$ ls ~/bin

backup.sh

$ scp ~/bin/backup.sh tom@192.168.0.25/home/tom/bin

backup.sh              100% 8806     8.6KB/s   00:00

On ne vous a pas demandé de mot de passe car sa saisie


a été annulée précédemment (voir « Se connecter de façon
sécurisée à un autre ordinateur sans mot de passe ») : ssh
n’a donc pas besoin de mot de passe pour établir une
connexion entre pound et eliot. Comme scp s’appuie sur ssh,
vous n’avez pas besoin de mot de passe dans ce cas de
figure non plus. Si ssh n’avait pas été configuré de la sorte,
vous auriez dû saisir le mot de passe de tom pour pouvoir
continuer.
Imaginons que vous ayez plusieurs images JPEG à
transférer de pound à eliot. Pas de problème, il suffit
d’utiliser un caractère joker.

$ ls -1 ~/covers

earth_wind_&_fire.jpg

handel_-_chamber_music.jpg

smiths_best_1.jpg

strokes_-_is_this_it.jpg

u2_pop.jpg

$ scp *.jpg tom@192.168.0.25:/home/tom/album_covers

earth_wind_&_fire.jpg          100%   44KB  43.8KB/s

handel_-_chamber_music.jpg     100%   12KB  12.3KB/s

smiths_best_1.jpg              100%   47KB  47.5KB/s

strokes_-_is_this_it.jpg       100%   38KB  38.3KB/s

u2_pop.jpg                     100%   9222   9.0KB/s

Imaginons maintenant que vous souhaitiez faire la


manoeuvre en sens inverse. Vous êtes toujours sur pound et
vous voulez copier quelques photos de Libby d’eliot vers
pound, dans un répertoire différent de celui dans lequel vous
vous trouvez actuellement :

$ scp tom@192.168.0.25:/home/tom/pictures/dog/libby*
~/pix/libby

libby_in_window_1.20020611.jpg 100%  172KB 172.4KB/s

libby_in_window_2.20020611.jpg 100%  181KB 180.8KB/s

libby_in_window_3.20020611.jpg 100%  197KB 196.7KB/s

libby_in_window_4.20020611.jpg 100%  188KB 187.9KB/s

La commande scp est vraiment très pratique lorsque l’on


doit faire des copies de fichiers sécurisées entre deux
machines. Cependant, elle peut être fastidieuse si les
fichiers à copier sont nombreux. Dans ce cas, vous pouvez
opter pour sftp ou pour un partage Samba. (Des
informations sur le montage de système de fichiers Samba
sont disponibles sur mon site Web,
www.granneman.com/linux-redactions).

Transférer et sauvegarder des fichiers de


façon sécurisée

rsync
rsync est l’une des commandes les plus intéressantes
inventées à ce jour ; de nombreuses personnes (dont moi)
l’utilisent quotidiennement. Elle permet d’effectuer une
myriade d’opérations (encore une fois, on pourrait écrire un
livre rien que sur cette commande), mais penchonsnous sur
l’une de ses utilisations particulièrement intéressante : la
possibilité de faire des sauvegardes efficaces et sécurisées
avec un minimum de trafic réseau.
Imaginons que vous souhaitiez sauvegarder 2 Go de
fichiers toutes les nuits depuis une machine nommée
coleridge (nom d’utilisateur : sam) vers un autre ordinateur
nommé wordsworth (nom d’utilisateur : will). Sans rsync, vous
seriez obligé d’effectuer un transfert de 2 Go toutes les
nuits, ce qui représente un trafic important, même sur un
réseau rapide. Avec rsync, le transfert sera beaucoup plus
rapide car cette commande ne transfère que les éléments
qui diffèrent entre les fichiers sur les deux machines. Si
seuls quelques centaines de kilooctets ont été modifiés sur
ces fichiers depuis la veille, rsync ne transférera que ces
quelques kilo-octets. Si la différence porte sur 100 Mo, rsync
copiera ces 100 Mo, ce qui est toujours mieux que de devoir
copier quotidiennement 2 Go.
Voici une commande exécutée sur coleridge qui transfère
l’intégralité du répertoire documents sur un disque de
sauvegarde connecté à wordsworth. Observez la commande
et son résultat, vous verrez alors les options (elles sont
affichées en version longue pour faciliter la compréhension
du processus, puis en version courte pour que vous
disposiez des deux syntaxes).

$ rsync --archive --verbose --compress --rsh=ssh --progress

➥--stats --delete /home/sam/documents/will@wordsworth:/media/

➥backup/documents

$ rsync -a -v -z -e ssh --progress --stats --delete /home/sam/

➥documents/will@wordsworth:/media/backup/documents

Bien entendu, vous pouvez également exécuter la


commande de la façon suivante si vous souhaitez combiner
toutes les options :

$ rsync -avze ssh --progress --stats --delete /home/sam/

➥documents/will@wordsworth:/media/backup/documents

Le résultat de l’exécution de rsync avec l’une de ces


syntaxes ressemblera à ceci  :

building file list ...

107805 files to consider

deleting
clientele/Linux_Magazine/do_it_yourself/13/gantt_chart.

➥txt~

deleting Security/diebold_voting/black_box_voting/bbv_chapter-
9.

➥pdf

deleting Security/diebold_voting/black_box_voting/bbv_chapter-
8.

➥pdf

deleting E-commerce/Books/20050827 ebay LIL ABNER FRAZETTA


➥SUNDAYS 2.txt

deleting E-commerce/Books/20050827 The State We’re In.txt

deleting E-commerce/Books/20050811 eBay LIL ABNER DAILIES 6


1940.

➥txt

Security/electronic_voting/diebold/black_box_voting/bbv_

➥chapter-8.pdf

Security/electronic_voting/diebold/black_box_voting/bbv_

➥chapter-9.pdf

legal_issues/free_speech/Timeline A history of free speech.txt

E-commerce/2005/Books/20050811 eBay LIL ABNER DAILIES 6


1940.txt

E-commerce/2005/Books/20050827 The State We’re In.txt

E-commerce/2005/Books/20050827 ebay LIL ABNER FRAZETTA SUNDAYS


2.

➥txt

connectivity/connectivity_info.txt

[liste coupée en raison de sa longueur]

Number of files: 107805

Number of files transferred: 120

Total file size: 6702042249 bytes

Total transferred file size: 15337159 bytes

Literal data: 0 bytes

Matched data: 0 bytes

File list size: 2344115

File list generation time: 86.041 seconds

File list transfer time: 0.000 seconds Total bytes sent:


2345101

Total bytes received: 986

sent 2345101 bytes  received 986 bytes  7507.48 bytes/sec

total size is 6702042249  speedup is 2856.69

Observez le résultat. rsync commence par créer une liste


de tous les fichiers à traiter – 107 805 dans cet exemple. La
commande efface ensuite les fichiers sur la cible (wordsworth)
qui n’existent plus sur la source (coleridge). Dans cet
exemple, trois fichiers ont été effacés : une sauvegarde d’un
article de Linux Magazine (le tilde final est généralement un
indicateur d’une ancienne version d’un fichier), deux PDF
sur le vote électronique et trois fichiers texte correspondant
à des reçus d’achats de livres.
Une fois les fichiers supprimés, rsync copie tous ceux qui
ont été modifiés ou simplement les parties de fichiers qui
ont été altérées, ce qui illustre bien la grande puissance et
l’adaptabilité de cette commande. Dans cet exemple, six
fichiers sont copiés pour remplacer les anciennes versions.
Les deux PDF ont simplement été déplacés dans un
nouveau répertoire mais, pour rsync, c’est comme s’il
s’agissait de nouveaux fichiers, elle les copie donc
intégralement. La même chose se passe avec les reçus. Le
fichier A history of free speech. txt est un tout nouveau
fichier, il est donc également copié sur wordsworth.
Après avoir affiché les modifications effectuées, rsync
donne des informations sur le transfert lui-même : 120
fichiers ont été transférés, soit 15 337 159 octets (environ
14 Mo) sur les 6 702 042 249 octets (environ 6,4 Go) du
répertoire original. Le résumé mentionne d’autres
informations, mais celles-là sont les plus importantes.
Voyons maintenant ce que vous lui avez demandé de
faire. Le début et la fin de la commande sont faciles à
comprendre. On trouve, au début, la commande rsync suivie
des options et du répertoire source à partir duquel vous
souhaitez copier les fichiers (/home/sam/documents sur
coleridge). On trouve, à la fin, le nom du répertoire cible vers
lequel on souhaite copier les fichiers (/media/backup/documents
sur wordsworth). Avant de nous pencher sur les options, nous
allons détailler la manière dont sont désignés les répertoires
cible et source car il y a une « astuce » à comprendre ici qui
vous posera problème si vous ne l’intégrez pas.
On souhaite copier le contenu du répertoire documents sur
l’ordinateur coleridge, mais pas le répertoire lui-même, c’est
pour cela qu’on utilise documents/ et non documents. Le slash /
après documents dans /home/sam/documents/ indique à rsync que
l’on souhaite copier le contenu du répertoire et non le
répertoire lui-même. Si l’on avait utilisé uniquement
documents, on aurait copié le répertoire et son contenu et l’on
se serait donc retrouvé avec la structure /media/
backup/documents/documents sur wordsworth.

Info
Le slash n’est important que pour le répertoire source ; son
utilisation ou non avec le répertoire cible n’a aucune incidence.

Voyons maintenant les options utilisées. L’option -v (ou --


verbose) couplée avec --progress oblige rsync à détailler ce
qu’elle fait à chaque instant. Vous avez vu ce que cela
donne dans le résultat précédent de rsync, qui affiche la liste
des dossiers supprimés et copiés. Si vous exécutez rsync au
moyen d’un script automatisé, cette option est superflue. Si
vous l’exécutez de façon interactive, en revanche, c’est une
source d’information précieuse, car elle permet de savoir
exactement ce qui se passe.
Les métadonnées qui s’affichent après les résultats de
rsync (nombre et taille des fichiers transférés, entre autres)
apparaissent grâce à l’utilisation de l’option --stats. Dans le
cas d’un script, cette option est également superflue.
L’option -a (ou --archive) est le grand kahuna, car elle
contient en réalité sept autres options : -rlptgoD. Examinons-
les dans l’ordre.
Vous avez souvent rencontré l’option -r (ou --recursive)
avec d’autres commandes. Ici aussi, elle permet de ne pas
s’arrêter au répertoire indiqué, mais de descendre dans tous
ses sous-répertoires. Comme on souhaite copier l’intégralité
du contenu de documents, on utilise l’option -r.
Lorsqu’un lien symbolique est trouvé dans la source,
l’option -l (ou --links) permet de le recréer sur la cible. Au
lieu de copier le véritable fichier, ce qui n’était certainement
pas l’intention du créateur du lien symbolique, c’est le lien
vers le fichier qui est copié, ce qui permet de préserver
l’état initial de la source.
Il a déjà été question des permissions au chapitre 7, «
Propriétés et permissions » :    les revoici. L’option -p (ou --
perms) demande à rsync de mettre à jour les permissions sur
les fichiers de la cible afin qu’elles correspondent à celles de
la source. Cette option contribue à obtenir les sauvegardes
les plus précises possible, il est donc préférable de l’utiliser.
Il en va de même avec -o (ou --owner) et -g (ou --groups), qui
conservent les informations de propriété.
L’option -t (ou --times) demande à rsync de transférer les
dates de modification des fichiers en même temps que les
fichiers. Si vous ne l’incluez pas, rsync ne peut pas savoir ce
qui a été transféré précédemment et, la prochaine fois que
vous ferez une sauvegarde, tous les fichiers seront copiés à
nouveau. Ce n’est probablement pas le comportement que
vous souhaitez, car rsync perd alors tout l’intérêt qu’il avait
par la copie sélective des fichiers.
Enfin, l’option -D en représente elle-même deux autres : -
-devices et --specials. La première transfère les fichiers de
périphérique (par exemple les disques durs et les disques
optiques), la seconde envoie les fichiers spéciaux (par
exemple les sockets nommées et les FIFO). Vous n’aurez
probablement pas besoin de vous en préoccuper, mais,
comme -D fait partie de -a, il est bon de la connaître.
Même avec une connexion rapide, il est préférable
d’utiliser l’option -z (ou --compress) car elle permet à rsync
d’utiliser la compression gzip pour transférer les fichiers. Sur
les connexions lentes, cette option est obligatoire ; sur une
connexion rapide, elle vous permettra quand même de
gagner du temps.
Pour des raisons de sécurité, on utilise l’option -e (ou --
rsh=ssh) qui demande à rsync de travailler en utilisant ssh.
Elle permet donc de protéger les données pendant leur
transfert.

Info
Si l’on utilise ssh, pourquoi n’a-t-il pas été nécessaire de fournir
un mot de passe ? Simplement parce que j’ai utilisé la technique
présentée à la section    « Se connecter de façon sécurisée à un
autre ordinateur sans mot de passe », pour éviter d’avoir à
saisir un mot de passe.

J’ai gardé le plus dangereux pour la fin : --delete. Si vous


créez un miroir de vos fichiers, c’est pour qu’il soit aussi
précis que possible. Ceci signifie donc que les fichiers
supprimés sur la source doivent également l’être sur la
cible. Mais cela signifie aussi qu’il est possible de supprimer
accidentellement des éléments qu’on souhaitait garder. Si
vous comptez utiliser l’option --delete (et c’est sans doute
ce que vous ferez), n’oubliez pas d’exécuter dans un
premier temps la commande avec l’option -n (ou --dry-run)
décrite dans l’avertissement ci-dessous.

Attention
Il existe une option qui n’a pas été utilisée précédemment, mais
qui peut être très utile pour déterminer si l’on a bien structuré
sa commande rsync : -n (ou --dry-run). Si vous incluez cette option,
rsync s’exécute, mais n’efface ni ne copie aucun fichier. Cela peut
vous sauver la vie au cas où une commande mal saisie aurait
effacé des fichiers importants. Avant d’exécuter une commande
rsync et, en particulier, si elle contient l’option --delete, lancez-la
avec l’option -n pour contrôler qu’elle fonctionnera comme
prévu.

rsync possède de nombreuses autres options et une foule


d’autres modes d’utilisation (la page man identifie huit
emplois possibles de rsync, ce qui est assez considérable),
mais les éléments dont vous disposez pour l’instant sont
suffisants pour que vous puissiez l’utiliser. Pour plus
d’informations, lisez la page man de rsync ou faites une
recherche sur « rsync tutoriel » dans Google. Familiarisez-
vous avec cette commande : quand vous hurlerez « Oh m…
! J’ai effacé un fichier », vous pourrez dire immédiatement
après « Heureusement que j’ai fait une sauvegarde avec
rsync » et vous pourrez être fier de vous.

Astuce
Si vous voulez avoir l’esprit totalement tranquille avec vos
sauvegardes, configurez rsync pour qu’il s’exécute
automatiquement grâce à une tâche cron. Créez, par exemple, un
fichier nommé backup.sh (que vous pouvez placer dans ~/bin) et
ajoutez-y les commandes à utiliser :

$ rsync -avze ssh --progress --stats --delete /home/sam/

➥documents/will@wordsworth:/media/backup/documents

Utilisez chmod pour rendre le fichier exécutable :


$ chmod 744 /home/scott/bin/backup.sh
Ajoutez les lignes suivantes au fichier nommé cronfile (le mien
se trouve également dans le dossier ~/bin) :
# Sauvegarde de documents tous les matins à 3:05
05     03    *     *     *     /home/scott/bin/backup.sh
La première ligne est un commentaire qui explique la fonction
de cette tâche. La seconde ligne demande à cron d’exécuter
automatiquement /home/scott/ bin/backup.sh toutes les nuits à 3 h
05.
Ajoutez ensuite la tâche à cron :
$ crontab /home/scott/bin/cronfile
Vous n’avez désormais plus à vous soucier de vos sauvegardes.
Tout est automatisé, il vous suffit de laisser votre ordinateur
allumé la nuit.
Pour plus d’informations sur cron, consultez man cron ou l’article «
Newbies: Intro to cron » sur
www.unixgeeks.org/security/newbie/unix/cron-1.html.

Télécharger des fichiers de façon non


interactive

wget

Internet regorge d’images, de vidéos et de musiques


disponibles en téléchargement. Mais le téléchargement
manuel de chaque fichier d’une collection de 200 MP3 peut
rapidement devenir fastidieux. Heureusement, la
commande wget permet de télécharger des fichiers et des
sites Web sans avoir à intervenir. Il suffit de l’exécuter et
d’attendre que les fichiers soient chargés.
La partie difficile du travail tient à la configuration de wget
(encore une commande qui mérite un livre à part entière).
Nous allons nous concentrer sur deux activités : télécharger
un grand nombre de fichiers et télécharger des sites
Internet entiers.
Vous venez de découvrir un site intitulé Old Time Radio
Show. Sur ce site, on trouve nombre d’anciennes émissions
de radio au format MP3. Il y a 365 fichiers, un par jour de
l’année. Vous aimeriez bien tous les charger, mais la
perspective de faire un clic droit sur chaque lien, de choisir
Enregistrer sous et de cliquer sur OK pour télécharger
chaque fichier individuellement vous démoralise d’avance
(et il y a de quoi).
En examinant la structure du site, vous remarquez que
les MP3 sont organisés dans une structure de répertoires
semblable à celle-ci :

http://www.oldtimeradioarchives.com/mp3/

   season_10/

   season_11/

   season_12/

   ...

   season_20/

   season_21/

   ...

   season_3/

   season_4/

   ...

   season_9/

Info
Les répertoires ne sont pas classés par ordre numérique, ce
qu’un humain aurait fait, mais par ordre alphabétique, qui est
celui utilisé par les machines à moins que l’on ne spécifie le
contraire. Après tout, «  dix  » vient avant « trois » dans l’ordre
alphabétique...

Dans chaque répertoire se trouvent des MP3. Certains


n’en contiennent que quelques-uns, alors que d’autres en
contiennent plus de vingt. Si vous cliquez sur le lien d’un
répertoire, vous accédez à une page web affichant la liste
des MP3 du répertoire, comme ceci :

[BACK] Parent Directory     19-May-2015 01:03     -

       1944-12-24_532.mp3   06-Jul-2015 13:54  6.0M

       1944-12-31_533.mp3   06-Jul-2015 14:28  6.5M

       1945-01-07_534.mp3   06-Jul-2015 20:05  6.8M

       1945-01-14_535.mp3   06-Jul-2015 19:53  6.9M

Comment faire pour récupérer tous ces MP3 qui portent


des noms différents et figurent dans des répertoires
distincts ? La réponse est wget.
Commencez par créer un répertoire sur votre ordinateur
dans lequel stocker les MP3 que vous allez charger :
$ mkdir radio_mp3s
Utilisez maintenant la commande cd pour vous placer
dans ce répertoire, puis exécutez wget :
$ cd radio_mp3s
$ wget -r -l2 -np -w 5 -A.mp3 -R.html,.gif
➥http://www.oldtimeradioarchives.com/mp3/
Voyons comment fonctionnent la commande et ses
options.
wget est bien entendu la commande. Tout à la fin, se
trouve l’URL à utiliser    :
http://www.oldtimeradioarchives.com/mp3/. Les éléments
importants se trouvent entre la commande et l’URL.
L’option -r (ou --recursive) permet de suivre les liens et
de descendre dans l’arborescence des répertoires. Grâce à
elle, vous pouvez récupérer les MP3 contenus dans tous les
répertoires.
L’option -l2 (ou --level=[chiffre]) est importante et un
peu complexe. Elle permet d’indiquer à wget jusqu’à quelle
profondeur récupérer des fichiers dans l’arborescence
lorsque l’on utilise l’option -r. Le l minuscule signifie level et
le chiffre qui suit correspond au niveau à atteindre. Si vous
utilisez l1, wget ne chargera que le contenu du répertoire
/mp3, ce qui fait que vous ne chargerez… rien. Souvenezvous
que le répertoire /mp3 ne contient que d’autres répertoires :
season_10, season_11, etc. Ce sont ces sous-répertoires qui
contiennent les MP3. En utilisant l’option l2 vous demandez
donc à wget de descendre jusqu’au niveau des sous-
répertoires (/mp3/season_10,/mp3/season_11…). Faites bien
attention lorsque vous spécifiez le niveau car, si vous
utilisez une valeur trop importante, vous risquez rapidement
de saturer votre disque dur.
Un moyen d’éviter de télécharger plus que ce que l’on
souhaite consiste à utiliser l’option -np (ou –no-parent), qui
empêche de remonter dans les répertoires parent. Si vous
observez la liste de fichiers précédente, vous remarquerez
que le premier lien est le répertoire parent. Pour /season_10,
le parent est /mp3 et il en va de même pour tous les sous-
répertoires. On ne veut pas que wget remonte la hiérarchie,
mais qu’il la descende, et l’on ne souhaite certainement pas
perdre de temps à remonter dans le même répertoire /mp3
chaque fois que l’on est dans le répertoire d’une saison.
L’option qui suit n’est pas indispensable, mais il est « poli
» de l’utiliser. L’option -w (ou --wait=[valeur]) permet
d’introduire une petite pause entre chaque téléchargement.
Elle permet d’éviter de surcharger le serveur en chargeant
sans interruption. Par défaut, la valeur numérique
correspond à des secondes. Vous pouvez la transformer en
minutes en ajoutant m à la suite, mais aussi en heures avec h
et même en jours avec d.
C’est maintenant que cela devient intéressant. L’option -A
(ou --accept) indique à wget que vous ne souhaitez charger
que les fichiers d’un type donné et rien d’autre. Le A signifie
accept ; il est suivi des extensions des fichiers à télécharger,
séparées par des virgules. Comme on ne souhaite récupérer
que les MP3, on utilise la syntaxe -A.mp3.
L’option inverse, -R (ou --reject), permet de préciser à
wget ce qu’on ne souhaite pas charger. Dans cet exemple, on
ne veut pas des fichiers HTML et GIF. Séparez la liste des
suffixes à rejeter par une virgule, comme ceci : -R.html,.gif.
L’exécution de wget avec ces options permet de charger
les 365 MP3 sur votre ordinateur. Si, pour une raison ou
pour une autre, le transfert est interrompu, il suffit de
répéter la commande en lui ajoutant l’option -c (ou --
continue). Elle demande à wget de reprendre le
téléchargement là où il s’est interrompu : vous n’aurez ainsi
pas à tout télécharger de nouveau.
Info
L’exemple suivant ne fonctionne plus, mais je l’ai gardé car il
explique très bien les concepts. Inutile de l’essayer vous-même
!

Voici un autre exemple d’utilisation de wget pour


récupérer des fichiers. Un DJ londonien a sorti deux albums
au format MP3 contenant des mash-up de titres des Beatles
et des Beasty Boys ; ce qui donne The Beastles, bien sûr.
Les MP3 figurent les uns à la suite des autres sur
www.djbc.net/beastles. La commande suivante permet
d’extraire les liens de la page web, de les stocker dans un
fichier et de lancer les chargements correspondants à ces
liens avec wget :

$ lynx -dump http://www.djbc.net/beastles/ | awk ‘/http/{print

➥$2}’ | grep mp3 > beastles ; wget -i beastles

--12:58:12--  http://www.djbc.net/beastles/webcontent/djbc-

➥holdittogethernow.mp3

           => ‘djbc-holdittogethernow.mp3’

Resolving www.djbc.net... 216.227.209.173

Connecting to www.djbc.net|216.227.209.173|:80... connected.

HTTP request sent, awaiting response... 200 OK

Length: 4,533,083 (4.3M) [audio/mpeg]

100%[=========>] 4,533,083    203.20K/s    ETA 00:00

12:58:39 (166.88 KB/s) - ‘djbc-holdittogethernow.mp3’ saved

➥[4533083/4533083]

[liste coupée en raison de sa longueur]

Même si la majorité des gens utilise un navigateur Web


graphique comme Firefox, Chrome ou Safari, un navigateur
textuel en ligne de commande garde un certain intérêt en
raison de sa rapidité, de sa sécurité et de son
automatisation. Il en existe plusieurs, notamment links,
elinks et w3m, mais je préfère lynx fourni avec plusieurs
distributions. S’il n’est pas présent sur votre ordinateur,
vous pouvez toujours l’installer avec un gestionnaire de
paquetages (voir le chapitre 14).
En invoquant lynx avec l’option -dump et en lui fournissant
une URL, les liens sont extraits de la page et affichés sur
STDOUT, chaque ligne commençant par un nombre. Pour
supprimer ces nombres, nous pouvons employer awk (voir la
section « Afficher certains champs d’un fichier » du chapitre
7) . Les liens sont redirigés vers grep en lui demandant de
filtrer toutes les lignes qui contiennent mp3. Le résultat est
ensuite enregistré dans un fichier nommé beastles
(l’utilisation de tubes et la redirection font l’objet du
chapitre 5, « Création de blocs de commandes », la
commande grep, du chapitre 10, « Recherche d’éléments »).
Le point-virgule (voir la section « Exécuter plusieurs
commandes séquentiellement » au chapitre 5) permet
d’enchaîner avec la commande wget. L’option -i (ou --input-
file) demande à wget de récupérer les URL à télécharger
dans un fichier et non sur STDIN. Si vous avez beau-coup de
liens, placez-les tous dans un fichier et utilisez l’option -i
avec wget. Ici, on oriente wget vers le fichier texte beastles
créé grâce à lynx et grep. Lancez la commande et le
téléchargement des MP3 commence.
On ne peut pas faire plus simple. Qui oserait encore
douter de la puissance des commandes Linux ?

Info
Vous l’avez vu, wget sert à récupérer des fichiers. Mais comment
pouvez-vous envoyer des fichiers de façon interactive ? C’est la
fonction de wput (http://wput.sourceforge.net). Elle fonctionne
uniquement avec les serveurs FTP, mais reste un bon partenaire
de la puissante wget.

Télécharger des sites Web de façon non


interactive
wget

Si vous souhaitez sauvegarder votre site Web ou télécharger


un autre site, pensez à wget. Dans la section précédente, on
l’a utilisée pour récupérer des fichiers individuellement,
mais cette commande permet aussi de récupérer des sites
entiers.

Info
N’abusez pas de wget pour télécharger des sites. N’oubliez pas
qu’ils ont été conçus par des gens et qu’ils leur appartiennent.
Ne copiez pas un site pour le « voler ».

Imaginons que vous soyez en train de faire un tour sur le


site www.neato.com. Actuellement, vous vous trouvez à
l’adresse www.neato.com/articles/index.htm. Vous voudriez
copier tout ce qui se trouve dans la section /articles, mais
rien d’autre. C’est ce que permet de faire la commande qui
suit.

$ wget -E -r -k -p -w 5 -np

➥http://www.neato.com/articles/index.htm

Il est aussi possible de combiner les options de la façon


suivante :

$ wget -Erkp -w 5 -np http://www.neato.com/articles/index.htm

Comme dans l’exemple précédent, la commande


commence par wget et se termine par l’URL à utiliser. On a
également appliqué les options -w (ou --wait=[valeur]), -np
(ou --no-parent) et -r (ou --recursive). Voyons en détail
quelles sont les nouvelles options introduites par cet
exemple.
Lorsque vous téléchargez un site, n’oubliez pas que
certaines pages peuvent se terminer autrement que par
.html ou .htm : vous pouvez rencontrer des pages .asp, .php
ou .cfm, par exemple. Vous risquez alors d’avoir des
problèmes pour afficher le site sur votre ordinateur. Si vous
exécutez un serveur Web sur votre ordinateur, l’affichage
sera peut-être correct, mais il y a de grandes chances pour
qu’Apache ne soit pas installé et actif sur votre machine.
Même sans serveur Web, les pages .htm et .html s’afficheront
normalement sur votre ordinateur si vous les ouvrez avec
un navigateur Web. Si vous utilisez -E (ou --html-extension),
wget convertit chaque page pour que son extension soit
.html, ce qui permet de les afficher toutes sur son ordinateur
sans avoir à utiliser de logiciel spécial.
Le téléchargement d’un site peut entraîner d’autres
difficultés qui peuvent heureusement être contournées par
l’utilisation de wget. Les liens des pages chargées peuvent
ne plus fonctionner lors de l’affichage du site sur votre
ordinateur, ce qui vous empêchera de passer de page en
page. Grâce à l’option -k (ou --convert-links), vous pouvez
demander à wget de recréer les liens. Cette option permet de
corriger les liens entre les pages, mais aussi vers les
images, les CSS et les fichiers.
En parlant des feuilles de styles en cascade (CSS) et des
images, vous allez voir que l’option -p (ou --page-requisites)
peut aussi être précieuse. Le développeur d’un site peut
avoir utilisé des CSS, des fichiers JavaScript et des images
pour l’élaboration de ses pages Web. L’option -p demande à
wget de charger tous les fichiers nécessaires à l’affichage du
site. Grâce à elle, le site que vous consultez depuis votre
ordinateur est parfaitement identique au site sur Internet.
Sans elle, certains éléments risqueraient de ne pas
apparaître ou de mal s’afficher.
La page man de wget est très longue et détaillée.
Consultez-la pour apprendre comment exploiter tout le
potentiel de wget.
Télécharger des fichiers séquentiels et
des ressources Internet

curl

À première vue, curl et wget ont l’air semblables. Ces deux


commandes permettent de télécharger des fichiers de façon
non interactive, mais elles présentent une différence
majeure. curl permet de télécharger des séquences ou des
jeux de fichiers, ce que wget ne sait pas faire, alors que wget
permet de télécharger des fichiers de façon récursive, ce
que curl ne permet pas.

Info
Ces programmes présentent de nombreuses autres différences.
La liste complète des fonctionnalités de curl sont recensées
dans l’article « Features - What can curl do?    »
(http://curl.haxx.se/docs/features.html), tandis que certaines de
wget le sont dans « Overview »
(http://www.gnu.org/software/wget/manual/html_node/Overview
.html#Overview). Le site cURL
(http://curl.haxx.se/docs/comparison-table.html) propose un gra
phique intéressant qui compare curl à d’autres programmes
similaires, même s’il n’est pas totalement impartial et penche
assez nettement en faveur de curl.

Voici un exemple d’utilisation de curl pour charger une


séquence de fichiers. L’émission de radio This American Life
propose de télécharger, au format Real Audio, ses archives.
Pour en charger dix, utilisez le code suivant :

$ curl -O http://www.wbez.org/ta/[1-10].rm

[1/10]: http://www.wbez.org/ta/1.rm --> 1.rm

--_curl_--http://www.wbez.org/ta/1.rm

[liste coupée en raison de sa longueur]

Notez l’utilisation de [1-10].rm pour indiquer qu’on


souhaite charger 1.rm, 2.rm, 3.rm et ainsi de suite. Si les
fichiers avaient été nommés one.rm, two.rm et three.rm, par
exemple, il aurait fallu utiliser cette syntaxe :
$ curl -O http://www.wbez.org/ta/{one,two,three}.rm
L’option -O (ou --remote-name) est absolument
indispensable. Si vous ne l’utilisez pas, curl dirige la sortie
du téléchargement sur STDOUT, ce qui signifie que votre
fenêtre de terminal va bientôt être pleine de données
inutilisables. Grâce à l’option -O, la sortie est dirigée vers un
fichier reprenant localement le nom du fichier d’origine.

Info
Cet exemple est également obsolète et ne fonctionne plus, mais
il permet d’illustrer tout l’intérêt de curl.

On n’a fait ici qu’effleurer la surface de curl. Sa page


man, si elle n’est pas aussi longue que celle de wget,
contient de nombreuses informations utiles. Prenez le temps
de la lire.

Conclusion

Les commandes de ce chapitre sont parmi mes favorites,


car elles permettent d’accomplir des tâches qui autrement
seraient laborieuses, risquées ou compliquées. Elles font de
votre réseau une avenue fluide pour vos données, vos
programmes et votre imagination. En mettant gratuitement
à disposition des utilisateurs des outils aussi puissants que
ssh, rsync, wget et curl, Linux encourage l’innovation et la
sécurité, ce qui est impossible avec un autre système
d’exploitation pourtant massivement utilisé. Maîtrisez ssh
pour vous connecter en toute sécurité à d’autres
ordinateurs, apprenez à utiliser rsync pour effectuer des
sauvegardes sûres et automatisées, et appuyez-vous sur
wget et sur curl pour gérer vos téléchargements. Vous vous
féliciterez rapidement de maîtriser ces commandes.
Index
Symboles

^-g (Ctrl-g), rechercher dans l’historique des commandes 250–253


^-r (Ctrl-r), rechercher dans l’historique des commandes 250–253
^-s (Ctrl-s)
rechercher dans l’historique des commandes 250–253
résoudre les problèmes 251
< (inférieur à), rediriger l’entrée 97
>> (très supérieur à), rediriger la sortie 96
> (supérieur à), rediriger la sortie 94–95
|| (tube double), chaîner des commandes 89–90
| (tube)
éditeurs de texte et 94
rediriger la sortie 92–94
~ (tilde), répertoire personnel 20
$(), substitution de commande 90–91
00QUICKSTART (fichier) 281
{} (accolades), caractères jokers 12–15
` (apostrophe inverse), substitution de commande 91
’ (apostrophe simple), dans les expressions régulières 206–208
* (astérisque)
caractère joker 12
extensions de fichiers, risques d’utilisation 157
types de fichiers 25
/ (barre oblique)
noms de fichiers et 9
types de fichiers 25
\ (barre oblique inverse), caractère d’échappement 10, 159
_ (caractère de soulignement), dans les noms de fichiers 10
[] (crochets), caractères jokers 12–15, 46
: (deux-points)
commande chown 159
échappement 159
&& (esperluette double), chaîner des commandes 87–89
" (guillemets)
dans les expressions régulières 206–208
dans les noms de fichiers 10
. (point)
chown et 159
répertoire courant 45
! (point d’exclamation), dans les expressions régulières 207
? (point d’interrogation), caractère joker 12
!! (points d’exclamation doubles), répéter des commandes 247–248
![##], répéter des commandes avec des nombres 248
![chaîne], répéter des commandes avec des chaînes 249–250
; (point-virgule), chaîner des commandes 85–87
- (tiret), dans les noms de fichiers 10
-- (tirets doubles), dans des commandes 67
-v (verbeux), option 47

A
Access Control List (ACL) 160
Accolades ({}), caractères jokers 12–15
ack (commande) 209
ACL (Access Control List) 160
Alias
afficher tous 254
comparés aux fonctions 264–266
permanents, créer 256
pour les options de ls 34
spécifiques, afficher 254
supprimer 257
temporaires, créer 255
alias (commande) 254–255, 256
AND, rechercher des expressions avec 232–233
Apostrophe inverse (`), substitution de commande 91
Apostrophe simple (‘), dans les expressions régulières 206–208
Apper 305
apropos (commande) 73–74
apt-cache search (commande) 304–306
apt-get clean (commande) 306–307
apt-get dist-upgrade (commande) 304
apt-get -f install (commande) 308
apt-get -f remove (commande) 308
apt-get install (commande) 298–301
apt-get remove (commande) 301–302
apt-get upgrade (commande) 302–304
apt --installed list (commande) 302
APT, résolution des problèmes 307–308
Arguments
alias comparés aux fonctions 265–266
comparés aux paramètres 265
Astérisque (*)
caractère joker 12
extensions de fichiers, risques de l’utilisation 157
types de fichiers 25
Attributs de fichiers, abréviations 160
awk (commande) 145–148

Barre oblique (/) 9, 25


Barre oblique inverse (\), caractère d’échappement 10, 159
.bash_aliases (fichier) 17
ajouter
alias 256
fonctions 260–262
supprimer
alias 257
fonctions 263–264
.bash_functions (fichier) 17, 260
.bash_history (fichier) 246
.bash_login (fichier) 16
.bash_logout (fichier) 17
.bash_profile (fichier) 16
.bashrc (fichier) 17
ajouter des alias 256
ajouter des fonctions 260–262
bash (shell) 245
afficher l’historique des commandes 245–246
fichier .bash_history, problèmes de sécurité 246
Bluefish, installer 299
bunzip2 (commande) 191–192
bunzip2 -t (commande) 192
bzip2
archives 191–192, 192
commande 177, 190–191
bzip2 -[0-9] (commande) 178
bzip2 -d (commande) 192

Cache 282
Capture d’écran 86
Caractère d’échappement (\) 159
Caractère de soulignement (_), dans les noms de fichiers 10
Caractères
compter 122–124
d’échappement 10
jokers 11–15
afficher le contenu d’un répertoire 21–22
comparés aux expressions régulières 206
copier des fichiers 46–47
rechercher la documentation d’une commande 74
recherches dans la base de données de man 72
supprimer des fichiers 63
supprimer des répertoires et des fichiers 66
remplacer 135
répétés, remplacer 136–137
spéciaux
dans les expressions régulières 206
dans les noms de fichiers 9, 67–68
supprimer 137–140
cat (commande) 104, 104–105, 105–106
cat -n (commande) 106–107
cd ~ (commande) 36
cd - (commande) 37
cd (commande) 36
Champs spécifiques, afficher 145–148
Changement, date de 230
Chemins
dans les résultats des recherches 224
absolus 225
relatifs 224
des commandes, rechercher 80–81
du répertoire de travail, afficher 35–36
chgrp -c (commande) 151
chgrp (commande) 155–156
chgrp -R (commande) 156–157
chgrp -v (commande) 151
Chiffrement
algorithmes 341
archives zip 183–184
chmod 000 (commande) 165
chmod (commande)
changer les permissions 162–166
sgid, activer et désactiver 171–173
sticky bit, activer et désactiver 173–176
suid, activer et désactiver 168–171
chmod -R (commande) 167–168
chown (commande) 157–159
chown -R (commande) 158
Classes de caractères 135
clear (commande) 18
Codage ASCII 139
Colonnes, sélectionner dans des fichiers 125–128
Commandes
ack 209
alias 254–256
comparés aux fonctions 264–266
annuler 23
apropos 73–74
apt-cache search 304–306
apt-get clean 306–307
apt-get dist-upgrade 304
apt-get -f install 308
apt-get -f remove 308
apt-get install 298–301
apt-get remove 301–302
apt-get upgrade 302–304
apt --installed list 302
awk 145–148
bunzip2 191–192
bunzip2 -t 192
bzip2 177, 190–191
bzip2 -[0-9] 178
bzip2 -d 192
cat 104–105, 105–106
cat -n 106–107
cd 36
cd - 37
cd ~ 36
chaîner 85–90
chgrp 155–156
chgrp -c 151
chgrp -R 156–157
chgrp -v 151
chmod 162–166, 168–176
chmod 000 165
chmod -R 167–168
chown 157–159
chown -R 158
clear 18
combiner des options 33
compress 177
cp 44–45
cp * 46–47
cp -a 50–51
cp -i 48–49
cp -v 47
cron 352
curl 358–359
cut 125–128
declare -f 263
df 55, 282–284
dhclient 324–325
dig 315–318
dircolors 27
dpkg -i 296–297
dpkg -l 297
dpkg -r 297
du 284–285
du -s 285
echo 58
egrep 205
en échec, chaînage de commandes 89–90
exécuter sur les résultats d’une recherche 237–239
fgrep 205
file 101–103
find 223–232, 237–239
find + 240–242
find -a 232–233
find -fprint 223
find -n 235–237
find -o 233–235
free 281–282
function 258–262
grep 93, 204–208, 212–214, 220
grep [-ABC] 214–217
grep -c 218–219
grep --color=auto 209–210
grep -i 210–211
grep -l 218
grep -n 212
grep -R 208–209
grep -v 217
grep -w 211–212
gunzip 189
gunzip -t 190
gzip 177, 186–187
gzip -[0-9] 178
gzip -d 189
gzip -r 187–189
head 111, 112
head -c 113–115
head -n 113
history 132, 245–246
host 315–318
htop 276
iconv 139–140
ifconfig 310–312, 318–320
ifdown 327–328
ifup 325–327
import 86
info 76–80
ip addr add 318–320
ip addr show 310–312
ip link set 318–320, 325–328
ip route 328–333
iwconfig 321–323
kill 272–274
killall 274
less 72, 92, 107–111
ln 56–62
locate 199–203, 223
locate -i 201–202
locate -n 199
ls 19–21
ls * 21–22
ls -1 23
ls -a 24–25
ls --color 26–27
ls -F 25–26
ls -h 34
ls -i 55–56
ls -l 28–31, 61–62
ls -m 24
lsof 276–277, 279
lsof -c 279–281
lsof -u 278–279
ls -r 31–32
ls -R 22–23
ls -S 33
ls -t 32–33
man 69–72
man [1-8] 75–76
man -f 72–73
man -k 73–74
man -t 69
man -u 69
mkdir 42–43
mkdir -p 43–44
mkdir -v 19, 39
mlocate 200, 203
mtr 315
multitail 117
mv 51–54
netstat 329
nl 124–125
nmcli 321–323
pgrep 214
ping 312–314, 333–336
ping -c 312–314
ps 93, 213–214
ps aux 268–270
ps axjf 270–271
pstree 271
ps U 271–272
pwd 35–36
rechercher les précédentes 250–253
rediriger
la sortie 92–96, 98–100
l’entrée 97, 98–99
rename 238
répéter 247–248, 250
avec des chaînes 249–250
avec des nombres 248
réseau obsolètes 309
réussies, chaînage de commandes 87–89
rm 62–63, 67–68
rm * 63
rmdir 65
rm -i 64
rm -rf 65–66
rm -v 19, 39
route 328–333
rpm -e 289
rpm -ihv 288–289
rpm -qa 289
rpm -Uhv 288–289
rsync 346–352
scp 345–346
sed 141–145
séquentielles
avec une esperluette double 87–89
avec un point-virgule 85–87
avec un tube double 89–90
set -o noclobber 95–96
sftp 343–344
shred 63
sleep 86
slocate 200, 203
sort 128–129
sort -h 130–132
sort -n 130–132
ssh 337–342
ssh-agent 342
stat 230
su 151–152, 153
su - 154
substitution 90–91
su -l 152–153
sur plusieurs lignes 248
tac 107
tail 115–116, 116–117
tail -f 118–119
tail -n 117–118
tar 178
tar -cf 192–193
tar -pzcvf 194–195
tar -pzvxf 197
tar -zvtf 196
tee 99–100
telnet 337
time 203
top 274–276
touch 39–40, 42
touch -t 40–42
tr 97, 135
traceroute 314–315
trash 63
tr -d 137–140
tr -s 136–137
type 82–83, 210
unalias 257
uniq 132–134
unlink 57
unset -f 263–264
unzip 185
unzip -l 186
unzip -t 185–186
updatedb 202–203
uptime 267–268
useradd 157
usermod 157
wc 122–124
wget 352–358
whatis 72–73
whereis 80–81
which 81–82
whoami 152
wput 356
xargs 241–242
yum install 290–292
yum list available 295
yum list installed 293
yum remove 292–293
yum search 295
yum update 294–295
zip 177, 178–179
zip -[0-9] 180–181
zip -e 183–184
zip -i 181–183
zip -P 183–184
zip -r 181–183
compress (commande) 177
Compter
mots/lignes/caractères 122–124
termes de recherche 218–219
Connexions réseau
activer 325–327
configurer 318–320
déconnecter 327–328
sans fil
afficher l’état 321–323
configurer 323
Consultation, date de 230
Correspondances négatives 217
cp -a (commande) 50–51
cp (commande) 44–45
cp * (commande) 46–47
cp -i (commande) 48–49
cp -v (commande) 47
Crochets ([]), caractères jokers 12–15, 46
cron (commande) 352
Ctrl+C 23
Ctrl-g 250–253
Ctrl-r 250–253
Ctrl-s 250–253
curl (commande) 358–359
cut (commande) 125–128

Date
des fichiers, changer 39–40
recherches en fonction 229–232
trier le contenu des répertoires 32–33
DEB, paquetages 287
installer 296–297
installés, afficher 297
mettre à jour avec les dépendances 302–304
rechercher 304–306
résoudre les problèmes d’APT 307–308
supprimer 297, 301–302
les programmes d’installation 306–307
declare -f (commande) 263
Décompression de fichiers
afficher la liste des fichiers 186
commandes
bunzip2 191–192
gunzip 189
tar -pzvxf 197
unzip 185
tester la corruption 185–186
Dépendances
paquetages
DEB 298–304
RPM 290–295
résoudre les problèmes d’APT 308
Déplacements
de fichiers 51–53
de liens symboliques 54
Dépôts 300
Désarchivage de fichiers 196
Deux-points (:)
commande chown 159
échappement 159
df (commande) 55, 282, 282–284
dhclient (commande) 324–325
DHCP (Dynamic Host Control Protocol), obtenir des adresses 324–325
dig (commande) 315–318
Digital Signature Algorithm (DSA) 341
dircolors (commande) 27
Directory (noeud) 78
Disques, surveiller l’utilisation 282–284
Distributions 287. Voir aussi DEB, paquetages ; RMP, paquetages
DNF (Dandified Yum) 290
DNS (Domain Name System)
effectuer des recherches 315–318
résoudre les problèmes 334
Documentation sur les commandes 69
afficher le synopsis d’une commande 72–73
commandes
info 76–80
man 69–72
type 82–83
whereis 80–81
which 81–82
lire des pages de manuel spécifiques 75–76
rechercher 73–74
Domain Name System (DNS)
effectuer des recherches 315–318
résoudre les problèmes 334
dotfiles 15–17
disponibles sur GitHub 15
dpkg -i (commande) 296–297
dpkg -l (commande) 297
dpkg -r (commande) 297
DSA (Digital Signature Algorithm) 341
du (commande) 284–285
du -s (commande) 285
Dynamic Host Control Protocol (DHCP), obtenir des addresses 324–325

E
ECDSA (Elliptic Curve Digital Signature Algorithm) 341
echo (commande) 58
Écran, effacer 18
Écrasement de fichiers
empêcher 95–96
éviter 48–49
Éditeurs de texte, changer 110
egrep (commande) 205
Elliptic Curve Digital Signature Algorithm (ECDSA) 341
Enregistrements DNS, rechercher 315–318
Entrée, redirection
avec inférieur à (<) 97
combiner à la redirection de la sortie 98–99
Espaces dans les noms de fichiers 10–11
exécution de commandes 242–243
Esperluettes doubles (&&), chaîner des commandes 87–89
Expansion
des accolades 12–15
des noms de fichiers 12
Expressions régulières
caractères spéciaux dans 206
commandes
grep 204–208
sed 143–145
whatis 73
comparées aux caractères jokers 206
guillemets et 206–208
ressources d’information 73
Extensions, déterminer le type de fichier 101–103

fgrep (commande) 205


Fichiers 7–8
afficher 101
commande cat 104
des champs spécifiques 145–148
la taille 28–31, 34
les dernières lignes 115–116
les dernières lignes de plusieurs fichiers 116–117
les dernières lignes modifiées 118–119
les premières lignes 111
les premières lignes de plusieurs fichiers 112
les premiers octets 113–115
les utilisateurs 279
le type 25–26
page par page 107–109
ajouter la sortie à 96
annuler la suppression 63
archiver 177
ajuster le taux de compression 180–181
chiffrer et protéger par mot de passe 183–184
combiner avec des outils de compression 194–195
commande bzip2 190–191
commande gzip 186–187
commande tar -cf 192–193
commande zip 178–179
récursivement 181–183, 187–189
types de fichiers spéciaux 181–183
cachés, afficher 24–25
changer la date 39–42
combiner la redirection de l’entrée et de la sortie 98–99
comme entrée d’une commande 97
commençant par un point 15–17
compresser 177
ajuster le niveau de compression 180–181
chiffrer et protéger par mot de passe 183–184
combiner avec des outils d’archivage 194–195
commande bzip2 190–191
compresser
commande gzip 186–187
commande zip 178–179
fichiers de type spécifique 181–183
récursivement 181–183, 187–189
compter les mots/lignes/caractères 122–124
concaténer
avec des numéros de lignes 106–107
vers la sortie standard 104–105
vers un autre fichier 105–106
convertir
les formats d’encodage 139
pour le Web 137–140
copier 44–45
avec des caractères jokers 46–47
créer des sauvegardes 50–51
de façon sécurisée 345–346
en mode bavard 47
éviter les écrasements 48–49
corrompus 186
archives bzip2 192
archives gzip 190
archives tar 196
archives zip 185
tester 196
créer des liens vers 56–62
décompresser
afficher les fichiers 186
commande bunzip2 191–192
commande gunzip 189
commande tar -pzvxf 197
commande unzip 185
tester la corruption 185–186
délimités, sélectionner des colonnes 125–128
déplacer 51–53
déterminer le type 101–103
diviser le flux de sortie 99–100
écrasements
empêcher 95–96
éviter 48–49
envoyer 356
filtres 121
inodes 54–56
journaux 118–119
liste. Voir ls (commande)
modifier dans un pager 110–111
multiples
afficher les dernières lignes 116–117
afficher les premières lignes 112
nommer
caractères spéciaux dans les noms 9–11
longueur des noms 8
sensibilité à la casse 8–9
numéroter les lignes 124–125
ouverts
afficher la liste 276–277
par un utilisateur, afficher 278–279
permissions. Voir Permissions prêts pour le Web 137–140
propriétaire. Voir Propriétaire recherches dans. Voir Recherches dans
des fichiers
recherches de. Voir Recherches de fichiers
rediriger la sortie 94–95
renommer 53–54
sauvegarder de façon sécurisée 346–352
source, rechercher 80–81
stocker 54–56
supprimer 62–63
avec des caractères jokers 63
caractères spéciaux dans les noms de fichiers 67–68
éviter les suppressions accidentelles 64
les lignes dupliquées 132–134
supprimés, récupérer 63
télécharger 352–356, 358–359
transférer de façon sécurisée 343–344
transformer du texte 141–145
trier le contenu 128–129
numériquement 130–132
types spécifiques, archiver/
compresser 181–183
vides, créer 42
file (commande) 101–103
Filtres 121
afficher des champs spécifiques 145–148
compter des mots/lignes/caractères 122–124
numéroter les lignes des fichiers 124–125
remplacer des caractères 135
répétés 136–137
sélectionner des colonnes dans des fichiers délimités 125–128
supprimer
des caractères 137–140
les lignes dupliquées 132–134
transformer du texte 141–145
trier le contenu d’un fichier 128–129
find + (commande) 240–242
find -a (commande) 232–233
find command
comparée à la commande locate 223
exécuter des commandes sur les résultats 237–239, 242–243
rechercher
par date 229–232
par nom 223–225
par propriétaire 225–226
par taille de fichier 226–228
par type de fichier 228–229
find -fprint (commande) 223
find -n (commande) 235–237
find -o (commande) 233–235
Flux d’entrée-sortie 91–92
combiner la redirection de l’entrée et de la sortie 98–99
rediriger
la sortie 92–96, 99–100, 105–106
l’entrée 97
Fonctions
afficher toutes 262–263
comparées aux alias 264–266
créer
permanentes 260–262
temporaires 258–259
préparer des fichiers pour le Web 137–140
supprimer 263–264
Formats d’encodage, convertir 139–140
Forta, Ben 73
free (commande) 281–282
function (commande) 258–262

Gestion de paquetages 287, 305–306


distributions Debian. Voir DEB, paquetages
distributions fondées sur RPM. Voir RPM, paquetages
gestionnaires graphiques 295, 305–306
GID (ID de groupe) 155–156
GitHub, consulter mes dotfiles 15
GNOME PackageKit 305
GNOME Software 305
Greer, Brian 335
grep [-ABC] (commande) 214–217
grep -c (commande) 218–219
grep --color=auto (commande) 209–210
grep (commande) 93
expressions régulières 204–208
rechercher
dans des fichiers 204
dans des résultats 220
dans la sortie d’une commande 212–214
versions 205
grep -i (commande) 210–211
grep -l (commande) 218
grep -n (commande) 212
grep -R (commande) 208–209
grep -v (commande) 217
grep -w (commande) 211–212
Groupe propriétaire
changer 155–156
avec le propriétaire du fichier 158–159
récursivement 156–157
rechercher en fonction du 225–226
Guillemets («)
dans les expressions régulières 206–208
noms de fichiers 10
gunzip (commande) 189
gunzip -t (commande) 190
gzip
archives
décompresser 189
tester la corruption 190
commande 177
archiver/compresser des fichiers 186–187
gzip -[0-9] (commande) 178
gzip -d (commande) 189
gzip -r (commande) 187–189

head -c (commande) 113–115


head (commande) 111, 112
head -n (commande) 113
Historique des commandes
afficher 245–246
rechercher 250–253
répéter la dernière commande 247–248
avec des chaînes 249–250
avec des nombres 248
history (commande) 132, 245–246
host (commande) 315–318
$HOSTNAME (variable d’environnement) 127
htop (commande) 276

I
iconv (commande) 139
ID du processus parent (PPID), numéro 271
ifconfig (commande) 310–312, 318–320
ifdown (commande) 327–328
ifup (commande) 325–327
import (commande) 86
Inférieur à (<) 97
info (commande) 76–80
Inodes 54–56
afficher les numéros 55–56
.inputrc (fichier) 17
modifier 252–253
Installation
Bluefish 299
logiciels. Voir Gestion de paquetages
noyaux 289
Shotwell 290–292
Skype 296
Invites secondaires 259
ip addr add (commande) 318–320
ip addr show (commande) 310–312
ip link set (commande) 318–320, 325–328
ip route (commande) 328–333
IPv4, adresses 309–310
IPv6, adresses 309
iwconfig (commande) 321–323

J
Journaux, afficher les dernières lignes 119

K
killall (commande) 274
kill (commande) 272–274
known_hosts (fichier) 261
SSH 338–340

L
less (commande) 92
afficher les fichiers par page 107–109
avec la commande man 72
caractères de contrôle des couleurs 109
commandes principales 108
modifier des fichiers depuis 110–111
rechercher 109–110
Liens
afficher 61
créer 56–62
matériels 56–62
comparés aux liens symboliques 60–62
supprimer 57
symboliques 59–62
comparés aux liens matériels 60–62
déplacer 54
Lignes
compter 122–124
dupliquées, supprimer 132–134
numéros
ajouter aux fichiers 106–107, 124–125
dans les résultats de recherche 212
vides, supprimer 123
Linux, distributions 287. Voir aussi Paquetages DEB ; Paquetages RPM
LinuxMM 282
Liste. Voir aussi ls (commande)
fichiers dans les archives zip 186
fichiers ouverts 276–277
par un utilisateur 278–279
noms de fichiers comme résultats
d’une recherche 218
paquetages
DEB installés 297, 302
RPM installés 289
processus d’un programme 279–281
utilisateurs de fichiers 279
ln (commande) 56–62
locate (commande) 199–203, 223
mettre à jour la base de données 202–203
locate -i (commande) 201–202
locate -n (commande) 199
loopback, adresse 311
ls -1 (commande) 23
ls -a (commande) 24–25
ls --color (commande) 26–27
ls (commande) 19–20, 20–21
ls * (commande) 21–22
ls -F (commande) 25–26
ls -h (commande) 34
ls -i (commande) 55, 61
ls -l (commande) 28–31, 61
ls -m (commande) 24
lsof -c (commande) 279–281
lsof (commande) 276–277, 279
lsof -u (commande) 278–279
ls -r (commande) 31–32
ls -R (commande) 22–23
ls -S (commande) 33
ls -t (commande) 32–33

man [1-8] (commande) 75–76


man (commande) 69–72. Voir aussi Pages de manuel
man -f (commande) 72–73
man -k (commande) 73–74
man -t (commande) 69
man -u (commande) 69
Markdown 103
Mémoire, surveiller l’utilisation 281–282
Mise à jour
base de données de locate 202–203
paquetages
DEB, avec les dépendances 302–304
RPM, avec les dépendances 294–295
mkdir (commande) 42–43
mkdir -p (commande) 43–44
mkdir -v (commande) 19, 39
mlocate (commande) 200, 203
Modification, date de 230
Mots
compter 122–124, 218–219
dans un contexte, recherche dans les fichiers 214–217
Mots de passe
archives zip 183–184
ouverture de session à distance 340–342
mtr (commande) 315
multitail (commande) 117
Muon Discover 305
mv (commande) 51–53, 54

N
Navigateurs Web 356
textuels 356
netstat (commande) 329
nl (commande) 124–125
nmcli (commande) 321–323
noclobber (option) 95–96
Nœuds 77–80
secondaires 77
parcourir 77–80
Noms de fichiers
afficher comme résultats d’une recherche 218
caractères spéciaux 9–11
contenant des caractères spéciaux 10–11
supprimer des fichiers 67
contenant des espaces, exécuter des commandes sur 242–243
extension déterminant le type de fichier 101–103
longueur 8
rechercher avec 223–225
sensibilité à la casse 8–9
Notation
alphabétique
activer suid 169
modifier les permissions 162–163
octale
activer suid 170
modifier les permissions 163
NOT, rechercher des expressions avec 235–237
Noyaux, installer 289
NR (variable awk) 148

Octets, préfixes 115


Octopi 305
Options, combiner 33
OR, rechercher des expressions avec 233–235
Ouvertures de sessions à distance 337–340
sans mot de passe 340–342

P
Pagers 72, 107
modifier des fichiers dans 110–111
recherches dans 109–110
Pages de manuel
parcourir 71
rechercher 71, 80–81
sections 71
spécifiques, consulter 75–76
pandoc 301
Paquets, suivre la route 314–315
Paramètres
comparés aux arguments 265
positionnels 258, 265
Permissions 151, 160–161
abréviations pour les attributs de fichiers 160
afficher 28–31
changer
avec la notation alphabétique 162–163
avec la notation octale 163–166
récursivement 167–168
sgid, activer et désactiver 171–173
sticky bit, activer et désactiver 173–176
suid, activer et désactiver 168–171
utilisateurs root 161
pgrep (commande) 214
PID, avec la commande tail 119
ping -c (commande) 312–314
ping (commande) 312–314, 333–336
Point (.)
commande chown 159
répertoire de travail 45
Point d’exclamation (!), dans les expressions régulières 207
Point d’interrogation (?), caractère joker 12–15
Points d’exclamation doubles (!!), répéter des commandes 247–248
Point-virgule (;), chaîner des commandes 85–87
PPID (ID du processus parent), numéro 271
Préfixes pour les octets 115
Problèmes, résoudre
APT 307–308
Ctrl-s 251
réseau 333–336
Processus
afficher l’arborescence 270–271
d’un programme, afficher 279–281
d’un utilisateur, afficher 271–272
en cours d’exécution, afficher 268–270
dynamiquement 274–276
terminer 272–274
zombie 269
tuer 273
.profile (fichier) 16
Programmes
afficher les processus 279
d’installation, supprimer 306–307
exécutables, rechercher 80–81
Propriétaire
afficher 28–31
des fichiers 151
changer 157–159
changer récursivement 158
dans les recherches 225–226
modifier le groupe 155–156
modifier le groupe
récursivement 156–157
ps aux (commande) 268–270
ps axjf (commande) 270–271
ps (commande) 93, 213–214
pstree (commande) 271
ps U (commande) 271–272
pwd (commande) 35–36

R
Readline (bibliothèque) 17
Recherches
chemins d’une commande 80–81
dans des fichiers
commande grep 204
compter les mots 218–219
contexte des mots 214–217
dans les résultats d’une recherche 220
expressions régulières 204–208
insensibles à la casse 210–211
mettre en exergue les résultats 209–210
noms comme résultats des recherches 218
non-correspondances 217
numéros de ligne dans les résultats 212
récursives 208–209
sur un mot entier 211–212
dans les pagers 109–110
de fichiers
avec des expressions AND 232–233
avec des expressions NOT 235–237
avec des expressions OR 233–235
commande locate 199–201
exécuter des commandes sur les résultats 237–239, 240–242
insensibles à la casse 201–202
mettre à jour la base de données de locate 202–203
par date 229
par nom 223–225
par propriétaire 225–226
par taille 226–228
par type 228–229
DNS inverses 316
documentation d’une commande 73–74
gestionnaires graphiques de paquetages 295
GID (ID de groupe) 155
historique de la ligne de commande 250–253
pages
info 79
man 71
paquetages
DEB 304–306
RPM 295
sortie d’une commande 212–214
surligner les résultats 209–210
versions d’une commande 81–82
Redirection
de la sortie. Voir Sortie, redirection
de l’entrée. Voir Entrée, redirection
de l’entrée et de la sortie, combiner 98–99
regexp. Voir Expressions régulières rename (commande) 238
Renommage
fichiers 53–54
répertoires 53–54
Répertoires 7
afficher le contenu. Voir ls (commande)
changer 36
créer 42–43
avec des sous-répertoires 43–44
des liens vers 56–62
inodes 55
liste séparée par des virgules 24
permissions 31, 151
propriétaire 151
renommer 53–54
répertoire de travail 45
déterminer 35–36
répertoire personnel 20, 36
aller dans 36
répertoire précédent, aller dans 37
supprimer
contenu et répertoire 65–66
répertoires vides 65
surveiller l’utilisation de l’espace 284–285
trier le contenu en fonction de la date 32–33
vides, supprimer 65
Réseaux 309
adresses
DHCP, obtenir 324–325
IPv6 309
loopback 311
commandes obsolètes 309
connexions
activer 325–327
afficher l’état 310–312
configurer 318–320
désactiver 327–328
sans fil 321–323
vérifier l’état 312–314
dépanner 333–336
recherches DNS 315–318
sécurité. Voir Sécurité
suivre le chemin des paquets 314–315
table de routage IP
afficher 328–330
modifier 330–333
télécharger des fichiers
sans interaction 352–356
séquentiellement 358–359
télécharger un site web sans interaction 357–358
rm (commande) 62–63, 67–68
rm * (commande) 63
rmdir (commande) 65
rm -i (commande) 64
rm -rf (commande) 65–66
rm -v (commande) 19, 39
root, utilisateur
devenir 153
avec les variables d’environnement 154
permissions 161
route (commande) 328–333
rpm -e (commande) 289
rpm -ihv (commande) 288–289
RPM, paquetages 287
APT et 298
installer 288–289
avec les dépendances 290–292
installés, afficher 289, 293
mettre à jour, avec les dépendances 294–295
rechercher 295
supprimer 289
avec les dépendances 292–293
rpm -qa (commande) 289
rpm -Uhv (commande) 288–289
RSA (chiffrement) 341
rsync (commande) 346–352

S
Sauvegardes
créer avec cp 50–51
sécurisées des fichiers 346–352
scp (commande) 345–346
Scripts de démarrage cachés. Voir dotfiles
Sections des pages man 75–76
Sécurité
copie de fichiers 345–346
fichier .bash_history 246
ouverture de session à distance 337–340
sans mot de passe 340–342
sauvegarde de fichiers 346–352
transfert de fichiers 343–344
sed (commande) 141–145
Serveurs SSH, port par défaut 344
Session, ouvrir à distance 337–340
sans mot de passe 340–342
set -o noclobber (commande) 95–96
sftp (commande) 343–344
sgid 160
activer et désactiver 171–173
Shells. Voir aussi bash (shell)
d’ouverture de session 15
interactifs 16
non d’ouverture de session 16
non interactifs 16
Shotwell
installer 290–292
supprimer 292–293
shred (commande) 63
Sites Web, télécharger 357–358
non interactivement 357–358
Skype, installer 296
sleep (commande) 86
slocate (commande) 200, 203
Smart 305
.so (objet partagé), fichiers 280
sort (commande) 128–129
sort -h (commande) 130–132
Sortie. Voir aussi Flux d’entrée-sortie
ajouter à des fichiers 96
des commandes, rechercher dans 212–214
en colonnes du contenu des répertoires 23
en couleur
affichage des répertoires 26–27
commande less 109
inverser l’ordre du contenu d’un répertoire 31–32
redirection
combiner à la redirection de l’entrée 98–99
commande tee 99–100
concaténer des fichiers 105–106
empêcher les écrasements 95–96
supérieur à (>) 94–95
très supérieur à (>>) 96
tube (|) 92–94
sort -n (commande) 130–132
Sous-répertoires
afficher le contenu 22–23
créer avec des répertoires 43–44
Sous-shells 16
SSH
clés, modifier le fichier known_hosts 261
serveurs, port par défaut 344
ssh-agent (commande) 342
ssh (commande) 337–340, 340–342
STAT (colonne de la commade ps) 269
stat (commande) 230
stderr 91–92
stdin 91–92
stdout 91–92
concaténer des fichiers vers 104–105
diviser le flux de sortie 99–100
sticky bit 160
activer et désactiver 173–176
su - (commande) 154
su (commande) 151–152, 153
suid 160
activer et désactiver 168–171
su -l (commande) 152–153
Supérieur à (>) 94–95
Suppressions
accidentelles, empêcher 64
alias 257
fonctions 263–264
liens 57
lignes dupliquées 132–134
paquetages DEB 297
avec les dépendances 301–302
programmes d’installation 306–307
paquetages RPM 289
avec les dépendances 292–293
Shotwell 292–293
Surveillance du système 267
durée d’activité du système 267–268
fichiers ouverts 276–277
d’un utilisateur 278–279
mémoire, utilisation de l’espace 281–282
processus
arborescence 270–271
d’un programme 279–281
d’un utilisateur 271–272
en cours d’exécution 268–270, 274–276
terminer 272–274
répertoires, utilisation de l’espace 284–285
systèmes de fichiers, utilisation de l’espace 282–284
Synaptic 306
Système de fichiers, afficher l’utilisation 282–284

Table de routage IP
afficher 328–330
modifier 330–333
tac (commande) 107
tail (commande) 115–117
tail -f (commande) 118–119
Taille
dans la recherche des fichiers 226–228
des fichiers 34
trier le contenu d’un répertoire 33
tail -n (commande) 117–118
Tampons 282
tar, archives 178, 192
décompresser 197
tester la corruption 196
tar -cf (commande) 192–193
tar (commande) 178
tar -pzcvf (commande) 194–195
tar -pzvxf (commande) 197
tar -zvtf (commande) 196
Taux de compression, ajuster 180–181
tee (commande) 99–100
telnet (commande) 337
Texte
éditeurs
changer 110
tube (|) et 94
navigateurs Web 356
transformer 141–145
Tilde (~), répertoire personnel 20
time (commande) 203
Tiret (-) 10
Tirets doubles (--), dans les commandes 67
top (commande) 274–276
touch (commande) 39–40, 42
touch -t (commande) 40–42
traceroute (commande) 314–315
trash (commande) 63
tr (commande) 97, 135
tr -d (commande) 137–140
Très supérieur à (>>), rediriger la sortie 96
Tri du contenu
des fichiers 128–129
des répertoires
par date 32–33
par taille 33
tr -s (commande) 136–137
Tube (|) 92–94
Tubes doubles (||), chaîner des commandes 89–90
type (commande) 82–83, 210

U
Ubuntu Software Center 306
UID (ID de l’utilisateur) 155
unalias (commande) 257
uniq (commande) 132–134
unlink (commande) 57
unset -f (commande) 263–264
unzip (commande) 185
unzip -l (commande) 186
unzip -t (commande) 185–186
updatedb (commande) 202–203
uptime (commande) 267–268
useradd (commande) 157
usermod (commande) 157
UTF-8 (encodage) 139
Utilisateurs
abréviations 160
afficher les fichiers ouverts 278–279
changer 151, 152
avec les variables d’environnement 152–153
devenir root 153
devenir root avec les variables d’environnement 154
des fichiers, afficher 279
propriétaires des fichiers, rechercher avec 225–226

V
Variables d’environnement
changer d’utilisateur 152–153
devenir root 154
Versions des commandes, rechercher 81–82
vi 111
vim 111

Wall, Larry 238


wc (commande) 122–124
wget (commande) 352–358
whatis (commande) 72–73
whereis (commande) 80–81
which (commande) 81–82
whoami (commande) 152
Wieers, Dag 298
wput (commande) 356

X
xargs (commande) 241–242
XOFF, désactiver le contrôle de flux 251

Yumex 306
yum install (commande) 290–292
yum list available (commande) 295
yum list installed (commande) 293
yum remove (commande) 292–293
yum search (commande) 295
yum update (commande) 294–295
Z
Zero Install 306
zip
archives
afficher les fichiers 186
décompresser 185
tester la corruption 185–186
commande 177–178, 178–179
zip -[0-9] (commande) 180–181
zip -e (commande) 183–184
zip -i (commande) 181–183
zip -P (commande) 183–184
zip -r (commande) 181–183

Vous aimerez peut-être aussi