Afficher la pageAnciennes révisionsLiens de retourAjouter au livre.Exporter en PDFExportation ODTImport Word DocumentHaut de page Cette page est en lecture seule. Vous pouvez afficher le texte source, mais ne pourrez pas le modifier. Contactez votre administrateur si vous pensez qu'il s'agit d'une erreur. ====== Scripting sous Linux ====== ===== Principes ===== Les scripts sont un moyen d’automatiser des actions à répéter pour de nombreuses données, en évitant toute interaction. Pour fonctionner, ils doivent : * disposer d’une source de données nécessaires à leur action : on utilise les fichiers CSV (comma separated values ou valeurs séparées par des virgules) qui doivent comporter * sur une ligne, chaque information nécessaire au traitement d’un objet (un groupe, un compte, un dossier, la liste des droits à appliquer sur un dossier) * autant de lignes que d’objets à traiter * parcourir cette source grâce à la boucle while … done * exécuter les commandes en ligne en remplaçant les valeurs par les données issues du CSV ==== Illustration ==== <code lscript> #! /bin/bash echo off while [IFS=<séparateur>] read champ1 champ2 do echo "Ceci est le champ n°1: " $champ1 echo "Et voici le champ 2 : " $champ2 done< [</chemin>]<fichierAlire> </code> * **#! /bin/bash** : pour afficher la syntaxe en couleur * **echo off** : pour ne pas afficher les commandes qui s'exécutent au fur et à mesure * **while ... read champ1 champ2** : boucle de parcours qui précise la structure du contenu de chaque ligne * **IFS=<séparateur>** : option qui permet de définir le séparateur des champs dans un fichier structuré (CSV). Le séparateur est généralement un des caractères : , ;. L'espace est le séparateur par défaut * **Do** : début du code à exécuter dans la boucle * **$champ1** : variable contenant la première information de la ligne * **echo –e** : //echo// réalise un affichage écran, -e permet d'ajouter un retour à la ligne * **done** : fin de la boucle * ** <** : indique qu'on prend le contenu de ce qui suit * **[</chemin>]<fichierAlire>** : fichier dont on exploite le contenu (avec chemin éventuel) ==== Rendre un script exécutable ==== Un script est un fichier avec l'extension .sh qui doit être exécutable. Pour cela, on doit lui ajouter la permission : <code bash>chmod +x <nomducript.sh></code> On pourra alors l'exécuter : <code bash>./<nomduscript.sh></code> ===== Démarche de création ===== <WRAP center round box 60%> - Identifier les actions à mener - Pour chaque commande, repérer les données nécessaires - Identifier les fichiers de données à constituer - Créer le script - Réaliser un test sur un jeu de données significatif </WRAP> ===== Variables ===== Les variables dans les scripts se déclarent par leur nom, et s'utilisent avec le préfixe $. Exemple : <code lscript> #il n'y a pas d'espace entre la variable et le caractère "=" mavariable="bonjour" echo $mavariable </code> La concaténation de chaine dans une variable s'écrit par la simple juxtaposition des portions de texte : Exemple : <code lscript> laDate=$(date +%Y%m%d) nomFichier="fichier"$laDate".csv" </code> ===== Gestion des dates ===== On peut gérer l'affichage des dates avec la commande **//date//** : La syntaxe est diffrente selon les distributions (tester avec ou sans les ""): <code lscript>date +"<format>" #ou date +<format> </code> Le format utilise les paramètres suivants : * %d : affiche le jour * %m : affiche le mois * %y : affiche l'année sur deux caractères (18 pour 2018) * %Y : affiche l'année sur quatre caractères (2018) * %H : affiche l'heure * %M : affiche les minutes * %S : affiche les secondes Exemples : <code lscript>date +"%d/%m/%y"</code> Affichera 13/02/18. <code lscript>date +"%Y-%m-%d"</code> Affichera 2018-02-13 ===== Exemple 1 : création de groupes en masse ===== Pour créer des groupes en masse : * on utilise la commande <wrap em>addgroup <nomgroupe></wrap> qui prend donc en paramètre le nom d’un groupe. * La source de données est donc un fichier ne contenant sur chaque ligne que le <wrap em>nom du groupe</wrap>. Voici la source de données dans le fichier donneesgroupes.csv: <code apache>groupe1 groupe2 groupe3</code> Le script doit parcourir ce fichier et pour chaque ligne utiliser la commande addgroup. <code bash>#! /bin/bash #! /bin/sh # Boucle qui lit le fichier "donneesgroupes.csv" et cree les groupes correspondant while IFS=, read legroupe do groupadd $legroupe echo $legroupe "est ajoute" done < donneesgroupes.csv </code> Sur la <wrap em>boucle WHILE</wrap> * l’information <wrap em>IFS=</wrap> indique le caractère qui sépare les champs (ici <wrap em>,</wrap> même s’il n’y en a pas besoin) * après <wrap em>read</wrap>, on indique le nom de la ou des variables qui prendront le contenu d’une ligne. Ici, il n’y a qu’une variable <wrap em>legroupe</wrap> puisqu’il n’y a qu’une donnée sur la ligne. * Après <wrap em>done < </wrap> on indique le nom du fichier qui contient les données donneesgroupes.csv ===== Exemple 2 : Script avec fichier de réponse ===== Certaines commandes Linux nécessitent une interaction. Par exemple, la création d'utilisateur demande de multiples informations : <code bash>root# adduser unutil Adding user `unutil' ... Adding new group `unutil' (1008) ... Adding new user `unutil' (1008) with group `unutil' ... Creating home directory `/home/unutil' ... Copying files from `/etc/skel' ... New password: Retype new password: passwd: password updated successfully Changing the user information for unutil Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] Y</code> <WRAP center round important 60%> On doit indiquer le mot de passe (2 fois), les 5 informations de l'utilisateur et valider par Y. </WRAP> <wrap em>Un script demandera donc d'interagir pour fournir ces éléments.</wrap> <WRAP center round tip 90%> Une astuce est : * de <wrap em>stocker les informations</wrap> nécessaires dans le <wrap em>fichier CSV</wrap>, * dans le <wrap em>script</wrap>, de <wrap em>créer un fichier de réponses temporaire</wrap> avec les <wrap em>données issues du CSV</wrap> * de demander l'<wrap em>exécution de la commande</wrap> interactive en <wrap em>se fournissant dans le fichier de réponses</wrap> ainsi généré * de <wrap em>supprimer ce fichier temporaire</wrap> pour éviter de laisser des informations sensibles sur le disque </WRAP> ==== Illustration ==== <code bash>#! /bin/bash #! /bin/sh echo on # Boucle qui lit le fichier "donneesutils.csv" et cree les utilisateurs correspondant dans les bons groupes while IFS=, read lecompte lepass legroupe do #cree un fichier de reponse #mot de passe. La premiere ligne cree le fichier responses.txt (>), les autres ajoutent a son contenu (>>) echo $lepass > reponses.txt echo $lepass >> reponses..txt #infos du compte : ici données vides echo >> reponses.txt echo >> reponses.txt echo >> reponses.txt echo >> reponses.txt echo >> reponses.txt #validation echo "Y" >> reponses.txt #execution de la commande d'ajout avec les donnees presentes dans le fichier reponses.txt adduser $lecompte --ingroup $legroupe <reponses.txt echo $lecompte "est ajoute" #suppression des reponses rm reponses.txt done < donneesutils.csv</code> <WRAP center round important 60%> Ici on a intégré le compte directement dans un groupe <wrap em>(--ingroup)</wrap> pour éviter la création d'un groupe au nom de l'utilsiateur </WRAP> scriptlinux.txt Dernière modification : 2022/10/17 16:09de admin