Administrateur Linux - Scripting Shell

Introduction à Bash Shell

Comme les versions de GNU Linux, les shells sont disponibles dans de nombreuses variétés et leur compatibilité varie. Le shell par défaut dans CentOS est connu sous le nom de Bash ou Bourne Again Shell. Le shell Bash est une version moderne et modifiée de Bourne Shell développée par Stephen Bourne. Bash était le remplacement direct du Thompson Shell original sur le système d'exploitation Unix développé aux Bell Labs par Ken Thompson et Dennis Ritchie (Stephen Bourne était également employé par Bell Labs)

Chacun a sa coque préférée et chacun a ses atouts et ses difficultés. Mais pour la plupart, Bash sera le shell par défaut dans toutes les distributions Linux et le plus couramment disponible. Avec l'expérience, tout le monde voudra explorer et utiliser un shell qui lui convient le mieux. Cependant, en même temps, tout le monde voudra également maîtriser le shell Bash.

Les autres shells Linux incluent: Tcsh, Csh, Ksh, Zsh et Fish.

Développer des compétences pour utiliser n'importe quel shell Linux à un niveau expert est extrêmement important pour un administrateur CentOS. Comme nous l'avons mentionné précédemment, contrairement à Windows, Linux en son cœur est un système d'exploitation en ligne de commande. Un shell est simplement une interface utilisateur qui permet à un administrateur (ou à un utilisateur) d'émettre des commandes vers le système d'exploitation. Si un administrateur système Linux était un pilote de ligne aérienne, utiliser le shell reviendrait à retirer l'avion du pilote automatique et à saisir les commandes manuelles pour un vol plus maniable.

Un shell Linux, comme Bash, est connu en informatique comme un Command Line Interpreter. Microsoft Windows dispose également de deux interpréteurs de ligne de commande appelés DOS (à ne pas confondre avec le système d'exploitation DOS d'origine) et PowerShell.

La plupart des shells modernes comme Bash fournissent constructspermettant à des scripts shell plus complexes d'automatiser les tâches courantes et complexes.

Les constructions incluent -

  • Contrôle de flux de script (ifthen et else)
  • Opérations de comparaison logique (égalité supérieure, inférieure à)
  • Loops
  • Variables
  • Paramètres définissant l'opération (similaire aux commutateurs avec commandes)

Utilisation du script Shell par rapport au langage de script

Souvent, lorsqu'ils envisagent d'exécuter une tâche, les administrateurs se demandent: Dois-je utiliser un script shell ou un langage de script tel que Perl, Ruby ou Python?

Il n'y a pas de règle fixe ici. Il n'y a que des différences typiques entre les shells et les langages de script.

coquille

Shell permet l'utilisation de commandes Linux telles que sed , grep , tee , cat et tous les autres utilitaires basés sur la ligne de commande sur le système d'exploitation Linux. En fait, à peu près n'importe quel utilitaire Linux en ligne de commande peut être scripté dans votre shell.

Un bon exemple d'utilisation d'un shell serait un script rapide pour vérifier une liste d'hôtes pour la résolution DNS.

Notre simple script Bash pour vérifier les noms DNS -

#!/bin/bash 
for name in $(cat $1);
   do 
      host $name.$2 | grep "has address" 
   done 
exit

petite liste de mots sur laquelle tester la résolution DNS -

dns 
www 
test 
dev 
mail 
rdp 
remote

Sortie par rapport au domaine google.com -

[[email protected] ~]$  ./dns-check.sh dns-names.txt google.com
-doing dns
dns.google.com has address 172.217.6.46
-doing www
www.google.com has address 172.217.6.36
-doing test
-doing dev
-doing mail
googlemail.l.google.com has address 172.217.6.37
-doing rdp
-doing remote

[[email protected] ~]$

En exploitant de simples commandes Linux dans notre shell, nous avons pu créer un simple script de 5 lignes pour auditer les noms DNS à partir d'une liste de mots. Cela aurait pris un temps considérable en Perl, Python ou Ruby même en utilisant une bibliothèque DNS bien implémentée.

Langage de script

Un langage de script donnera plus de contrôle en dehors du shell. Le script Bash ci-dessus utilisait un wrapper autour de la commande hôte Linux . Et si nous voulions en faire plus et créer notre propre application comme hôte pour interagir en dehors du shell? C'est là que nous utiliserions un langage de script.

De plus, avec un langage de script hautement maintenu, nous savons que nos actions fonctionneront pour la plupart sur différents systèmes. Python 3.5, par exemple, fonctionnera sur tout autre système exécutant Python 3.5 avec les mêmes bibliothèques installées. Ce n'est pas le cas, si nous voulons exécuter notre script BASH à la fois sur Linux et HP-UX.

Parfois, les lignes entre un langage de script et un shell puissant peuvent être floues. Il est possible d'automatiser les tâches d'administration CentOS Linux avec Python, Perl ou Ruby. Cela est vraiment assez courant. De plus, les développeurs de scripts shell aisés ont créé un démon de serveur Web simple mais fonctionnel dans Bash.

Avec l'expérience des langages de script et de l'automatisation des tâches dans les shells, un administrateur CentOS sera en mesure de déterminer rapidement par où commencer lorsqu'il doit résoudre un problème. Il est assez courant de démarrer un projet avec un script shell. Ensuite, passez à un langage de script (ou compilé) à mesure qu'un projet devient plus complexe.

De plus, il est possible d'utiliser à la fois un langage de script et un script shell pour différentes parties d'un projet. Un exemple pourrait être un script Perl pour gratter un site Web. Ensuite, utilisez un script shell pour analyser et formater avec sed , awk et egrep . Enfin, utilisez un script PHP pour insérer des données formatées dans la base de données MySQL à l'aide d'une interface graphique Web.

Avec un peu de théorie derrière les shells, commençons avec les blocs de construction de base pour automatiser les tâches d'un shell Bash dans CentOS.

Entrée-sortie et redirection

Traitement de stdout vers une autre commande -

[[email protected] ~]$ cat ~/output.txt | wc -l 
6039 
[[email protected] ~]$

Ci-dessus, nous avons passé cat'sstoud à wc pour le traitement avec le caractère pipe . wc a ensuite traité la sortie de cat , imprimant le nombre de lignes de output.txt sur le terminal. Considérez le caractère de tube comme un "tube" passant la sortie d'une commande, à traiter par la commande suivante.

Voici les concepts clés à retenir lors de la redirection de commandes -

Nombre Descripteur de fichier Personnage
0 entrée standard <
1 sortie standard >
2 erreur standard
ajouter stdout >>
attribuer une redirection &
pipe stdout dans stdin |

Nous avons introduit cela dans le premier chapitre sans vraiment parler de redirection ou d'attribution de redirection. Lors de l'ouverture d'un terminal sous Linux, votre shell est considéré comme la cible par défaut pour -

  • entrée standard <0
  • sortie standard> 1
  • erreur standard 2

Voyons comment cela fonctionne -

[[email protected] ~]$ lsof -ap $BASHPID -d 0,1,2 
 COMMAND   PID   USER    **FD**   TYPE DEVICE   SIZE/OFF   NODE      NAME 
 bash    13684    rdc    **0u**   CHR  136,0      0t0     3      /dev/pts/0 
 bash    13684    rdc    **1u**   CHR  136,0      0t0     3      /dev/pts/0 
 bash    13684    rdc    **2u**   CHR  136,0      0t0     3      /dev/pts/0
 
[[email protected] ~]$

/ dev / pts / 0 est notre pseudo terminal. CentOS Linux regarde cela et considère notre application de terminal ouvert comme un vrai terminal avec le clavier et l'écran connectés via une interface série. Cependant, comme un hyperviseur fait abstraction de matériel à un système d'exploitation / dev / pts fait abstraction de notre terminal aux applications.

À partir de la commande lsof ci-dessus , nous pouvons voir sous leFDcolonne que les trois descripteurs de fichier sont définis sur notre terminal virtuel (0,1,2). Nous pouvons maintenant envoyer des commandes, voir la sortie de la commande, ainsi que toutes les erreurs associées à la commande.

Voici des exemples pour STDIN et STDOUT -

STDOUT

[[email protected] centos]# echo "I am coming from Standard output or STDOUT." >
output.txt && cat output.txt
I am coming from Standard output or STDOUT. 
[[email protected] centos]#

Il est également possible d'envoyer à la fois stdout et stderr vers des fichiers séparés -

bash-3.2# find / -name passwd 1> good.txt 2> err.txt
bash-3.2# cat good.txt
/etc/pam.d/passwd
/etc/passwd
bash-3.2# cat err.txt 
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
bash-3.2#

Lors de la recherche dans tout le système de fichiers, deux erreurs ont été rencontrées. Chacun a été envoyé dans un fichier séparé pour une lecture ultérieure, tandis que les résultats renvoyés ont été placés dans un fichier texte séparé.

L'envoi de stderr dans un fichier texte peut être utile lorsque vous effectuez des opérations qui génèrent beaucoup de données vers le terminal, comme la compilation d'applications. Cela permettra de parcourir les erreurs qui pourraient être perdues dans l'historique de défilement du terminal.

Une remarque lors du passage de STDOUT à un fichier texte sont les différences entre >> et >. Le double ">>" s'ajoutera à un fichier, tandis que la forme singulière écrasera le fichier et écrira un nouveau contenu (ainsi toutes les données précédentes seront perdues).

STDIN

[[email protected] centos]# cat < stdin.txt
Hello,
I am being read form Standard input, STDIN.

[[email protected] centos]#

Dans la commande ci-dessus, le fichier texte stdin.txt a été redirigé vers la commande cat qui a renvoyé son contenu à STDOUT .

Le caractère pipe "|"

Le caractère pipe prendra la sortie de la première commande, la passant comme entrée dans la commande suivante, permettant à la commande secondaire d'effectuer des opérations sur la sortie.

Maintenant, "pipe" le stdout de cat vers une autre commande -

[[email protected] centos]# cat output.txt | wc -l
2
[[email protected] centos]#

Ci-dessus, wc effectue des calculs sur la sortie de cat qui a été transmise par le tuyau. La commande pipe est particulièrement utile lors du filtrage de la sortie de grep ou egrep -

[[email protected] centos]# egrep "^[0-9]{4}$" /usr/dicts/nums | wc -l  
9000 
[[email protected] centos]#

Dans la commande ci-dessus, nous avons passé tous les 4 chiffres à wc à partir d'un fichier texte contenant tous les numéros de 65535 passés à travers un filtre egrep .

Redirection de la sortie avec &

La sortie peut être redirigée à l'aide du &personnage. Si nous voulons diriger la sortie à la fois STDOUT et STDERR, dans le même fichier, cela peut être accompli comme suit -

[[email protected] centos]# find / -name passwd > out.txt 2>&1
[[email protected] centos]# cat out.txt  
find: /dev/fd/3: Not a directory 
find: /dev/fd/4: Not a directory 
/etc/passwd

[[email protected] centos]#

Redirection à l'aide du &character fonctionne comme ceci: d'abord, la sortie est redirigée vers out.txt . Deuxièmement, STDERR ou le descripteur de fichier 2 est réaffecté au même emplacement que STDOUT, dans ce cas out.txt .

La redirection est extrêmement utile et est utile pour résoudre les problèmes qui surgissent lors de la manipulation de gros fichiers texte, de la compilation du code source, de la redirection de la sortie dans des scripts shell et de l'émission de commandes Linux complexes.

Bien que puissante, la redirection peut devenir compliquée pour les nouveaux administrateurs CentOS. La pratique, la recherche et les questions occasionnelles à un forum Linux (tel que Stack Overflow Linux) aideront à résoudre des solutions avancées.

Constructions de Bash Shell

Maintenant que nous avons une bonne idée du fonctionnement du shell Bash , apprenons quelques constructions de base, couramment utilisées, pour écrire des scripts. Dans cette section, nous explorerons -

Conseils de dépannage BASH

BASH peut être un peu délicat par rapport à un langage de script dédié. Certains des plus gros blocages dans les scripts BASH sont dus à un échappement incorrect ou à un échec des opérations de script passées au shell. Si vous avez examiné un script plusieurs fois et qu'il ne fonctionne pas comme prévu, ne vous inquiétez pas. Ceci est courant même avec ceux qui utilisent BASH pour créer quotidiennement des scripts complexes.

Une recherche rapide sur Google ou une inscription à un forum Linux expert pour poser une question conduira à une résolution rapide. Il est fort probable que quelqu'un ait rencontré le problème exact et qu'il ait déjà été résolu.

Le script BASH est une excellente méthode pour créer rapidement des scripts puissants pour tout, de l'automatisation des tâches d'administration à la création d'outils utiles. Devenir un développeur de scripts BASH de niveau expert prend du temps et de la pratique. Par conséquent, utilisez des scripts BASH chaque fois que possible, c'est un excellent outil à avoir dans votre boîte à outils d'administration CentOS.