Recherche de site Web

Comprendre et apprendre les scripts Shell de base et le dépannage du système de fichiers Linux - Partie 10


La Linux Foundation a lancé la certification LFCS (Linux Foundation Certified Sysadmin), une toute nouvelle initiative dont le but est de permettre aux individus partout (et n'importe où) d'obtenir une certification dans les domaines de base à intermédiaire. un support opérationnel pour les systèmes Linux, qui comprend la prise en charge des systèmes et services en cours d'exécution, ainsi qu'une surveillance et une analyse globales, ainsi qu'une prise de décision intelligente lorsqu'il s'agit de soulever des problèmes auprès des équipes de support supérieures.

Regardez la vidéo suivante qui vous guide dans une introduction au programme de certification Linux Foundation.

Ceci est le dernier article (partie 10) de la présente longue série de 10 tutoriels. Dans cet article, nous nous concentrerons sur les scripts shell de base et le dépannage des systèmes de fichiers Linux. Les deux sujets sont requis pour l’examen de certification LFCS.

Comprendre les terminaux et les coques

Clarifions d’abord quelques concepts.

  1. Un shell est un programme qui prend des commandes et les transmet au système d'exploitation pour qu'il les exécute.
  2. Un terminal est un programme qui nous permet, en tant qu'utilisateurs finaux, d'interagir avec le shell. Un exemple de terminal est le terminal GNOME, comme le montre l'image ci-dessous.

Lorsque nous démarrons un shell pour la première fois, il présente une invite de commande (également appelée ligne de commande), qui nous indique que le shell est prêt à commencer à accepter les commandes de son périphérique d'entrée standard, qui est généralement le clavier.

Vous souhaiterez peut-être vous référer à un autre article de cette série (Utiliser la commande pour créer, modifier et manipuler des fichiers – Partie 1) pour passer en revue certaines commandes utiles.

Linux propose une gamme d'options pour les shells, les suivantes étant les plus courantes :

bash Shell

Bash signifie Bourne Again SHell et est le shell par défaut du projet GNU. Il intègre des fonctionnalités utiles du shell Korn (ksh) et du shell C (csh), offrant plusieurs améliorations en même temps. Il s'agit du shell par défaut utilisé par les distributions couvertes par la certification LFCS, et c'est le shell que nous utiliserons dans ce tutoriel.

sh Coquille

Le Bourne SHell est le shell le plus ancien et est donc le shell par défaut de nombreux systèmes d'exploitation de type UNIX depuis de nombreuses années.

ksh Coquille

Le Korn SHell est un shell Unix développé par David Korn aux Bell Labs au début des années 1980. Il est rétrocompatible avec le shell Bourne et inclut de nombreuses fonctionnalités du shell C.

Un script shell n'est ni plus ni moins qu'un fichier texte transformé en un programme exécutable qui combine les commandes exécutées par le shell les unes après les autres.

Script Shell de base

Comme mentionné précédemment, un script shell est né sous la forme d'un fichier texte brut. Ainsi, peut être créé et modifié à l’aide de notre éditeur de texte préféré. Vous souhaiterez peut-être envisager d'utiliser vi/m (reportez-vous à Utilisation de vi Editor – Partie 2 de cette série), qui propose une coloration syntaxique pour votre commodité.

Tapez la commande suivante pour créer un fichier nommé myscript.sh et appuyez sur Entrée.

vim myscript.sh

La toute première ligne d'un script shell doit être la suivante (également connue sous le nom de shebang).

#!/bin/bash

Il « indique » au système d'exploitation le nom de l'interpréteur qui doit être utilisé pour exécuter le texte qui suit.

Il est maintenant temps d'ajouter nos commandes. Nous pouvons clarifier le but de chaque commande, ou du script entier, en ajoutant également des commentaires. Notez que le shell ignore les lignes commençant par le signe dièse # (commentaires explicatifs).

#!/bin/bash
echo This is Part 10 of the 10-article series about the LFCS certification
echo Today is $(date +%Y-%m-%d)

Une fois le script écrit et enregistré, nous devons le rendre exécutable.

chmod 755 myscript.sh

Avant d'exécuter notre script, nous devons dire quelques mots sur la variable d'environnement ` PATH. Si nous courons,

echo $PATH

à partir de la ligne de commande, nous verrons le contenu de ` PATH : une liste de répertoires séparés par des deux-points qui sont recherchés lorsque nous entrons le nom d'un programme exécutable. On l'appelle variable d'environnement car elle fait partie de l'environnement du shell - un ensemble d'informations qui deviennent disponibles pour le shell et ses processus enfants lors du premier démarrage du shell.

Lorsque nous tapons une commande et appuyons sur Entrée, le shell recherche dans tous les répertoires répertoriés dans la variable ` PATH et exécute la première instance trouvée. Voyons un exemple,

S'il y a deux fichiers exécutables portant le même nom, un dans /usr/local/bin et un autre dans /usr/bin, celui du premier répertoire sera exécuté la première, tandis que l’autre sera ignorée.

Si nous n'avons pas enregistré notre script dans l'un des répertoires répertoriés dans la variable ` PATH, nous devons ajouter ./ au nom du fichier pour pouvoir l'exécuter. il. Sinon, nous pouvons l’exécuter comme nous le ferions avec une commande classique.

pwd
./myscript.sh
cp myscript.sh ../bin
cd ../bin
pwd
myscript.sh

Conditions

Chaque fois que vous devez spécifier différentes actions à entreprendre dans un script shell, en fonction du succès ou de l'échec d'une commande, vous utiliserez la construction if pour définir ces conditions. Sa syntaxe de base est la suivante :

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

CONDITION peut être l'un des éléments suivants (seules les conditions les plus fréquentes sont citées ici) et est évalué à vrai lorsque :

  1. [ -un fichier ] → le fichier existe.
  2. [ -d fichier ] → le fichier existe et est un répertoire.
  3. [ -f fichier ] →le fichier existe et est un fichier normal.
  4. [ -u fichier ] →le fichier existe et son bit SUID (définir l'ID utilisateur) est défini.
  5. [ -g fichier ] →le fichier existe et son bit SGID est défini.
  6. [ -k fichier ] →le fichier existe et son bit collant est défini.
  7. [ -r fichier ] →le fichier existe et est lisible.
  8. [ -s fichier ]→ le fichier existe et n'est pas vide.
  9. [ -w fichier ]→le fichier existe et est accessible en écriture.
  10. [ -x fichier ] est vrai si le fichier existe et est exécutable.
  11. [ string1=string2 ] → les chaînes sont égales.
  12. [ string1 != string2 ] →les chaînes ne sont pas égales.

[ int1 op int2 ] doit faire partie de la liste précédente, tandis que les éléments qui suivent (par exemple, -eq –> sont vrais si int1 est égal à int2.) doit être une liste « enfants » de [ int1 op int2 ] où op est l'un des opérateurs de comparaison suivants.

  1. -eq –> est vrai si int1 est égal à int2.
  2. -ne –> vrai si int1 n'est pas égal à int2.
  3. -lt –> vrai si int1 est inférieur à int2.
  4. -le –> vrai si int1 est inférieur ou égal à int2.
  5. -gt –> vrai si int1 est supérieur à int2.
  6. -ge –> vrai si int1 est supérieur ou égal à int2.

Pour les boucles

Cette boucle permet d'exécuter une ou plusieurs commandes pour chaque valeur d'une liste de valeurs. Sa syntaxe de base est la suivante :

for item in SEQUENCE; do 
		COMMANDS; 
done

item est une variable générique qui représente chaque valeur dans SEQUENCE lors de chaque itération.

Boucles while

Cette boucle permet d'exécuter une série de commandes répétitives tant que la commande de contrôle s'exécute avec un état de sortie égal à zéro (avec succès). Sa syntaxe de base est la suivante :

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

EVALUATION_COMMAND peut être n'importe quelle(s) commande(s) pouvant se terminer avec un statut de réussite (0) ou d'échec (autre que 0), et EXECUTE_COMMANDS peut être n'importe quel programme, script ou construction shell, y compris d'autres boucles imbriquées.

Mettre tous ensemble

Nous allons démontrer l'utilisation de la construction if et de la boucle for avec l'exemple suivant.

Déterminer si un service s'exécute dans une distribution basée sur systemd

Créons un fichier avec une liste de services que nous souhaitons surveiller en un coup d'œil.

cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Notre script shell devrait ressembler à.

#!/bin/bash

This script iterates over a list of services and
is used to determine whether they are running or not.

for service in $(cat myservices.txt); do
    	systemctl status $service | grep --quiet "running"
    	if [ $? -eq 0 ]; then
            	echo $service "is [ACTIVE]"
    	else
            	echo $service "is [INACTIVE or NOT INSTALLED]"
    	fi
done

Expliquons comment fonctionne le script.

1). La boucle for lit le fichier myservices.txt un élément de LIST à la fois. Cet élément unique est désigné par la variable générique nommée service. La LISTE est remplie avec la sortie de,

cat myservices.txt

2). La commande ci-dessus est mise entre parenthèses et précédée d'un signe dollar pour indiquer qu'elle doit être évaluée pour remplir la LISTE sur laquelle nous allons parcourir.

3). Pour chaque élément de LIST (c'est-à-dire chaque instance de la variable de service), la commande suivante sera exécutée.

systemctl status $service | grep --quiet "running"

Cette fois, nous devons faire précéder notre variable générique (qui représente chaque élément de LIST) d'un signe dollar pour indiquer qu'il s'agit d'une variable et que sa valeur à chaque itération doit donc être utilisée. La sortie est ensuite redirigée vers grep.

L'indicateur –quiet est utilisé pour empêcher grep d'afficher à l'écran les lignes où apparaît le mot running. Lorsque cela se produit, la commande ci-dessus renvoie un état de sortie de 0 (représenté par $? dans la construction if), vérifiant ainsi que le service est en cours d'exécution.

Un état de sortie différent de 0 (ce qui signifie que le mot en cours d'exécution n'a pas été trouvé dans la sortie de systemctl status $service) indique que le service n'est pas en cours d'exécution.

Nous pourrions aller plus loin et vérifier l'existence de myservices.txt avant même d'essayer d'entrer dans la boucle for.

#!/bin/bash

This script iterates over a list of services and
is used to determine whether they are running or not.

if [ -f myservices.txt ]; then
    	for service in $(cat myservices.txt); do
            	systemctl status $service | grep --quiet "running"
            	if [ $? -eq 0 ]; then
                    	echo $service "is [ACTIVE]"
            	else
                    	echo $service "is [INACTIVE or NOT INSTALLED]"
            	fi
    	done
else
    	echo "myservices.txt is missing"
fi
Envoyer une requête ping à une série d'hôtes réseau ou Internet pour obtenir des statistiques de réponse

Vous souhaiterez peut-être conserver une liste d'hôtes dans un fichier texte et utiliser un script pour déterminer de temps en temps s'ils sont pingables ou non (n'hésitez pas à remplacer le contenu de mes hôtes et essayez par vous-même ).

La commande intégrée read shell indique à la boucle while de lire myhosts ligne par ligne et attribue le contenu de chaque ligne à la variable host, qui est ensuite transmise à la commande ping.

#!/bin/bash

This script is used to demonstrate the use of a while loop

while read host; do
    	ping -c 2 $host
done < myhosts

Lire aussi :

  1. Apprendre les scripts Shell : un guide du débutant à l'administrateur système
  2. 5 scripts Shell pour apprendre la programmation Shell

Dépannage du système de fichiers

Bien que Linux soit un système d'exploitation très stable, s'il plante pour une raison quelconque (par exemple, en raison d'une panne de courant), un (ou plusieurs) de vos systèmes de fichiers ne seront pas démontés correctement et seront donc automatiquement vérifiés pour détecter les erreurs lorsque Linux est redémarré.

De plus, chaque fois que le système démarre lors d'un démarrage normal, il vérifie toujours l'intégrité des systèmes de fichiers avant de les monter. Dans les deux cas, cela est effectué à l'aide d'un outil nommé fsckvérification du système de fichiers »).

fsck vérifiera non seulement l'intégrité des systèmes de fichiers, mais tentera également de réparer les systèmes de fichiers corrompus si cela vous est demandé. Selon la gravité des dommages, fsck peut réussir ou non ; lorsque c'est le cas, les parties récupérées des fichiers sont placées dans le répertoire lost+found, situé à la racine de chaque système de fichiers.

Enfin, il faut noter que des incohérences peuvent également survenir si nous essayons de retirer une clé USB alors que le système d'exploitation est encore en train d'y écrire, et peuvent même entraîner des dommages matériels.

La syntaxe de base de fsck est la suivante :

fsck [options] filesystem
Vérifier les erreurs d'un système de fichiers et tenter de le réparer automatiquement

Afin de vérifier un système de fichiers avec fsck, nous devons d'abord le démonter.

mount | grep sdg1
umount /mnt
fsck -y /dev/sdg1

Outre l'indicateur -y, nous pouvons utiliser l'option -a pour réparer automatiquement les systèmes de fichiers sans poser de questions et forcer la vérification même lorsque le système de fichiers semble propre.

fsck -af /dev/sdg1

Si nous souhaitons uniquement découvrir ce qui ne va pas (sans essayer de réparer quoi que ce soit pour le moment), nous pouvons exécuter fsck avec l'option -n, qui affichera les problèmes du système de fichiers sur la sortie standard.

fsck -n /dev/sdg1

En fonction des messages d'erreur dans la sortie de fsck, nous saurons si nous pouvons essayer de résoudre le problème nous-mêmes ou le transmettre aux équipes d'ingénierie pour effectuer des vérifications supplémentaires sur le matériel.

Résumé

Nous sommes arrivés à la fin de cette série de 10 articles où nous avons tenté de couvrir les compétences de base du domaine requises pour réussir l'examen LFCS.

Pour des raisons évidentes, il n’est pas possible de couvrir tous les aspects de ces sujets dans un seul didacticiel, et c’est pourquoi nous espérons que ces articles vous auront mis sur la bonne voie pour essayer de nouvelles choses par vous-même et continuer à apprendre.

Si vous avez des questions ou des commentaires, ils sont toujours les bienvenus – alors n’hésitez pas à nous écrire via le formulaire ci-dessous !