Table des matières

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 :

Illustration

#! /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> 

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 <nomducript.sh>

On pourra alors l'exécuter :

./<nomduscript.sh>

Démarche de création

  1. Identifier les actions à mener
  2. Pour chaque commande, repérer les données nécessaires
  3. Identifier les fichiers de données à constituer
  4. Créer le script
  5. 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 +"<format>"
#ou
date +<format>

Le format utilise les paramètres suivants :

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 :

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

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 <reponses.txt
  echo $lecompte "est ajoute"
  #suppression des reponses
  rm reponses.txt
done < donneesutils.csv

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