====== 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 ==== #! /bin/bash echo off while [IFS=] read champ1 champ2 do echo "Ceci est le champ n°1: " $champ1 echo "Et voici le champ 2 : " $champ2 done< [] * **#! /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=** : 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 * **[]** : 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 : chmod +x On pourra alors l'exécuter : ./ ===== Démarche de création ===== - 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 ===== Variables ===== Les variables dans les scripts se déclarent par leur nom, et s'utilisent avec le préfixe $. Exemple : #il n'y a pas d'espace entre la variable et le caractère "=" mavariable="bonjour" echo $mavariable La concaténation de chaine dans une variable s'écrit par la simple juxtaposition des portions de texte : Exemple : laDate=$(date +%Y%m%d) nomFichier="fichier"$laDate".csv" ===== 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 ""): date +"" #ou date + 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 : date +"%d/%m/%y" Affichera 13/02/18. date +"%Y-%m-%d" Affichera 2018-02-13 ===== Exemple 1 : création de groupes en masse ===== Pour créer des groupes en masse : * on utilise la commande addgroup 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 nom du groupe. Voici la source de données dans le fichier donneesgroupes.csv: groupe1 groupe2 groupe3 Le script doit parcourir ce fichier et pour chaque ligne utiliser la commande addgroup. #! /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 Sur la boucle WHILE * l’information IFS= indique le caractère qui sépare les champs (ici , même s’il n’y en a pas besoin) * après read, on indique le nom de la ou des variables qui prendront le contenu d’une ligne. Ici, il n’y a qu’une variable legroupe puisqu’il n’y a qu’une donnée sur la ligne. * Après done < 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 : 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 On doit indiquer le mot de passe (2 fois), les 5 informations de l'utilisateur et valider par Y. Un script demandera donc d'interagir pour fournir ces éléments. Une astuce est : * de stocker les informations nécessaires dans le fichier CSV, * dans le script, de créer un fichier de réponses temporaire avec les données issues du CSV * de demander l'exécution de la commande interactive en se fournissant dans le fichier de réponses ainsi généré * de supprimer ce fichier temporaire pour éviter de laisser des informations sensibles sur le disque ==== Illustration ==== #! /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 Ici on a intégré le compte directement dans un groupe (--ingroup) pour éviter la création d'un groupe au nom de l'utilsiateur