Notes et transcriptions du cours “Administrez un système Linux” disponible sur la plateforme Openclassrooms.
Étant donné que Linux est un système d'exploitation dont la conception initiale est très orientée fichier, vous allez passer votre temps à consulter ces fichiers pour administrer votre serveur. Heureusement, Linux fournit une trousse à outils complète permettant de visualiser de manière efficace le contenu de ces fichiers.
Nous aborderons dans ce chapitre les commandes cat
et le couple infernal more
et less
.
Nous verrons également les trois canaux permettant de manipuler les flux de données, mais aussi les commandes grep
, sed
et awk
qui ajoutent des fonctionnalités de filtrage et de transformation de ces flux.
Enfin nous terminerons par la fonctionnalité favorite de tout administrateur : la possibilité de chaîner des commandes avec les pipes Linux !
Dans le chapitre précédent vous avez pu consulter le contenu du fichier /proc/cpuinfo
grâce à la commande cat
:
seb@thor:~$ type cat cat est /bin/cat
Comme on peut le voir ci-dessus, cette commande est externe au shell. Elle est très connue des administrateurs Linux et Unix avant eux. En effet c'est une commande historique qui permet de prendre un ou plusieurs flux de données en paramètre d'entrée, et de les afficher à l'écran sur le terminal.
Le terme “cat” provient de l'abréviation de “catenate” en anglais, qui signifie “concaténer” (autrement dit : “mettre bout à bout”). Et effectivement, il est possible de concaténer plusieurs flux de données passés en paramètre d'entrée avec cette commande.
# concatène le contenu des 2 fichiers et affiche le résultat cat /etc/os-release /etc/passwd # L'option -n permet de numéroter les lignes sur la sortie cat -n /var/log/kern.log
Vous avez pu remarquer que cat
affiche tout le flux passé en entrée en une fois. Ainsi, la commande lancée sur le fichier /etc/passwd
affiche toutes les lignes en un seul flux. Ce qui va probablement vous obliger à remonter dans l'affichage à l'écran pour consulter les premières lignes du fichier. Idéalement, il faudrait que l'affichage soit “paginé” en fonction du terminal.
C'est exactement ce que propose la commande less
: elle va afficher les données passées en paramètre, paginées directement sur le terminal.
Dans la vidéo suivante, nous allons manipuler la commande less
(et notamment les touches de commandes au clavier permettant de manipuler le flux de données paginé) et découvrir le rôle du fichier /etc/pam.d/login
:
Historiquement, il existait une commande avant la création de less: more.
Même si le nom de cette commande pourrait faire penser qu'elle en fait plus, ce n'est pas le cas. En fait, less a été codée après more par Mark Nudelman qui souhaitait apporter plus de fonctionnalités.
Ce qui en fait un jeu de mots inversé réveillant seul l'humour des développeurs…
Je citerai pour finir, la documentation d'une excellente distribution Linux sur le sujet :
“Less is more, but more more than more is, so more is less less, so use more less if you want less more. (...)” - Slackware Linux Essentials
Quoi qu'il en soit, je vous conseille de vous familiariser avec less.
Dans le chapitre précédent, j'ai utilisé le mot-clé “sortie” pour évoquer les données transmises à l'écran sur le terminal par une commande. Sous Linux, cette notion est conceptualisée avec des canaux (streams en anglais).
Dans la majorité des cas, les programmes exécutés sous Linux disposent de 3 canaux de données :
Pour manipuler ces canaux, il est nécessaire d'utiliser les caractères représentant des :
>
et <
;>>
et <<
.Je vous propose d’utiliser les canaux standard de Linux pour :
stdout
et stderr
) ;/var/logs/messages
.
Très souvent vous n'aurez besoin que d'une partie de l'information affichée à l'écran suite à l'exécution d'une commande. Par exemple sur la commande suivante :
seb@thor:~$ cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 9 (stretch)" NAME="Debian GNU/Linux" VERSION_ID="9" VERSION="9 (stretch)" ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/"
Vous pourriez tout à fait souhaiter récupérer uniquement la ligne contenant le champ NAME pour simplement connaître la distribution que vous exploitez. Pour cela, vous allez utiliser la commande grep
. Cette commande permet de filtrer le flux de données selon un motif (pattern en anglais) passé en paramètre.
Explorons maintenant les possibilités de la commande grep
:
Pour les deux commandes suivantes, il existe une petite bataille de geeks entre :
sed
;awk
.
Souvent les utilisateurs de sed
s'appliqueront à tout faire avec cette commande. Ce qui est vrai également pour les utilisateurs de awk
. De mon côté, je suis plutôt fervent de sed, mais awk me rend service assez souvent également !
Ces deux commandes sont très appréciées des administrateurs car elles permettent de réaliser des opérations sur les flux de données, fichiers, entrée et sortie de manière non interactive. Les deux s'appuyant sur les expressions régulières, qu'il est intéressant de rappeler ici.
Une expression régulière est la modélisation d'un motif dans un flux de données à l'aide de méta-caractères, c'est-à-dire de caractères particuliers auxquels on ajoute une expression ou un opérateur.
Parmi les méta-caractères les plus couramment utilisés on peut retrouver :
Méta-caractères | Fonctionnement |
---|---|
. | Le point remplace n'importe quel caractère (hors retour chariot), par exemple l'expression régulière suivante : S.B, pourrait modéliser SEB ou SAB ou encore SSB, etc. |
? | Le point d'interrogation indique que l'expression modélisée peut être présente 0 ou 1 fois. Par exemple, S.?B, pourrait correspondre à SB ouSEB, mais pas SEEB |
* | L'étoile fonctionne comme le ?, mais autorise 0 ou n fois l'expression, par exemple S.* pourrait modéliser S.*B, mais aussi SEB, mais aussi SAEIOUYB |
+ | Petit dernier de la famille, il permet de modéliser au moins une fois (1 ou n). |
^ | Nous l'avons vu précédemment en exemple, il permet de modéliser la première position, le début. |
$ | À l'inverse, ici, permet de modéliser la dernière position, la fin. |
[] | Les crochets, accompagnés souvent de - , permettent de modéliser un jeu de caractères, par exemple [a-z] pour modéliser l'ensemble des caractères minuscules de l'alphabet. Il est possible également d'utiliser le caractère ^ avec les crochets, qui a alors une autre signification et permet d'omettre une expression. Par exemple [^abc] , modélise tous les caractères sauf a, b et c. |
La commande sed
peut utiliser ces expressions régulières pour transformer un flux de données à la volée de manière non interactive (sed signifie Stream EDitor). Très pratique pour les traitements automatiques. On essaie ?
La commande awk
est en fait un interpréteur pour les instructions compatibles du langage awk
. Le libellé de la commande et/ou langage provient de ses inventeurs Aho, Weinberger et Kernighan dont le manifeste pour awk est encore disponible.
Ce langage et la commande associée sont très puissants. Je vous propose ici simplement de donner l'équivalent des fonctions énoncées pour sed
:
seb@thor:~$awk '{gsub(/.ebian/,"Ubuntu")}1' /etc/os-release
seb@thor:~$ awk '!/.ebian/' /etc/os-release
* Sous-partie :
seb@thor:~$ awk 'NR==2,NR==4' /etc/os-release
grep
, sed
et awk
sont des commandes installées de manière quasiment systématique sur toutes les distributions Linux. N'hésitez pas à vous en servir, elles peuvent vous faire gagner en temps et en efficacité !
Maintenant que vous maîtrisez les différents canaux de données, entrée et sortie standard et erreur, ainsi que les différentes commandes permettant de filtrer un flux selon un motif, il est temps de passer à la vitesse supérieure et d'utiliser toutes ces notions en même temps.
Pour cela, Linux met à votre disposition une fonction permettant de lier entre eux les canaux de données des différentes commandes : le pipe (ou tube / tuyau).
Le principe est simple : il s'agit ici de rediriger un flux, en sortie d'une commande, vers le canal d'entrée de la commande suivante. Et ainsi de suite.
Pour lier ces commandes entres elles, on utilise le caractère |
(prononcé pipe). Il correspond à la séquence de touches ALT GR+6 sur les claviers standards français.
Ainsi il est possible d'écrire quelque chose comme :
commande options arguments | commande options arguments | commande options arguments | ...
Le pipe situé entre la commande 1 et la commande 2 permet d'enchaîner les commandes 1 et 2 en liant leurs canaux de données.
Le pipe Linux pour enchaîner les commandes
Je vous propose d’utiliser le pipe de Linux pour enchaîner les commandes que nous avons rencontrées. Pour cela nous allons travailler avec le fichier /etc/passwd et découvrir deux nouvelles commandes : sort
et cut
!
cat
et less
pour visualiser le contenu des fichiers ;/etc/pam.d/login
permet de gérer le processus d'authentification sous Linux ;/var/log/messages
contient les traces du système Linux ;grep
, sed
et awk
permettent de filtrer les flux de données ;/etc/os-release
contient les informations sur la distribution Linux ;sort
et cut
permettent de manipuler des flux de données sous LinuxDans le chapitre suivant, nous allons voir comment éditer et supprimer des fichiers, allez on y va !