Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
Black Friday: -25€ dès 75€ sur les livres en ligne, vidéos... avec le code BWEEK25. J'en profite !
  1. Livres et vidéos
  2. LINUX
  3. Le shell et les commandes GNU
Extrait - LINUX Maîtrisez l'administration du système (6e édition)
Extraits du livre
LINUX Maîtrisez l'administration du système (6e édition)
5 avis
Revenir à la page d'achat du livre

Le shell et les commandes GNU

Le shell bash

1. Rôle

Si les distributions de Linux destinées au grand public permettent de faire abstraction de la saisie d’instructions texte en offrant des environnements graphiques attrayants, il est inenvisageable pour un professionnel de Linux de ne pas connaître le fonctionnement de l’interpréteur de commandes et des principales commandes qui lui sont associées. Après tout, les serveurs Linux disposant d’une interface graphique sont rares.

L’interpréteur de commandes, ou interprète, permet d’exécuter des instructions que vous saisissez au clavier ou au sein d’un script et vous en retourne les résultats. Cet interpréteur est un programme appelé shell. C’est à rapprocher du mot kernel vu précédemment : le kernel, signifiant noyau, est souvent entouré d’une coquille dure (pensez à un noyau d’abricot ou de pêche, ou aux fruits secs type noix ou noisettes). Shell signifiant coquille, c’est donc ce qui « entoure » le noyau Linux : le moyen de l’utiliser à l’aide de commandes. C’est donc une interface fonctionnant en mode texte entre le noyau Linux et les utilisateurs (avancés), voire les applications.

Il existe plusieurs shells, chacun disposant de spécificités propres. Le Bourne Shell (sh) est le shell le plus connu et le plus courant sur les Unix. Le C-Shell (csh) reprend la structure du langage C. Le Korn Shell (ksh) est une évolution du Bourne Shell. Le Z-Shell (zsh) est lui-même une évolution du Korn Shell. Le shell de référence sous Linux se nomme le Bourne Again Shell (bash). Voici une liste non exhaustive d’interpréteurs de commandes que vous pouvez rencontrer sous Linux :

  • sh : Thompson Shell (n’existe plus)

  • sh : Bourne Shell (a remplacé le précédent)

  • bash : Bourne Again Shell

  • ksh : Korn Shell

  • csh : C Shell

  • zsh : Z Shell

  • tcsh : Tenex C Shell

  • ash : A Shell

  • dash : Debian Almquist Shell.

La liste des shells actuellement présents sur votre installation Linux est présente dans le fichier /etc/shells.

2. Bash : le shell par défaut

a. Un shell puissant et libre

Le bash est un dérivé du Bourne Shell. Bourne est le nom du principal...

La gestion des fichiers

1. Le système de fichiers

Un système de fichiers, appelé communément File System ou FS, définit l’organisation des données sur un support de stockage, donc comment sont gérés et organisés les fichiers par le système d’exploitation.

Linux est, comme tout Unix, un système d’exploitation entièrement orienté fichier. Tout (ou presque) est représenté par un fichier, tant les données (fichiers de données de tout type comme une image ou un programme), que les périphériques (terminaux, souris, clavier, carte son, etc.) ou encore les moyens de communication (sockets, tubes nommés, etc.). On peut dire que le système de fichiers est le cœur de tout système Unix.

images/03CE01V6.png

Exemple d’arborescence Linux

Le système de fichiers de Linux est hiérarchique. Il décrit une arborescence de répertoires et de sous-répertoires, en partant d’un élément de base appelé la racine ou root directory.

2. Les divers types de fichiers

On distingue trois types de fichiers : ordinaires, catalogue, spéciaux.

a. Les fichiers ordinaires ou réguliers

Les fichiers ordinaires sont aussi appelés fichiers réguliers, ordinary files ou regular files. Ce sont des fichiers tout à fait classiques qui contiennent des données. Par données, comprenez n’importe quel contenu :

  • texte

  • image

  • audio

  • programme binaire compilé

  • script

  • base de données

  • bibliothèque de programmation

  • etc.

Par défaut, rien ne permet de différencier les uns des autres, sauf à utiliser quelques options de certaines commandes (ls -F par exemple) ou la commande file.

$ file /bin/bash 
/bin/bash: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically 
linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=
8286f22591b0be26730eea306a22a0f30475590b, for GNU/Linux 3.2.0, stripped 

La notion d’extension de fichier comme composante interne de la structure du système de fichiers est inconnue de Linux. Autrement dit, une extension n’a aucun rôle au niveau du système de fichiers et est simplement considérée comme une partie du nom du fichier. Elle sert simplement à distinguer visuellement et rapidement l’éventuel...

Rechercher des fichiers

1. Considérations générales

La commande find permet de rechercher des fichiers au sein de l’arborescence du système de fichiers à l’aide de critères et donne la possibilité d’agir sur les résultats retournés.

find chemin critères options 

La commande find étant récursive, il suffit d’indiquer un répertoire de base pour que toute l’arborescence depuis ce répertoire soit développée. L’option de base est -print (souvent implicite sur la plupart des Unix) qui permet d’afficher sur écran les résultats.

[seb@client slyunix]$ find 
. 
./.xvpics 
./.xvpics/logo-iceberg.eps 
./.xvpics/logo-pingouin-renard-grand.jpg 
./.xvpics/logo-pingouin-renard.eps 
./.xvpics/logo-pingouin-renard.jpg 
./.xvpics/logo-pingouin-renard2.jpg 
./.xvpics/logos-carre-grand.jpg 
./.xvpics/logos-carre.eps 
./.xvpics/logos-carre.tif 
./BASE 
./BASE/db148408890.sql.bz2 
./Document-1.pdf 
./flyer 
... 

Le chemin précisé étant relatif, l’affichage est relatif. Si le chemin précisé était absolu, l’affichage aurait été absolu.

2. Critères de recherche

Les paramètres permettent de définir les critères de recherche. Ces critères, s’ils sont plusieurs, sont combinés entre eux par un ET (critère1 ET critère2).

a. -name

-name permet une sélection par noms de fichiers. Il est possible d’utiliser les wildcards déjà vus. Le critère est idéalement placé entre guillemets. Ici la liste de tous les fichiers depuis l’emplacement courant et commençant par « fic » est affichée.

$ find . -name "fic*" -print 
./fic1 
./fic2 
./fic3 
./fic4 

b. -type

-type permet une sélection par type de fichier. Vous savez déjà que outre les liens, les répertoires et les fichiers simples, étaient présents d’autres types de fichiers.

Code

Type de fichier

b

Fichier spécial en mode bloc

c

Fichier spécial en mode caractère

d

Répertoire (directory)

f

Fichier ordinaire

l

Lien symbolique

p

Tube nommé (pipe)

s

Socket (Connexion réseau)...

L’éditeur vi

1. Présentation

L’éditeur Unix par défaut se nomme vi (visual editor). S’il n’est pas des plus ergonomiques pour le débutant par rapport à des éditeurs en mode graphique, il a l’avantage d’être disponible et d’utiliser la même syntaxe de base sur tous les Unix. Chaque Unix propose généralement une syntaxe étendue au-delà de la syntaxe de base. L’éditeur vi sous Linux se nomme vim. vim respecte toute la syntaxe de vi, la réciproque n’étant pas vraie. vi est petit : il occupe peu d’espace disque, consomme peu de mémoire. Certaines possibilités présentées par la suite ne fonctionnent que sous vim, comme par exemple la gestion des mémoires tampon multiples.

vi [options] Fichier [Fichier2 ...] 

vi n’a pas de menus, pas d’interface graphique et n’est pas intuitif. Cela nécessite de connaître par cœur un certain nombre de raccourcis-clavier pour pouvoir l’utiliser. Si l’apprentissage est un peu difficile, une fois maîtrisé vi se révèle rapide et pratique, au point qu’on va plus vite qu’avec des éditeurs de texte graphiques.

Le débat opposant les partisans de emacs (ou d’autres éditeurs) et ceux de vi n’a pas lieu d’être. Tout système Linux (et Unix) dispose quoi qu’il arrive de l’éditeur vi, le rendant incontournable. Si vous en avez la possibilité, vous pouvez par la suite installer l’éditeur qui vous plaira. Ce ne sera pas toujours possible, notamment en entreprise, sur des serveurs, etc. Ce débat reste cependant générateur de nombreux trolls sur les forums et tribunes.

2. Fonctionnement

Il y a trois modes de fonctionnement :

  • Mode commande : les saisies représentent des commandes. On y accède en appuyant sur [Echap]. Chaque touche ou combinaison de touches déclenche une action (suppression de lignes, insertions, déplacement, copier, coller, etc.).

  • Mode saisie : c’est la saisie de texte classique.

  • Mode ligne de commande : une ligne en bas d’écran permet de saisir des commandes spéciales, validée avec la touche [Entrée]. On y accède en appuyant, en mode commande...

Redirections

1. Principe

Les redirections sont l’une des plus importantes possibilités offertes par le shell. Par redirection, on entend la possibilité de rediriger l’affichage de l’écran vers un fichier, une imprimante ou tout autre périphérique, les messages d’erreur vers un autre fichier, de remplacer la saisie clavier par le contenu d’un fichier.

Tout flux de données en entrée ou en sortie de commande passe par un canal. Comme pour l’eau, il est possible de dévier le cours des données vers une autre destination ou depuis une autre source.

Linux utilise des canaux d’entrées/sorties pour lire et écrire ses données. Par défaut le canal d’entrée est le clavier, et le canal de sortie, l’écran. Un troisième canal, le canal d’erreur, est aussi redirigé vers l’écran par défaut.

Il est possible de rediriger ces canaux vers des fichiers, ou du flux texte de manière transparente pour les commandes Linux.

2. En sortie

On se sert du caractère > pour rediriger la sortie standard (celle qui va normalement sur l’écran). On indique ensuite le nom du fichier où seront placés les résultats de sortie.

$ ls -l > resultat.txt 
$ cat resultat.txt 
total 1 
-rw-r--r--    1 Administ ssh_user        0 Jul  4 12:04 TOTO 
-rw-r--r--    1 Administ ssh_user        0 Jul 25 15:13 resultat.txt 
-rw-r--r--    1 Administ ssh_user      171 Jul 25 15:13 test.txt 

Si le fichier n’existe pas, il sera créé. S’il existe, son contenu sera écrasé, même si la commande tapée est incorrecte. Le shell commence d’abord par créer le fichier puis exécute ensuite la commande.

C’est un aspect important des redirections : les redirections sont interprétées de la droite vers la gauche, et les redirections sont mises en place AVANT l’exécution...

Les filtres et utilitaires

Un filtre (ou une commande filtre) est un programme sachant écrire et lire des données par les canaux standards d’entrée et de sortie. Il en modifie ou traite éventuellement le contenu. wc est un filtre. Les utilitaires sans être obligatoirement des filtres permettent un certain nombre d’actions sur des fichiers ou leur contenu comme le formatage ou l’impression.

1. Extraction des noms et chemins

La commande basename permet d’extraire le nom du fichier dans un chemin.

$ basename /tmp/seb/liste 
liste 

La commande dirname effectue l’inverse, elle extrait le chemin.

$ dirname /tmp/seb/liste 
/tmp/seb 

2. Recherche de lignes

Il s’agit d’extraire des lignes d’un fichier selon divers critères. Pour cela vous disposez de trois commandes grep, egrep et fgrep qui lisent les données soit depuis un fichier d’entrée, soit depuis le canal d’entrée standard.

a. grep

La syntaxe de la commande grep est :

grep [Options] modèle [Fichier1...] 

Le modèle se compose de critères de recherche ressemblant beaucoup aux critères déjà exposés pour vi par exemple. Il ne faut pas oublier que ces critères doivent être interprétés par la commande grep et pas par le shell. Il faut donc verrouiller tous les caractères.

$ cat fic4 
Cochon 
Veau 
Boeuf 
rat 
Rat 
boeuf 
$ grep "^[bB]" fic4 
Boeuf 
boeuf 

La commande grep peut aussi prendre quelques options intéressantes.

  • -v effectue la recherche inverse : toutes les lignes ne correspondant pas aux critères sont affichées.

  • -c ne retourne que le nombre de lignes trouvées sans les afficher.

  • -i ne différencie pas les majuscules et les minuscules.

  • -n indique le numéro de ligne pour chaque ligne trouvée.

  • -l dans le cas de fichiers multiples, indique dans quel fichier la ligne a été trouvée.

$ grep -i "^b" fic4 
Boeuf 
boeuf 

b. egrep

La commande egrep étend les critères de recherche et peut accepter un fichier de critères en entrée. Elle est équivalente à un grep -E. Elle emploie comme critères des expressions régulières.

egrep -f fichier_critère fichier_recherche 

Caractère spécial

Signification...

Les processus

1. Définition et environnement

Un processus représente à la fois un programme en cours d’exécution et tout son environnement d’exécution (mémoire, état, identification, propriétaire, père...).

Voici une liste des données d’identification d’un processus :

  • Un numéro de processus unique PID (Process ID) : chaque processus Unix est numéroté afin de pouvoir être différencié des autres. Le premier processus lancé par le système est 1 et il s’agit d’un processus appelé généralement init. On utilise le PID quand on travaille avec un processus. Lancer 10 fois le même programme (même nom) produit 10 PID différents.

  • Un numéro de processus parent PPID (Parent Process ID) : chaque processus peut lui-même lancer d’autres processus, des processus enfants (child process). Chaque enfant reçoit parmi les informations le PID du processus père qui l’a lancé. Tous les processus ont un PPID sauf le processus 0 qui est un pseudo-processus représentant le démarrage du système (crée le 1 init).

  • Un numéro d’utilisateur et un numéro de groupe : correspond à l’UID et au GID de l’utilisateur qui a lancé le processus. C’est nécessaire pour que le système sache si le processus a le droit d’accéder à certaines ressources ou non. Les processus enfants héritent de ces informations. Dans certains cas (que nous verrons plus tard) on peut modifier cet état.

  • Durée de traitement et priorité : la durée de traitement correspond au temps d’exécution écoulé depuis le dernier réveil du processus. Dans un environnement multitâche, le temps d’exécution est partagé entre les divers processus, et tous ne possèdent pas la même priorité. Les processus de plus haute priorité sont traités en premier. Lorsqu’un processus est inactif, sa priorité augmente afin d’avoir une chance d’être exécuté. Lorsqu’il est actif, sa priorité baisse afin de laisser sa place à un autre. C’est l’ordonnanceur de tâches du système...

Plus loin avec le bash

1. Alias

Un alias est un raccourci d’une commande avec d’éventuels paramètres. Il se définit avec la commande alias. Utilisée seule elle liste les alias disponibles.

$ alias 
alias ..='cd ..' 
alias ...='cd ../..' 
alias cd..='cd ..' 
alias dir='ls -l' 
alias l='ls -alF' 
alias la='ls -la' 
alias ll='ls -l' 
alias ls='ls $LS_OPTIONS' 
alias ls-l='ls -l' 
alias md='mkdir -p' 
alias o='less' 
alias rd='rmdir' 
... 

Vous pouvez créer vos propres alias.

$ alias deltree='rm -rf' 

2. Groupement de commandes

Le chaînage de commande est possible avec « ; ». Il est aussi possible de grouper les commandes. Quand vous exécutez les commandes suivantes :

$ uname -a ; pwd ; ls -l >resultat.txt & 

Seule la dernière commande est exécutée en tâche de fond et seul son résultat est redirigé dans le fichier resultat.txt. Une solution serait :

$ uname -a >resultat.txt & ; pwd >>resultat.txt & ; ls -l >>resultat.txt & 
[1] 18232 
[2] 18238 
[3] 18135 

C’est une solution complexe et qui ne fonctionnera pas toujours. De plus même si les commandes sont lancées séquentiellement, elles tournent toutes...

Les variables

On en distingue trois types : utilisateur, système et spéciales. Le principe est de pouvoir affecter un contenu à un nom de variable, généralement une chaîne de caractère ou des valeurs numériques.

1. Nomenclature

Un nom de variable obéit à certaines règles :

  • Il peut être composé de lettres minuscules, majuscules, de chiffres, de caractères de soulignement.

  • Le premier caractère ne peut pas être un chiffre.

  • La taille d’un nom est en principe illimitée (il ne faut pas abuser non plus).

  • Les conventions veulent que les variables utilisateur soient en minuscules pour les différencier des variables système. Au choix de l’utilisateur.

2. Déclaration et affectation

Une variable est déclarée dès qu’une valeur lui est affectée. L’affectation est effectuée avec le signe =, sans espace avant ou après le signe.

var=Bonjour 

3. Accès et affichage

Vous accédez au contenu d’une variable en plaçant le signe $ devant le nom de la variable. Quand le shell rencontre le $, il tente d’interpréter le mot suivant comme étant une variable. Si elle existe, alors le $nom_variable est remplacé par son contenu, ou par un texte vide dans le cas contraire. On parle aussi de référencement de variable.

$ chemin=/tmp/seb 
$ ls $chemin 
... 
$ cd $chemin 
$ pwd 
/tmp/seb 
$ cd $chemin/rep1 
$ pwd 
/tmp/seb/rep1 

Pour afficher la liste des variables, on utilise la commande env. Elle affiche les variables utilisateur et les variables système, nom et contenu.

$ env 
SHELL=/bin/bash 
HISTCONTROL=ignoredups 
HISTSIZE=1000 
HOSTNAME=fedora 
PWD=/home/seb 
LOGNAME=seb 
XDG_SESSION_TYPE=tty 
HOME=/home/seb 
LANG=fr_FR.UTF-8 
... 

Une variable peut contenir des caractères spéciaux, le principal étant l’espace. L’exemple suivant ne fonctionne pas :

$ c=Salut les copains 
les: not found 
$ echo $c 

Pour cela, il faut soit verrouiller les caractères spéciaux un par un, soit les mettre entre guillemets ou apostrophes.

c=Salut\ les\ Copains # Solution lourde 
c="Salut les copains" # Solution correcte 
c='Salut les copains' # Solution correcte 

La principale...

Configuration de bash

1. Fichiers de configuration

Le shell bash peut être lancé dans plusieurs modes :

  • le shell interactif de connexion (login shell)

  • le shell interactif simple

  • le shell non interactif

  • le mode sh

  • etc.

Selon son mode de démarrage, le shell va chercher et exécuter divers scripts et fichiers de configuration. Un fichier de configuration est un script shell, une séquence de commandes individuelles ayant pour but de configurer l’environnement de l’utilisateur.

a. Shell de connexion

Le shell de connexion est lancé après la saisie du login et du mot de passe sur la console. C’est celui précisé à la fin de chaque ligne de /etc/passwd. Dans ce mode, le shell cherche à exécuter, dans cet ordre et s’ils sont présents :

  • /etc/profile

  • ~/.bash_profile

  • ~/.bash_login

  • ~/.profile

On trouve aussi /etc/profile/profile.d : le shell va exécuter le contenu de ce répertoire par l’intermédiaire du fichier /etc/profile, qui dans ses dernières directives contient une boucle qui va exécuter tous les fichiers qui y sont présents.

À la déconnexion, il tente d’exécuter :

  • - ~/.bash_logout

b. Shell simple

Le shell interactif simple correspond à l’exécution du bash dans une fenêtre (xterm, konsole), une console ou à la main (taper bash dans une console). Dans...

Programmation shell

1. Structure et exécution d’un script

Le shell n’est pas qu’un simple interpréteur de commandes, mais dispose d’un véritable langage de programmation avec notamment une gestion des variables, des tests et des boucles, des opérations sur les variables, des fonctions...

Toutes les instructions et commandes sont regroupées au sein d’un script. Lors de son exécution, chaque ligne sera lue une à une et exécutée. Une ligne peut se composer de commandes internes ou externes, de commentaires ou être vide. Plusieurs instructions par lignes sont possibles, séparées par le ; ou liées conditionnellement par && ou ||. Le ; est l’équivalent d’un saut de ligne.

Par convention les noms des shell scripts se terminent généralement (pas obligatoirement) par « .sh » pour le Bourne Shell et le Bourne Again Shell, par « .ksh » pour le Korn Shell et par « .csh » pour le C Shell.

Pour rendre un script exécutable directement :

$ chmod u+x monscript 

Pour l’exécuter :

$ ./monscript 

Pour éviter le ./ :

$ PATH=$PATH:. 
$ monscript 

Notez que le point est placé en dernier dans le PATH. Le mettre en premier est un risque pour la sécurité : une nouvelle commande ls modifiée est placée dans votre répertoire. Imaginez les dégâts avec une commande passwd.

Quand un script est lancé, un nouveau shell fils est créé qui va exécuter chacune des commandes. Si c’est une commande interne, elle est directement exécutée par le nouveau shell. Si c’est une commande externe, dans le cas d’un binaire un nouveau fils sera créé pour l’exécuter, dans le cas d’un shell script un nouveau shell fils est lancé pour lire ce nouveau shell ligne à ligne.

Une ligne de commentaire commence toujours par le caractère #. Un commentaire peut être placé en fin d’une ligne comportant déjà des commandes.

# La ligne suivante effectue un ls 
ls # La ligne en question 

La première ligne a une importance particulière car elle permet de préciser quel shell va exécuter le script. Cette ligne s’appelle un shebang...

Multiplexeurs de terminal

1. Présentation

Les outils screen et tmux permettent de gérer plusieurs fenêtres texte au sein d’un même terminal. Les exemples s’appuient sur screen mais peuvent s’appliquer à tmux qui utilise la même syntaxe. tmux est néanmoins bien plus configurable et joli. Grâce à screen vous pourrez notamment :

  • utiliser plusieurs fenêtres shell depuis une seule connexion ssh,

  • maintenir ces connexions ssh ouvertes même en cas de souci réseau (reprise automatique),

  • se déconnecter et se reconnecter à ses sessions shell et ssh de plusieurs endroits (et réseaux),

  • lancer une commande shell de longue durée sans avoir à maintenir une session active.

2. Utilisation

a. Installation et aide

Installez screen (apt-get install screen, ou yum install screen) et lancez-le.

$ screen 

Mis à part l’écran informatif, rien de spécial, a priori, on retrouve le prompt de son shell. Appuyez cependant sur [Ctrl][a] puis ? ([Ctrl][a], relâchez, puis ?) ; vous obtenez un écran d’aide.

b. Fenêtres

Sortez de l’aide et lancez top. Maintenant, ouvrez une seconde fenêtre avec [Ctrl][a] c. Un nouveau prompt shell est affiché. Vous venez d’ouvrir une nouvelle fenêtre shell. Les fenêtres sont numérotées de 0 à n. Pour passer d’une fenêtre...