Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. shell sous Unix/Linux
  3. Concepts de base
Extrait - shell sous Unix/Linux Apprenez à écrire des scripts pour administrer votre système
Extraits du livre
shell sous Unix/Linux Apprenez à écrire des scripts pour administrer votre système
2 avis
Revenir à la page d'achat du livre

Concepts de base

Définition du shell

La place du shell dans l’architecture du système a été détaillée au chapitre précédent : il s’agit d’un logiciel parmi d’autres, il joue le rôle de chef d’orchestre afin d’exécuter des commandes pour effectuer des tâches. Cela n’explique pas la manière dont il est utilisé et dont il s’interface avec le reste du système : sans que cela soit bloquant, il est parfois plus facile de l’utiliser quand on comprend son fonctionnement.

L’idée reçue suivante est souvent rencontrée : shell et terminal seraient synonymes. En effet, beaucoup d’utilisateurs pensent que ce sont deux programmes indissociables, voire même un seul programme. Même si en pratique on va généralement comprendre ce que ces personnes veulent dire, il est préférable d’utiliser le bon vocabulaire afin que tout soit clair.

1. Fonction du shell

Lorsqu’un terminal est ouvert sur un poste de travail sous Linux, lui-même lance un shell. C’est alors le terminal qui va transmettre les appuis sur les touches du clavier au shell, ce dernier gérant l’affichage de son invite de commandes (prompt) et des commandes que l’on tape. Lorsque l’on tape sur la touche [Entrée], le terminal transmet cette instruction au shell, celui-ci va alors interpréter la ligne qui lui a été fournie, exécuter la commande qu’on lui demande, puis retourner au terminal le résultat de la commande exécutée, le terminal va alors l’afficher.

Ce que l’on peut retenir, c’est que le shell ne gère pas spécialement un affichage : il reçoit des entrées textuelles et il renvoie des retours textuels. Autrement dit, le programme placé « devant » lui peut être n’importe quoi, il s’en accommodera.

Dans le cas d’une connexion distante par exemple, le protocole SSH (Secure Shell) est utilisé pour se connecter à un serveur. Une fois la connexion SSH ouverte, c’est le serveur SSH qui lance le shell et qui gère le transport du texte, en entrée comme en sortie : il prend le rôle rempli par le terminal lorsque l’on est en interface graphique...

Chaînes et flux

Jusqu’ici, les communications en entrée et en sortie des commandes (en particulier du shell) ont été qualifiées de chaînes de caractères. Pour être parfaitement exact, il faut plutôt parler de flux de données : une commande prend un flux de données en entrée et émet un flux de données en sortie. Bien souvent, ce flux de données est constitué de caractères lisibles (il peut alors être affiché sous la forme d’une chaîne de caractères), mais cela n’est pas obligatoire. Une commande de compression de fichier, par exemple, émettra un flux de données binaire, correspondant au fichier compressé.

En plus des arguments qu’elles acceptent lorsqu’elles sont exécutées, les commandes peuvent donc accepter un flux de données, afin de retourner un autre flux de données. La possibilité de connecter le flux de sortie d’une commande sur le flux d’entrée d’une autre est alors simple à imaginer ; c’est cette caractéristique qui permet de mettre en œuvre le principe KISS évoqué en introduction : on chaîne les commandes les unes derrière les autres.

1. Fichiers et pseudo-fichiers

Un fichier, stocké sur un disque, peut quant à lui être rapproché...

Shell, shell script et langage

Comme cela a été détaillé plus haut, le shell est le logiciel qui traite les commandes qu’il reçoit en entrée. Le script shell, quant à lui, est l’automatisation des commandes que l’on peut soumettre à un shell. Certains disent qu’ils ont « écrit un shell » ; bien évidemment, ce qu’ils veulent dire c’est qu’ils ont écrit un script shell…

De la même manière que d’autres langages de programmation, un script shell propose des structures de contrôle (conditions, boucles, etc.) permettant d’automatiser des tâches et d’effectuer des actions différentes selon les résultats des précédentes, des variables permettant de stocker des valeurs pour les réutiliser plus tard, etc.

Cependant, les scripts shell ont également beaucoup de différences avec les autres langages de programmation. Par exemple, le shell ne propose pas de type de variable : les données sont toujours sous forme de chaînes de caractères, sous forme de flux de données.

En réalité, la différence provient de la façon dont les langages traitent leurs instructions. Un langage de programmation classique va exécuter des fonctions qui prennent des arguments et qui retournent des valeurs qui sont...

Chemins et caractères spéciaux

1. Répertoire courant, chemin relatif ou absolu

Toute commande est exécutée « dans » un répertoire : il s’agit de son répertoire courant, également appelé cwd (pour current working directory). C’est également le cas lorsque l’on est dans un shell ; ce répertoire courant apparaît alors généralement dans le prompt, comme cela a été expliqué plus haut.

Cette localisation permet de pointer des fichiers facilement : vous pouvez désigner un fichier de ce même répertoire en indiquant simplement son nom, au lieu de devoir indiquer à la commande l’endroit précis où il se trouve. C’est précisément la différence entre les concepts de chemins absolu et relatif.

Le chemin absolu permet de désigner un fichier (ou un pseudo-fichier, ou un répertoire...) d’une manière unique, quel que soit son emplacement et quel que soit le répertoire courant. Ce chemin absolu commence par le caractère « /», qui indique la racine de l’arborescence des fichiers. Par exemple, le fichier mon_fichier.txt qui est dans le répertoire esme, lui-même dans le répertoire home à la racine, aura comme chemin absolu /home/esme/mon_fichier.txt et sera accessible sous ce nom, où que l’on se trouve.

Le chemin relatif, quant à lui, s’exprime par rapport au répertoire courant. Lorsque le répertoire courant est /home/esme, alors le chemin relatif de ce fichier est mon_fichier.txt. Par contre, si le répertoire courant est /home, alors le chemin relatif du fichier est esme/mon_fichier.txt. Si le répertoire courant est /home/ghita par exemple, il faut un moyen de pointer vers le parent du répertoire courant ; cela se fait avec le double caractère « .. ». Le chemin relatif de ce même fichier est alors ../esme/mon_fichier.txt.

Exécution de commandes

Les commandes, quant à elles, sont pour la plupart matérialisées sous la forme de fichiers placés dans les répertoires /bin ou /usr/bin. Pour les exécuter, on peut utiliser leur chemin absolu ; c’est d’ailleurs ce que font certains scripts...

Expressions rationnelles

Les shell patterns, vus plus haut, sont un moyen simple de décrire des noms de fichiers directement au niveau du shell. Toutefois, certaines commandes agissant sur des chaînes de caractères (flux ou fichiers) peuvent nécessiter une méthode plus avancée pour décrire et identifier des chaînes. C’est pour cela que, dans les années 1950, les expressions rationnelles ont été inventées (regex ou regexp, pour regular expressions en anglais, parfois traduit en « expressions régulières », ou encore « expressions normales », terme promulgué par la norme ISO/IEC 9945). Sur certains aspects, les expressions rationnelles ressemblent aux motifs shell, mais ils ne sont pas compatibles.

Les expressions rationnelles sont largement présentes dans les environnements UNIX, de nombreuses commandes les utilisant pour identifier des chaînes de caractères afin d’y effectuer un traitement. Ces commandes sont présentées tout au long de ce livre. Des livres entiers traitent uniquement de ce concept : nous aborderons ici uniquement certains aspects des regex, sans entrer dans le détail, l’objectif étant de savoir écrire une expression rationnelle simple, pas d’en devenir un expert.

Une expression rationnelle s’écrit sous la forme d’une chaîne de caractères. Au sein de cette chaîne, certains caractères et certaines suites de caractères ont alors des significations particulières. Une chaîne simple (comme « bonjour ») est déjà une expression rationnelle, dont aucun caractère n’a une signification particulière : elle ne permet d’identifier que cette chaîne elle-même.

Une expression rationnelle est alors composée de différents opérateurs, permettant de décrire différents aspects des chaînes de caractères.

1. Opérateurs

Le tableau suivant résume les opérateurs les plus courants ; les lettres X, Y et Z sont utilisées comme exemples de caractères qui pourraient être présents dans l’expression.

Opérateur

Correspond à…

.

… n’importe quel caractère

[XYZ]...

Utilisateurs et droits

L’aspect multiutilisateur des systèmes UNIX sera la dernière étape de l’exploration de ces concepts de base. Tous les systèmes d’exploitation modernes sont multiutilisateurs : il y a un ou plusieurs administrateurs qui ont des droits « avancés » et des utilisateurs qui ont des droits limités. Sous Linux (et tous les systèmes UNIX), le seul administrateur est root.

1. Identifiants

Chaque utilisateur a un identifiant numérique (UID, User Identifier). Les droits donnés aux utilisateurs sont en réalité liés à cet identifiant numérique et non au nom de l’utilisateur ; l’utilisateur root a l’UID 0 (zéro), c’est le seul à avoir tous les droits sur le système (donc à être administrateur).

Rien n’empêche de donner le même identifiant numérique à deux utilisateurs ; dans ce cas, ils sont traités comme un seul utilisateur. De même, il est possible de changer le nom de l’utilisateur root, tant qu’il garde l’UID 0. Cependant, les différents outils ne sont pas prévus pour gérer ce type de cas de figure, il est préférable de conserver un respect des normes, sinon on risque de rencontrer des problèmes inattendus.

Par défaut, les données liées aux utilisateurs sont stockées dans différents fichiers stockés dans le répertoire /etc :

  • /etc/passwd pour les noms d’utilisateurs et paramètres de base.

  • /etc/shadow pour les mots de passe.

  • /etc/group pour les groupes dans lesquels sont placés les utilisateurs.

Groupes

Chaque utilisateur est placé dans un groupe, qui est son groupe principal. L’appartenance à un groupe peut donner à un utilisateur des droits complémentaires sur des fichiers.

On peut également placer un utilisateur dans autant de groupes supplémentaires qu’on le souhaite, lui offrant des droits complémentaires sur des fichiers qui appartiendraient à ces groupes.

2. Droits

Les droits appliqués

Sur chaque fichier sont appliqués des droits :

  • Le droit de lecture (r pour « read »), qui permet de lire le contenu du fichier - sur un répertoire...