PROFDINFO.COM

Votre enseignant d'informatique en ligne

Solution du labo 5

Retour à la page du cours

Voici des solutions possibles pour le laboratoire 5:

1- On modifie le script de lecture de /etc/passwd pour ajouter la lecture de /etc/group à la recherche du nom de groupe.

Pour ce faire, il suffit de faire une deuxième boucle à l'intérieur de la boucle existante. Après chaque read de la première boucle, on a dans nos variables toutes les données d'un compte. On ira alors lire au complet le fichier /etc/group. À chaque ligne de /etc/group qui est lue, on compare le numéro du groupe avec celui qu'on avait lu dans /etc/passwd pour l'usager. Si les numéros sont pareils, on a trouvé le groupe et on a donc son nom. On peut remplacer son numéro par son nom dans la variable appropriée. On peut également sortir de la boucle interne, puisque ça ne sert plus à rien de continuer à chercher une fois qu'on a déjà trouvé (ce ne serait pas grave toutefois).

Si on sort de la boucle interne "normalement" et qu'on n'a rien trouvé, le numéro du groupe sera resté dans la variable et on aura du coup réglé le cas d'exception improbable.

On aurait pu aussi créer une variable quelconque (comme disons FOUND) qu'on met égale à 0 (par exemple) avant d'entrer dans la boucle interne. Si on trouve le numéro du groupe, on met FOUND à 1 (disons). Une fois sorti de la boucle, on regarde la valeur de FOUND pour savoir si on a trouvé ou non le nom du groupe. On peut alors afficher le nom ou le numéro, qui pourraient alors être dans deux variables différentes.

IFS=":"
echo "Liste des usagers enregistres "
echo "----------------------------------------------"
while read USER PASSWORD USERID GROUPID NAME HOMEDIR USERSHELL
do
   while read GROUPNAME GROUPPASS GROUPID2 USERS; do
      if [ $GROUPID -eq $GROUPID2 ]; then
         GROUPID=$GROUPNAME
         break
      fi
   done < /etc/group

   echo "Usager:                 $USER"
   echo "Mot de passe encrypte:  $PASSWORD"
   echo "ID usager:              $USERID"
   echo "Groupe:                 $GROUPID"
   echo "Nom complet:            $NAME"
   echo "Repertoire maison:      $HOMEDIR"
   echo "Shell par defaut:       $USERSHELL"
   echo "----------------------------------------------"
done < /etc/passwd

2- La lecture du fichier /etc/hosts se fait sans trop de mal, avec une boucle while contenant un read comme condition, et deux variables pour les deux champs. La seule petite difficulté: comment ignorer les deux lignes de commentaires au début?

La façon la plus facile à comprendre avec les connaissances que l'on a est simplement de se créer un compteur de lignes. Dans la boucle, on regarde si on est rendu plus loin que la ligne 3 avant de faire le traitement. Ainsi, les deux premières lignes seront lues mais rien ne sera fait avec leurs données.

Autre façon, meilleure, mais qui nécessitait des connaissances que vous n'aviez pas: on peut vérifier le premier caractère de la première variable pour voir si c'est un #. Si oui, on ignore la ligne, si non on la traite.

Dans ce cas, je devrais remplacer le if à l'intérieur du while dans mon code par celui qui est en commentaire (à ce moment, le compteur deviendrait inutile). Notez la syntaxe étrange: ${ADRESSE:0:1}. Ceci signifie de prendre la variable ADRESSE et d'aller chercher 1 caractère à partir du numéro 0 (donc le premier). On pouvait trouver cette syntaxe dans le man de bash (faites man bash) si on était vraiment déterminé. (cherchez "Parameter expansion" dans le man de bash pour trouver plus de détails et d'autres possibilités).

L'ajout d'un nouvel alias dans /etc/hosts va de soi, on pose deux questions et on ajoute une ligne au fichier avec un echo redirigé (n'oubliez pas d'utiliser >> pour ne pas effacer le fichier déjà existant!).

La suppression était l'énigme du jour. Comme on ne peut pas effacer dans un fichier, la seule chose que l'on pouvait faire était de lire le fichier et de le recréer à côté dans un autre fichier. Lorsqu'on tombe sur la ligne à effacer, on ne la réécrit pas. Du coup, lorsqu'on a terminé, on se retrouve avec un fichier identique sauf pour la ligne manquante. Il ne nous reste plus qu'à le recopier par-dessus l'original.

J'ai décidé de créer le fichier temporaire dans /var/tmp, qui est un endroit tout indiqué pour ça. Il ne faut pas oublier de le détruire avant d'y écrire, pour éviter d'y ajouter des trucs suite à une exécution précédente.

Le rm -f (pour effacer le fichier temporaire précédent) et le cp -f (pour recopier le temporaire par-dessus l'original) permettent de nous assurer que Linux ne demandera pas de confirmation à l'usager pour ces actions (il pourrait ne pas comprendre ce qui se passe). On a déjà demandé une confirmation nous-même de toute façon.

 

PS3="Votre choix (ENTER reaffiche le menu):  "
select CHOIX in "Afficher le fichier hosts" "Ajouter un alias" 
\ "Effacer un alias" "Quitter"; do
   if [ "$CHOIX" == "Afficher le fichier hosts" ]; then
      COMPTEUR=1
      while read ADRESSE ALIAS; do
         if [ $COMPTEUR -gt 2 ]; then
         #if [ "${ADRESSE:0:1}" != "#" ]; then
            echo "Adresse:  $ADRESSE"
            echo "Alias:    $ALIAS"
            echo "---------------------------------------"
         fi
         let COMPTEUR=COMPTEUR+1
      done < /etc/hosts
   elif [ "$CHOIX" == "Ajouter un alias" ]; then
      echo -n "Entrez l'adresse IP dans un format correct:  "
      read ADRESSE
      echo -n "Entrez l'alias:  "
      read ALIAS
      echo "$ADRESSE $ALIAS" >> /etc/hosts
   elif [ "$CHOIX" == "Effacer un alias" ]; then
      echo -n "Entrez l'alias a effacer:  "
      read ALIAS
      echo -n "Vous allez effacer $ALIAS, etes-vous certain (o/n)?"
      read CONF
      if [ "$CONF" == "o" ]; then
         rm -f /var/tmp/hosts.tmp
         while read ADRESSE ALIASHOSTS; do
            if [ "$ALIASHOSTS" != "$ALIAS" ]; then
               echo "$ADRESSE $ALIASHOSTS" >> /var/tmp/hosts.tmp
            fi
         done < /etc/hosts
         cp -f /var/tmp/hosts.tmp /etc/hosts
         echo "Alias efface"
      else
         echo "Operation annulee"
      fi
   elif [ "$CHOIX" == "Quitter" ]; then
      echo "Au revoir"
      exit 0
   else
      echo "Choix invalide.  Recommencez."
   fi
done

Retour à la page du cours