This shows you the differences between two versions of the page.
sde2:laboratoare:05_uso [2023/04/07 23:12] cristiana.andrei created |
sde2:laboratoare:05_uso [2023/04/11 10:16] (current) cristiana.andrei [01. Alias] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== TP 05 - Connexion à Internet ====== | + | ====== TP 05 - Automatisation en ligne de commande ====== |
- | <note warning> | + | ===== Concepts ===== |
- | Avant de démarrer l'atelier, exécutez la commande suivantes : | + | |
- | <code bash> | + | |
- | student@uso:~$ git clone https://github.com/systems-cs-pub-ro/uso-lab.git | + | |
- | Cloning into 'uso-lab'... | + | |
- | remote: Enumerating objects: 996, done. | + | |
- | remote: Counting objects: 100% (290/290), done. | + | |
- | remote: Compressing objects: 100% (206/206), done. | + | |
- | remote: Total 996 (delta 88), reused 246 (delta 52), pack-reused 706 | + | |
- | Receiving objects: 100% (996/996), 82.24 MiB | 8.99 MiB/s, done. | + | |
- | Resolving deltas: 100% (319/319), done. | + | |
- | </code> | + | |
- | </note> | + | |
- | ===== Connexion au réseau et à Internet ===== | + | |
- | <note> | + | |
- | L'infrastructure du laboratoire est basée sur des conteneurs docker dont les images seront générées sur votre propre ordinateur. Si Docker Engine n'est pas déjà installé sur votre système, le script d'installation physique ''~/uso-lab/labs/03-user/lab-container/lab_prepare.sh'' installera votre application. | + | |
- | Une fois que vous avez fini de travailler, nous vous recommandons d'arrêter les conteneurs en exécutant la commande ''./lab_prepare.sh delete'' dans le répertoire ''~/uso-lab/labs/03-user/lab-container/''. | + | L'automatisation des tâches fait référence à la délégation/décharge des actions de l'utilisateur aux programmes du système informatique. Un programme effectuera automatiquement, de lui-même, des actions que l'utilisateur ferait, ce qui lui fera gagner du temps. |
- | </note> | + | |
- | Dans cette section, nous allons apprendre à résoudre les problèmes de connectivité réseau ou en d'autres termes, le problème "mon Internet ne fonctionne pas". Pour ce faire, nous devons parcourir toutes les couches du réseau par lesquelles les données passent pour être envoyées sur Internet. | + | Les actions candidates à l'automatisation sont généralement des actions répétitives, peu simples et non interactives. Leur automatisation libérera l'utilisateur de leur exécution manuelle, répétitive et fastidieuse. |
- | Ensuite, nous présenterons les étapes que nous suivons pour vérifier la fonctionnalité de la connexion Internet et comment nous pouvons effectuer certaines configurations sommaires. | + | ^Commande ^Brève description^ |
+ | |''cat'' |comment afficher le contenu du fichier| | ||
+ | |''seq'' |génère une séquence de nombres| | ||
+ | |''grep'' |extrait les lignes contenant une expression régulière spécifique| | ||
+ | |''cut'' |extraire certaines colonnes| | ||
+ | |''sed'' |filtre de texte avancé utilisé pour les substitutions| | ||
+ | |''wc'' |compter le nombre de lignes, de mots ou de caractères| | ||
+ | |''head'' |afficher les premières lignes ou caractères| | ||
+ | |''tail'' |afficher les dernières lignes ou caractères| | ||
+ | |''for'' |parcourir la liste des éléments pour appliquer des commandes à chaque élément| | ||
+ | |''if'' |condition d'exécution de certaines commandes| | ||
+ | |''$(comm)'' |expansion d'une commande (extension de commande) - remplacement par la sortie de la commande| | ||
+ | |''comm1 | comm2'' |reliant deux commandes : la sortie de la première commande devient l'entrée de la deuxième commande| | ||
+ | |''$var'' ou ''${var}'' |la valeur de la variable var| | ||
+ | |''${#var}'' |longueur de la valeur de la variable var (en caractères)| | ||
+ | |''${var:2:3}'' |une sous-chaîne de la valeur de la variable var : 3 caractères sont extraits de l'index 2| | ||
- | === Interaction avec le niveau physique === | + | ==== Scripting ==== |
- | La première couche avec laquelle nous interagissons est la couche physique, qui a pour rôle d'envoyer des données sous forme de signaux via le support de transmission. Par exemple, les signaux électriques sont transmis via un fil de cuivre, les impulsions lumineuses via la fibre optique et les ondes radio via le sans fil. | + | La création de scripts implique l'utilisation d'un langage interprété (appelé langage de script). Cela peut être un langage comme Python, Perl ou Ruby, ou même le shell CLI (interpréteur de commandes). Les langages de script ont l'avantage de se développer rapidement : nous ajoutons et testons rapidement de nouvelles fonctionnalités. |
- | Un autre composant de la couche physique est la carte réseau du système (NIC - Network Interface Card), qui enverra les données via le support de transmission. | + | Les scripts **shell** ont l'avantage d'utiliser les commandes shell existantes (commandes de fichiers, commandes de processus, commandes de filtrage de texte). Pour les actions rapides (//quick'n'dirty//), les scripts shell sont une très bonne solution. Lorsque l'on a des manipulations numériques ou des manipulations de chaînes, les scripts shell peuvent être insuffisants et il est conseillé de se tourner vers un langage de script plus complet, comme Python, Ruby ou Perl. |
- | La plupart du temps, les problèmes de connexion Internet proviennent du fait que le câble Internet n'est pas connecté à la carte réseau ou du fait que nous avons une faible connexion au réseau sans fil. | + | ==== Fonctions du shell ==== |
+ | Les fonctionnalités du shell sont utilisées dans l'efficacité et l'automatisation de l'exécution des commandes. Je les ai utilisés et je m'en suis souvenu lors des derniers laboratoires, en particulier le dernier laboratoire. Ces fonctionnalités sont : | ||
+ | * redirection des commandes dans les fichiers, à l'aide des opérateurs de redirection : ''>'', ''<'', ''>>'' | ||
+ | * rediriger la sortie d'une commande vers l'entrée d'une autre commande : l'opérateur ''| (pipe)'' | ||
+ | * variables d'interpréteur de commandes | ||
+ | * échapper à l'aide de //backslash//, de guillemets ou d'apostrophes | ||
+ | Tout au long de ce TP, nous utiliserons des fonctionnalités shell spécifiquement utilisées dans les scripts shell : | ||
+ | * expressions régulières | ||
+ | * arguments de la ligne de commande | ||
+ | * commandes shell internes pour le contrôle de flux : ''if'', ''for'', ''while'' | ||
- | Au niveau physique, nous pouvons vérifier la connexion et la fonctionnalité d'une carte réseau en regardant les LED qui représentent la connexion à l'environnement physique. | + | ==== Automatisation via des scripts shell ==== |
+ | L'automatisation via les scripts shell implique généralement une **séquence de commandes**. Ces commandes sont ajoutées à un script où elles seront exécutées ensemble, sans qu'il soit nécessaire d'exécuter manuellement chaque commande. | ||
- | === Enquêter sur la couche physique du réseau === | + | Pour configurer l'exécution d'une séquence de commandes, nous pouvons conditionner l'exécution du script à l'aide de **variables ou d'arguments dans la ligne de commande**. Ceux-ci peuvent générer un comportement de script différent en fonction de leurs valeurs. |
- | <note> | + | |
- | Pour exécuter cette démo, exécutez dans le répertoire ''~/uso-lab/labs/03-user/lab-container/'' la commande ''./lab_prepare.sh physical install''. Pour se connecter à l'infrastructure de cette section, nous utiliserons la commande physique ''./lab_prepare.sh connect'' . | + | |
- | </note> | + | |
- | Une interface réseau est un moyen de réaliser des configurations réseau généralement associées à une carte réseau et identifiées par un nom. | + | En fonction de variables, d'arguments de ligne de commande ou de données d'entrée, un script peut prendre des **décisions conditionnelles**. La vérification d'une condition peut conduire à un comportement ou à un autre. |
- | <note> | + | Lors de l'exécution d'un script, nous voudrons souvent qu'une action cible plusieurs fichiers, processus ou chaînes. Pour cela, nous verrons comment utiliser des boucles pour parcourir des listes d'éléments. |
- | Il existe des interfaces qui ne correspondent à aucune carte réseau physique. Par exemple, ''loopback'' est une interface virtuelle à adressage automatique qui s'adresse au système lui-même. Il s'appelle ''lo'' sous Linux. | + | |
- | </note> | + | Les commandes utilisées peuvent recevoir en argument ou en entrée standard la sortie d'autres commandes. Dans les scripts shell, nous utilisons des fonctionnalités de chaînage de commandes telles que **l'expansion de commandes** ou des **pipes** conduisant à des résultats plus complexes. |
+ | |||
+ | ===== Basics ===== | ||
+ | ==== Expressions régulières et grep ==== | ||
+ | Dans le répertoire du référentiel du laboratoire, il y a un fichier Students.txt que nous utiliserons comme support pour les commandes d'expressions régulières. Ce fichier contient une liste d'étudiants avec le nom complet des étudiants (première colonne), leur groupe (deuxième colonne) et diverses notes USO (note finale - troisième colonne, note du test de la grille - quatrième colonne - et note du test pratique - cinquième colonne), champs séparés par le caractère de tabulation. | ||
+ | |||
+ | Pour rechercher et sélectionner des lignes dans des fichiers texte, nous utilisons la commande grep, qui à son tour utilise des expressions régulières. Ainsi, si nous voulons sélectionner les étudiants qui ont la lettre z dans leur nom, nous utilisons la commande | ||
- | Au niveau du système d'exploitation, nous pouvons vérifier si une carte réseau est active à l'aide de la commande suivante : | ||
<code bash> | <code bash> | ||
- | root@fizic:~# ip link show | + | student@uso:~/uso-lab/labs/06-scripting/support/00-basics$ grep 'z' students.txt |
- | 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 | + | GHECENCO F. Răzvan 312CC 8 8.75 4.67 |
- | link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 | + | MARIN N. Răzvan 312CC 5 3.5 4.2 |
- | 99: eth0@if100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default | + | |
- | link/ether 02:42:0a:0a:0a:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0 | + | |
- | 113: eth1@if114: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default | + | |
- | link/ether 02:42:0b:0b:0b:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0 | + | |
- | 115: eth2@if116: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default | + | |
- | link/ether 02:42:0c:0c:0c:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0 | + | |
</code> | </code> | ||
- | == Exercice - Démarrer une interface == | + | <note important> |
- | Démarrez l'interface réseau ''eth2''. | + | Il est recommandé que l'argument d'expression régulière passé à la commande ''grep'' soit entouré de guillemets simples (') pour être échappé. De cette façon, les caractères de l'expression régulière seront transmis exactement à la commande grep et ne seront pas interprétés par le shell. |
- | + | ||
- | ==== Configuration du niveau Internet ==== | + | |
- | === Identification de l'adresse Internet === | + | |
- | Pour se déconnecter de l'infrastructure précédente, nous utilisons la commande ''exit''. | + | |
- | <note> | + | |
- | Pour exécuter cette démo, exécutez dans le répertoire ''~/uso-lab/labs/03-user/lab-container/'' la commande ''./lab_prepare.sh install internet''. Pour se connecter à l'infrastructure de cette section, nous utiliserons la commande ''./lab_prepare.sh connect internet'' | + | |
</note> | </note> | ||
- | Internet est une interconnexion d'appareils, appelés stations et organisés en réseaux, qui s'étend sur toute la Planète. Les données envoyées sur Internet doivent être transmises d'un nœud à un autre afin qu'elles puissent passer rapidement d'une station à une autre. | + | Ainsi, la commande grep pour extraire les étudiants dont le nom commence par la lettre F est |
- | {{ :sde2:laboratoare:retea.png?500 |}} | + | <code bash> |
+ | student@uso:~/uso-lab/labs/06-scripting/support/00-basics$ grep '[ -]F[a-z]\+[^\.]' students.txt | ||
+ | ONEA I. Flavia-Katilina 311CC 7 6.5 4.33 | ||
+ | EPURE P. Andi-Florin 314CC 8 9.5 3.67 | ||
+ | NEACȘU C. Florin-Mărgărit 314CC 10 9 9 | ||
+ | COSTEA I. Florin Traian 315CC 4 3.5 3.7 | ||
+ | CHIȚESCU E. Bogdan-Florentin 315CC 9 7.75 6.89 | ||
+ | </code> | ||
- | Ainsi, pour qu'une station communique avec une autre station sur Internet, il faut que les deux stations soient connectées à Internet. | + | ==== tr & sed ==== |
+ | L'utilitaire ''tr'' permet la traduction, la suppression et la manipulation des caractères reçus en entrée. Fondamentalement, ''sed'' est un éditeur de flux qui peut effectuer des transformations au niveau de la chaîne sur un texte reçu en entrée. De plus, sed peut accepter des expressions régulières comme argument de recherche. | ||
<note> | <note> | ||
- | Plus précisément, les stations doivent disposer d'un point de sortie du réseau local, connecté au reste des réseaux Internet, qui s'appelle //default gateway// et dont nous parlerons plus loin. | + | La différence entre tr et sed est que le premier effectue des transformations au niveau des caractères, tandis que le second effectue des transformations au niveau des chaînes. Pour cette raison, nous pouvons dire que sed est un tr, tr++ plus avancé :). |
</note> | </note> | ||
- | Ensuite, les deux stations doivent pouvoir s'adresser l'une à l'autre. C'est-à-dire que chaque station a besoin d'un identifiant, une adresse. Tout comme chaque maison dans le monde a une adresse avec laquelle elle peut être identifiée de manière unique, chaque station a une adresse unique sur Internet appelée adresse IP (Internet Protocol). | + | Par exemple, en utilisant à la fois tr et sed, remplaçons le caractère ',' par TAB dans student.csv : |
+ | <code bash> | ||
+ | student@ubuntu:~/uso-lab/labs/06-scripting/support/00-basics$ cat students.csv | tr , "\t" > students.out | ||
+ | student@ubuntu:~/uso-lab/labs/06-scripting/support/00-basics$ cat students.out | ||
+ | VLĂDUȚU I. Liviu-Alexandru 311CC 6 3.5 5.22 | ||
+ | GEORGIU V. Alexandra-Maria 311CC 10 10 9.67 | ||
+ | PĂUNOIU N. Gabriel 311CC 7 6.5 3.5 | ||
+ | BĂCÎRCEA A. Andrei 311CC 7 5.5 4.44 | ||
+ | [...] | ||
+ | |||
+ | student@ubuntu:~/uso-lab/labs/06-scripting/support/00-basics$ sed 's/,/\t/g' students.csv > students.out | ||
+ | student@ubuntu:~/uso-lab/labs/06-scripting/support/00-basics$ cat students.out | ||
+ | VLĂDUȚU I. Liviu-Alexandru 311CC 6 3.5 5.22 | ||
+ | GEORGIU V. Alexandra-Maria 311CC 10 10 9.67 | ||
+ | PĂUNOIU N. Gabriel 311CC 7 6.5 3.5 | ||
+ | BĂCÎRCEA A. Andrei 311CC 7 5.5 4.44 | ||
+ | [...] | ||
+ | </code> | ||
- | Chaque interface réseau est un chemin différent vers Internet, donc chacune a besoin d'une adresse IP configurée. | + | ==== cut ==== |
+ | Nous pouvons extraire des informations structurées sur les lignes et les colonnes à l'aide de l'utilitaire ''cut'': | ||
+ | <code bash> | ||
+ | student@ubuntu:~/uso-lab/labs/06-scripting/support/00-basics$ cat /etc/passwd | cut -d':' -f1,6 | head -3 | ||
+ | root:/root | ||
+ | daemon:/usr/sbin | ||
+ | bin:/bin | ||
+ | </code> | ||
- | Pour voir les adresses IP configurées sur les interfaces réseau, nous utilisons la commande suivante : | + | ==== sort & uniq ==== |
+ | Si nous voulons trier les élèves du fichier dans l'ordre de leurs noms, nous utiliserons la commande ''sort'' : | ||
+ | <code bash> | ||
+ | student@uso:~/uso-lab/labs/06-scripting/00-basics$ sort students.csv | ||
+ | ALECU C. Ionuț-Gabriel,312CC,7,4.5,6.4 | ||
+ | ASĂVOAEI P. Cătălin,315CC,8,6.75,7 | ||
+ | BĂCÎRCEA A. Andrei,311CC,7,5.5,4.44 | ||
+ | BADEA P. Bogdan,314CC,4,2.75,1.56 | ||
+ | [...] | ||
+ | </code> | ||
+ | Certaines options souvent utilisées avec sort sont : | ||
+ | * ''-t'' spécifie le séparateur | ||
+ | * ''-k'' spécifie l'index, ou la clé, de la colonne par laquelle nous voulons trier les entrées | ||
+ | * ''n'' tri numérique (la valeur par défaut est alphabétique) | ||
+ | * ''-r'' tri inversé (ascendant par défaut) | ||
+ | Nous voulons faire un tri numérique décroissant par année, suivi d'un tri alphabétique par groupe (c'est-à-dire toutes les années commençant par 10 mais triées par ordre de groupe). Ainsi, pour trier les entrées dans l'ordre des notes, nous utiliserons le séparateur , (virgule, virgule) et la 3ème colonne pour la clé : | ||
<code bash> | <code bash> | ||
- | root@internet:~# ip address show | + | student@uso:~/uso-lab/labs/06-scripting/support/00-basics$ sort -t ',' -k 3,3nr -k 2,2 students.csv |
- | 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 | + | GEORGIU V. Alexandra-Maria,311CC,10,10,9.67 |
- | link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 | + | MUȘATESCU V. Alexandru-Petrișor,311CC,10,8.5,9 |
- | inet 127.0.0.1/8 scope host lo | + | RADU L. Alina,311CC,10,10,7.89 |
- | valid_lft forever preferred_lft forever | + | GONDOȘ I. Gabriel,312CC,10,9,7.33 |
- | 195: eth0@if196: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default | + | [...] |
- | link/ether 02:42:0a:0a:0a:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 | + | |
- | inet 10.10.10.2/24 brd 10.10.10.255 scope global eth0 | + | |
- | valid_lft forever preferred_lft forever | + | |
- | 199: eth1@if200: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN group default | + | |
- | link/ether 02:42:0b:0b:0b:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 | + | |
- | 203: eth2@if204: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN group default | + | |
- | link/ether 02:42:0c:0c:0c:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 | + | |
</code> | </code> | ||
- | Il existe deux types d'adresses IP (IPv4 et IPv6), mais dans cet atelier, nous ne travaillerons qu'avec des adresses IPv4. Les adresses IP des interfaces sont écrites sur les lignes contenant inet. Les adresses IPv4 sont de la forme A.B.C.D, où A, B, C et D sont des nombres avec des valeurs comprises entre 1 et 255. | + | S'il y a des lignes en double, nous pouvons utiliser l'utilitaire **uniq** en conjonction avec sort pour les supprimer. Pour cela, nous ajoutons une ligne dupliquée dans Students.csv : |
- | + | <code bash> | |
- | === Configuration d'une adresse IP === | + | student@uso:~/uso-lab/labs/06-scripting/support/00-basics$ sort -t ',' -k 3,3nr -k 2,2 students.csv | wc -l |
- | + | 93 | |
- | Il existe deux méthodes pour configurer une adresse IP sur une interface : | + | student@uso:~/uso-lab/labs/06-scripting/support/00-basics$ sort -t ',' -k 3,3nr -k 2,2 students.csv | uniq | wc -l |
- | * la configuration statique, par laquelle nous configurons manuellement l'adresse IP sur l'interface réseau, consiste à savoir à quel réseau appartient l'interface que nous voulons configurer et quelles adresses IP sont libres ; | + | 92 |
- | * configuration dynamique, obtenue automatiquement, qui ne nécessite pas la connaissance des informations du réseau, car elles seront automatiquement reçues du réseau. | + | student@uso:~/uso-lab/labs/06-scripting/support/00-basics$ uniq students.csv | wc -l |
+ | 93 | ||
+ | </code> | ||
- | Nous nous en tiendrons à la configuration dynamique car c'est plus simple. De plus, nous n'avons aucun moyen de trouver les informations sur le réseau avant de configurer l'interface réseau. | + | ==== Shell scripting ==== |
+ | Un script shell est un fichier texte qui contient des commandes et des constructions spécifiques au shell. Un script shell commence par la construction ''#!/bin/bash'', appelée un shebang qui indique l'interpréteur du script ; dans ce cas, l'interpréteur est le shell Bash lui-même. Si aucun shell n'est spécifié via shebang, le shell par défaut (défini dans ''/etc/passwd'') attribué à l'utilisateur connecté sera pris par défaut. | ||
- | == Résumé - Démarrage des interfaces réseau == | + | Par exemple, les one-liners que j'ai écrits jusqu'à présent pourraient être mis dans un script shell et, de plus, s'il s'agit de longues commandes et qu'elles ne tiennent pas sur une seule ligne, nous pouvons les "casser" en plusieurs lignes en utilisant le séparateur ''\'' : |
- | Apportez les modifications nécessaires pour que l'interface ''eth1'' soit à l'état ''UP''. | + | |
- | == Configuration IP dynamique == | ||
- | Pour obtenir dynamiquement une adresse IP sur une interface nous utilisons la commande ''dhclient'' : | ||
<code bash> | <code bash> | ||
- | root@internet:~# dhclient eth1 | + | #!/bin/bash |
- | mv: cannot move '/etc/resolv.conf.dhclient-new.35' to '/etc/resolv.conf': Device or resource busy | + | |
+ | export DATE=$(date +20%y%m%d) && \ | ||
+ | mkdir -p /usr/share/snapshots && \ | ||
+ | tar -cvpzf /usr/share/snapshots/$HOSTNAME_$DATE.tar.gz \ | ||
+ | --exclude=/proc --exclude=/lost+found \ | ||
+ | --exclude=/sys --exclude=/mnt \ | ||
+ | --exclude=/media --exclude=/dev \ | ||
+ | --exclude=/share/Archive / | ||
</code> | </code> | ||
- | <note> | + | <note important> |
- | Ligne ''mv: cannot move '/etc/resolv.conf.dhclient-new.35' to '/etc/resolv.conf': Device or resource busy'' apparaît toujours dans les conteneurs Docker lorsque vous essayez d'obtenir une adresse IP à l'aide de la commande dhclient. Ce n'est pas un problème si cela se produit. | + | **ATTENTION!** Dans la construction ci-dessus après ''\'' il ne doit plus y avoir de caractères (pas même d'espaces à la fin) |
</note> | </note> | ||
- | Ci-dessus, nous avons exécuté la commande pour obtenir une adresse IP pour l'interface ''eth1''. | + | Le script contient des commandes courantes utilisées dans le shell et d'autres commandes que l'on trouve plus souvent dans les scripts : ''while, if, for''. Ce ne sont pas des instructions, ce sont toujours des commandes shell ; peut également être utilisé, si la syntaxe est correcte, sur la ligne de commande. |
- | <note> | + | === Arguments de la ligne de commande === |
- | La commande ''dhclient'' est basée sur le protocole DHCP (Dynamic Host Configuration Protocol). Il suppose qu'il existe un serveur sur le réseau qui sait quelles adresses IP sont utilisées sur le réseau et peut fournir des adresses IP aux ordinateurs effectuant des requêtes sur le réseau. ''dhclient'' fait une requête pour réserver une adresse IP au serveur DHCP sur le réseau. | + | Un script hérite des variables d'environnement du shell parent telles que HOME, BASH, IFS, USER. Dans le script, nous pouvons les utiliser comme ceci : |
- | </note> | + | <code bash> |
+ | #!/bin/bash | ||
+ | |||
+ | echo $HOME | ||
+ | </code> | ||
- | == Résumé - Affichage des adresses IP configurées sur les interfaces réseau == | + | En plus de ces variables, le script peut recevoir un certain nombre d'arguments de ligne de commande. En utilisant les variables suivantes, nous pouvons faire référence aux arguments reçus par le script depuis la ligne de commande : |
- | Afficher les adresses IP sur toutes les interfaces. | + | * ''$*'' est une chaîne ($1, $2 … $n) composée de tous les arguments reçus par le script |
+ | * ''$@'' est une liste d'arguments de script | ||
+ | * ''$1, $2 … $n'' représente chaque paramètre du script | ||
+ | * ''$0'' est le nom du script | ||
+ | * ''$#'' est le nombre d'arguments reçus de la ligne de commande | ||
+ | Par exemple, prenons le script arguments.sh suivant : | ||
+ | <code bash> | ||
+ | echo There are $# arguments to $0: $* | ||
+ | echo first argument: $1 | ||
+ | echo second argument: $2 | ||
+ | echo third argument: $3 | ||
+ | echo the list of arguments: $@ | ||
+ | </code> | ||
- | Notez que nous avons obtenu une adresse IP sur l'interface ''eth1''. | + | <code bash> |
+ | student@uso:~$ ./arguments.sh banane cirese caise castraveti | ||
+ | There are 4 arguments to arguments.sh: banane cirese caise castraveti | ||
+ | first argument: banane | ||
+ | second argument: cirese | ||
+ | third argument: caise | ||
+ | the list of arguments: banane cirese caise castraveti | ||
+ | </code> | ||
- | == Exercice - Configurer dynamiquement une adresse IP == | + | === La construction while read === |
- | Configurez l'adresse IP sur l'interface ''eth2''. | + | Créez un nouveau script extract-name avec le contenu suivant : |
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | |||
+ | IFS=',' | ||
+ | while read name group final_grade test_grade practical_grade; do | ||
+ | echo "$name" | ||
+ | done < students.csv | ||
+ | </code> | ||
- | == Supprimer une configuration réseau d'une interface == | + | Pour l'analyse dans le shell, nous utilisons la construction ''while read ...''. La construction est suivie des noms des variables dans lesquelles nous retiendrons les champs analysés à l'intérieur de chaque ligne. Nous utilisons le fichier ''Students.csv'' dans le répertoire parent comme entrée ; est un fichier au format CSV (Comma Separated Values) utilisant le caractère virgule (,, virgule) comme séparateur. Pour extraire uniquement les noms des étudiants du fichier d'entrée, nous allons exécuter le script ''extract-name'' : |
- | Pour supprimer une adresse IP d'une interface, utilisez la commande ''ip address flush'' comme suit : | + | |
<code bash> | <code bash> | ||
- | root@internet:~# ip address flush eth1 | + | student@uso:~/uso-lab/labs/06-scripting/support/00-basics$ ./extract-name |
- | root@internet:~# ip address show eth1 | + | VLĂDUȚU I. Liviu-Alexandru |
- | 199: eth1@if200: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default | + | GEORGIU V. Alexandra-Maria |
- | link/ether 02:42:0b:0b:0b:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 | + | PĂUNOIU N. Gabriel |
+ | BĂCÎRCEA A. Andrei | ||
+ | [...] | ||
</code> | </code> | ||
- | <note> | + | Étant donné que le format d'entrée utilise une virgule (,, virgule) comme séparateur, nous avons défini la variable interne IFS (Internal Field Separator) dans le script à la valeur ',', comme nous le voyons à la ligne 3 du script extract-name : |
- | Nous pouvons afficher la configuration d'une seule interface réseau en utilisant le nom de l'interface comme paramètre de la commande ''ip address show''. | + | |
- | </note> | + | |
- | == Exercice - Suppression de la configuration réseau == | + | <code bash> |
- | Supprimez la configuration réseau sur les interfaces ''eth1'' et ''eth2''. | + | IFS=',' |
+ | </code> | ||
- | === Vérification de la connectivité à une autre station === | + | === if statement === |
- | <note> | + | Nous pouvons étendre le script ci-dessus pour afficher uniquement les étudiants dont la moyenne est supérieure à 5. |
- | Pour exécuter cette démo, les commandes seront exécutées dans la machine virtuelle. Pour vérifier la connexion entre deux stations, nous utilisons la commande ''ping''. Cette commande envoie des messages à une station et attend une réponse de sa part. | + | <code bash> |
- | </note> | + | #!/bin/bash |
+ | |||
+ | IFS=',' | ||
+ | while read name group final_grade test_grade practical_grade; do | ||
+ | if test "$final_grade" -gt 5; then | ||
+ | echo "$name,$group,$final_grade" | ||
+ | fi | ||
+ | done < students.csv | ||
+ | </code> | ||
- | Lors du test de la connexion Internet, nous voulons vérifier quelques éléments une fois que nous avons obtenu une adresse IP du serveur DHCP : | + | === for loop === |
- | * nous vérifions si nous pouvons nous connecter à d'autres ordinateurs sur le même réseau | + | Il existe également des constructions de type ''for'' dans bash. Un exemple courant consiste à parcourir le contenu d'un répertoire et à effectuer des opérations sur les fichiers. Par exemple, nous souhaitons sauvegarder tous les fichiers d'un répertoire envoyé en paramètre au script : |
- | * nous vérifions si nous pouvons communiquer avec des stations en dehors du réseau | + | |
- | Par exemple, si nous voulons vérifier la connectivité au serveur 8.8.8.8 (un serveur public sur Internet), nous utilisons la commande : | + | |
<code bash> | <code bash> | ||
- | student@uso:~$ ping -c 4 8.8.8.8 | + | #!/bin/bash |
- | PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. | + | |
- | 64 bytes from 8.8.8.8: icmp_seq=1 ttl=61 time=23.0 ms | + | for file in $1/* |
- | 64 bytes from 8.8.8.8: icmp_seq=2 ttl=61 time=25.7 ms | + | do |
- | 64 bytes from 8.8.8.8: icmp_seq=3 ttl=61 time=24.8 ms | + | if test -f $file; then |
- | 64 bytes from 8.8.8.8: icmp_seq=4 ttl=61 time=25.2 ms | + | stat --print="%a %F %n\n" $file |
+ | cp $file $file.bkp | ||
+ | fi | ||
+ | done | ||
+ | </code> | ||
- | --- 8.8.8.8 ping statistics --- | + | <code bash> |
- | 4 packets transmitted, 4 received, 0% packet loss, time 3092ms | + | #!/bin/bash |
- | rtt min/avg/max/mdev = 23.051/24.731/25.707/1.020 ms | + | |
+ | for file in $(find /usr/share/pixmaps/ -type f -iname '*.jpg') | ||
+ | do | ||
+ | echo $file | ||
+ | done | ||
</code> | </code> | ||
- | Le comportement par défaut de la commande ping est d'envoyer des paquets indéfiniment. J'ai utilisé l'option -c 4 dans l'exemple ci-dessus pour réduire le nombre de paquets envoyés à 4. | + | ===== Exercices ===== |
+ | ==== 01. Alias ==== | ||
+ | Dans cet ensemble d'exercices/tutoriels, nous verrons comment utiliser les alias pour rendre les actions plus efficaces. | ||
- | Lorsque les messages ne peuvent pas être envoyés à la station identifiée par l'adresse IP, le message d'erreur ressemblera à ceci : | + | Commençons par utiliser la commande xdg-open dans les formulaires ci-dessous : |
<code bash> | <code bash> | ||
- | student@uso:~$ ping 10.10.10.10 | + | xdg-open . |
- | PING 10.10.10.10 (10.10.10.10) 56(84) bytes of data. | + | xdg-open http://google.com |
- | From 10.10.10.3 icmp_seq=1 Destination Host Unreachable | + | <code> |
- | From 10.10.10.3 icmp_seq=2 Destination Host Unreachable | + | |
- | From 10.10.10.3 icmp_seq=3 Destination Host Unreachable | + | |
- | From 10.10.10.3 icmp_seq=4 Destination Host Unreachable | + | |
- | ^C | + | |
- | --- 10.10.10.10 ping statistics --- | + | |
- | 4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3074ms | + | |
- | </code> | + | |
- | Pour vérifier la connectivité au sein du réseau, nous devons vérifier que nous pouvons envoyer des messages à l'aide de l'utilitaire ''ping'' à un ordinateur du réseau. | + | Ces commandes ouvrent respectivement un navigateur de fichiers, un navigateur web. |
- | Par défaut, la commande ''ping'' envoie des messages de vérification de connexion à l'infini. Cette fois, au lieu d'exécuter la commande ping à l'aide de l'option ''-c 4'', nous avons arrêté l'exécution de la commande à l'aide de la combinaison de touches ''Ctrl+c''. | + | Pour effectuer des actions plus rapidement, nous utilisons un alias. Nous créons des alias open et go pour xdg-open comme ci-dessous : |
+ | <code bash> | ||
+ | alias open='xdg-open' | ||
+ | alias go='xdg-open' | ||
+ | </code> | ||
- | Une bonne cible de test pour l'envoi de messages sur le réseau est la passerelle (par défaut). Une passerelle est un périphérique réseau qui gère l'interconnexion des réseaux et reçoit les messages de toutes les stations du réseau pour les envoyer sur Internet. | + | ** Exercice **: Utilisez maintenant la commande open ou la commande go pour les deux actions ci-dessus. Nous avons simplifié la commande xdg-open (plus difficile à écrire et plus difficile à retenir). |
- | La passerelle est configurée de manière statique ou dynamique, tout comme l'adresse IP d'une interface est configurée. | + | ==== 02. One liners ==== |
+ | Saisissez le sous-répertoire noms-indexés/. Nous voulons effectuer des opérations automatiques sur le système de fichiers, en utilisant les lignes for et one. | ||
- | Pour identifier la passerelle, nous utilisons la commande ''ip route show'' comme suit : | + | Nous exécutons les deux commandes ci-dessous : |
<code bash> | <code bash> | ||
- | student@uso:~$ ip route show | + | for i in $(seq -f "%02g" 1 3); do touch test-"$i".txt; done |
- | default via 192.168.40.2 dev eth0 proto dhcp src 192.168.40.128 metric 100 | + | for i in $(seq -f "%02g" 0 12); do mkdir uso-curs-"$i"; done |
- | 10.10.10.0/24 dev br1 proto kernel scope link src 10.10.10.253 | + | |
- | 11.11.11.0/24 dev br2 proto kernel scope link src 11.11.11.253 | + | |
- | 12.12.12.0/24 dev br3 proto kernel scope link src 12.12.12.253 | + | |
- | 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown | + | |
- | 192.168.40.0/24 dev eth0 proto kernel scope link src 192.168.40.128 metric 100 | + | |
- | 192.168.40.2 dev eth0 proto dhcp scope link src 192.168.40.128 metric 100 | + | |
- | 192.168.202.0/24 dev eth1 proto kernel scope link src 192.168.202.128 metric 100 | + | |
- | 192.168.202.1 dev eth1 proto dhcp scope link src 192.168.202.128 metric 100 | + | |
</code> | </code> | ||
- | Nous remarquons que l'adresse IP de la passerelle par défaut est 192.168.40.2, car elle se trouve sur la ligne contenant la chaîne par défaut. | + | A la fin de l'exécution de ces commandes, on obtient 3 fichiers texte (pour les 3 papiers/tests) et 13 répertoires, pour les 13 répertoires. J'ai utilisé for pour parcourir une liste et seq pour créer une liste numérique. |
- | == Résumé - Afficher l'adresse IP configurée sur une interface == | + | **Exercice** : Créez une doublure qui crée les 13 répertoires et crée dans chaque répertoire un sous-répertoire appelé slides/, un fichier appelé notes.txt et un fichier appelé resources.txt. |
- | Découvrez l'adresse réseau à partir de l'interface ''eth1''. | + | |
- | == Exercice - Vérifier la connectivité avec le gateway == | + | ==== 03. One liners vs commands ===== |
- | Vérifiez la connexion avec la passerelle à l'aide de la commande ''ping''. | + | Nous exécutons les commandes suivantes pour générer un mot de passe à 16 caractères et afficher les PID des processus utilisateur étudiants : |
+ | <code bash> | ||
+ | tr -dc 'a-zA-Z0-9~!@#$%^&*_()+}{?></";.,[]=-' < /dev/urandom | fold -w 32 | head -n 1 | ||
+ | ps -ef | grep student | tr -s ' ' | cut -d ' ' -f 2 | ||
+ | </code> | ||
- | <note> | + | ==== 04. Scripts simples ==== |
- | Pour vérifier la connexion Internet, il est bon de vérifier avec une adresse établie, qui, nous l'espérons, n'aura pas de problèmes techniques. Un tel exemple est le serveur de Cloudflare à l'adresse IP ''1.1.1.1''. | + | **Exercice** : Pour désactiver le montage des clés USB sur le système, nous pouvons utiliser les commandes : |
- | </note> | + | <code bash> |
+ | sudo rmmod uas | ||
+ | sudo rmmod usb_storage | ||
+ | </code> | ||
- | == Exercice - Vérification de la connectivité Internet == | + | Ensuite, pour réactiver, on utilise les commandes : |
- | Vérifiez la connexion au serveur ''8.8.8.8'' fourni par Google à l'aide de la commande ''ping''. | + | <code bash> |
+ | sudo modprobe usb_storage | ||
+ | sudo modprobe uas | ||
+ | </code> | ||
+ | |||
+ | Créez des scripts disable-usb et enable-usb pour désactiver et activer le montage de la clé USB, respectivement. Exécutez-les pour vérification. | ||
+ | |||
+ | **Exercice** : Créez un script appelé system-info qui affiche les informations système dans le modèle ci-dessous : | ||
+ | <code bash> | ||
+ | date: 2019-11-05 | ||
+ | kernel: 5.0.0-32-generic | ||
+ | version: Ubuntu 18.04.3 LTS | ||
+ | num_processes: 336 | ||
+ | </code> | ||