PROFDINFO.COM

Votre enseignant d'informatique en ligne

Solution du labo 2

Retour à la page du cours

Voici des solutions possibles pour le laboratoire 2:

Premièrement, on modifie nos scripts CreerGroupe, RenommerGroupe et CreerUsager pour qu'ils vérifient le nombre de paramètres avant de se lancer dans les opérations. Dans tous les cas, on n'a qu'à commencer notre script par un if qui vérifie si le nombre de paramètres reçus ($#) est égal au nombre nécessaire. Si oui, on fait le traitement que l'on faisait directement avant, sinon on affiche un message d'erreur expliquant la façon correcte d'utiliser notre script:

CreerGroupe

#!/bin/bash

if [ $# -eq 1 ]; then
  /usr/sbin/groupadd $1
  mkdir /home/$1
  chgrp $1 /home/$1
  chmod 750 /home/$1
else
  echo "Usage:  $0 groupe"
fi
      

RenommerGroupe

#!/bin/bash
# $1 = ancien nom, $2 = nouveau nom

if [ $# -eq 2 ]; then
  /usr/sbin/groupmod -n $2 $1
  mv /home/$1 /home/$2
else
  echo "Usage:  $0 ancien_nom nouveau_nom"
fi

CreerUsager

#!/bin/bash
# $1 = nom du groupe, $2 = nom de l'usager, $3 = mot de passe

if [ $# -eq 3 ]; then
  ./CreerGroupe $1
  /usr/sbin/useradd -g $1 -d /home/$1/$2 -m -s /bin/bash $2
  echo "$2:$3" > /usr/bin/chpasswd
else
  echo "Usage:  $0 groupe usager mot_de_passe"
  echo "groupe = nom du groupe principal de l'usager"
  echo "si groupe n'existe pas, il sera cree"
fi

Notez que:

  • Le paramètre $0 contient le nom du script, ce qui permet d'écrire la commande que l'usager aurait dû taper pour que le script fonctionne et ce, peu importe si le script a été renommé depuis sa création.
  • On testera le nombre de paramètres avec -eq afin de vérifier qu'on en a reçu le nombre exact, pas plus ni moins.

DetruireGroupe est un cas spécial, puisqu'on doit le modifier pour accepter un paramètre (le nom du groupe à détruire) ou deux paramètres (un "-d" d'abord, suivi du nom du groupe). Aucun paramètre, ou plus que deux, ou deux sans un "-d" d'abord sont des cas illégaux. Remarquez qu'on pouvait prendre pour acquis que l'usager utilisait toujours "-d" s'il entrait deux paramètres, mais c'est très facile de le vérifier d'abord:

DetruireGroupe

#!/bin/bash

if [ $# -eq 2 ] && [ "$1" == "-d" ]; then
  # Supression du groupe et du repertoire
  /usr/sbin/groupdel $2
  rm -Rf /home/$2
elif [ $# -eq 1 ]; then
  # Supression du groupe seulement
  /usr/sbin/groupdel $1
else
  echo "Usage:  $0 [-d] groupe"
  echo "-d:  supprime le repertoire du groupe dans /home en plus du groupe"
fi
      

On a donc nos trois cas possibles:

  • Soit on a deux paramètres et le premier est "-d". Dans ce cas, on supprime le groupe (qui est donné comme deuxième paramètre) et on supprime le répertoire (exactement comme on faisait dans la version 1);
  • Soit on a un seul paramètre. Dans ce cas, on supprime le groupe (qui est donné comme premier paramètre) et on ne touche pas au répertoire;
  • Soit on a un cas différent (aucun paramètre, plus de deux paramètres ou deux paramètres avec autre chose que "-d" en premier). Dans ce cas, on affiche le message d'erreur.

Si on voulait supposer que l'usager utilisait toujours un des trois cas présentés dans l'énoncé de l'exercice, on pouvait enlever le && [ "$1" == "-d" ] dans le premier if...

gestion

Le script de gestion doit afficher le menu (une série d'echos), lire un choix (dans une variable) et, selon le choix entré, poser des questions à l'usager et appeler un des quatre scripts ci-haut avec les bons paramètres.

Pour ce faire, on n'a qu'à poser des questions à l'usager, lire les réponses (donc les stocker dans des variables), puis ensuite appeler le script correspondant en lui passant en paramètre la valeur des variables. N'oubliez pas qu'une variable précédée d'un $ est remplacée par sa valeur. C'est donc la valeur qui sera passée au script correspondant en tant que paramètre.

Il ne faut pas tenter d'utiliser ici les $1 et $2. En effet, même si, par exemple, dans CreerGroupe le nom du groupe est placé dans $1, dans gestion $1 ne contient rien puisqu'on a appelé gestion en faisant simplement:

gestion

Voici donc le code:

echo "Menu des operations"
echo
echo "1- Creer un groupe"
echo "2- Renommer un groupe"
echo "3- Detruire un groupe"
echo "4- Creer un usager"
echo
echo -n "Votre choix:  "
read CHOIX
if [ "$CHOIX" == "1" ]; then
  echo -n "Nom du groupe a creer:  "
  read NOMGRP
  ./CreerGroupe $NOMGRP
elif [ "$CHOIX" == "2" ]; then
  echo -n "Nom actuel du groupe:  "
  read ANCNOM
  echo -n "Nouveau nom du groupe:  "
  read NOUVNOM
  ./RenommerGroupe $ANCNOM $NOUVNOM
elif [ "$CHOIX" == "3" ]; then
  echo -n "Nom du groupe:  "
  read NOMGRP
  echo -n "Detruire egalement le repertoire du groupe sous /home (o/n)?  "
  read CONFIRM
  if [ "$CONFIRM" == "o" ] || [ "$CONFIRM" == "O" ]; then
    ./DetruireGroupe -d $NOMGRP
  else
    ./DetruireGroupe $NOMGRP
  fi
elif [ "$CHOIX" == "4" ]; then
  echo -n "Nom de l'usager:  "
  read USER
  echo -n "Nom du groupe primaire (il sera cree si necessaire):  "
  read NOMGRP
  echo -n "Mot de passe:  "
  read PASSWD
  ./CreerUsager $NOMGRP $USER $PASSWD
else
  echo "Choix invalide"
fi

Remarquez en passant:

  • J'ai choisi de tester le contenu de la variable CHOIX (le choix dans le menu fait par l'usager) comme une chaîne de caractères et non un nombre. Ainsi, si l'usager écrit quelque chose d'étrange comme "bonjour" au lieu d'entrer un choix numérique, mon script ne plante pas et "Choix invalide" est affiché à l'écran.
  • J'aime bien utiliser l'option -n du echo pour empêcher echo de sauter une ligne.
  • Dans le cas de la destruction d'un groupe, on sait que notre script DetruireGroupe s'attend à recevoir un nom de groupe, avec un -d facultatif comme premier paramètre. Toutefois, il n'est pas très professionnel de demander à l'usager d'entrer un -d avant le nom du groupe s'il veut détruire le répertoire. Bien que ça fonctionne, ça augmente les possibilités d'erreur et ça fait broche à foin:
    • Voulez-vous détruire le répertoire du groupe?
    • Oui
    • N'entrez pas oui, entrez -d
    • -d?
    • Eh oui.

Retour à la page du cours