Exercice : Défi

Il va falloir réaliser un script Bash complet qui réalise la tâche suivante : il va écrire le message "L'utilisateur NOM_UTILISATEUR a comme UID UID_UTILISATEUR", pour chaque utilisateur existant sur la machine. NOM_UTILISATEUR et UID_UTILISATEUR seront bien entendu remplacé par le nom de l'utilisateur et son UID.

Le message en question sera écrit dans l'un des 3 fichiers différents :

  • users.txt si l'UID est compris entre 1000 et 1999 (inclus)

  • system_users.txt sur l'UI est strictement inférieur à 1000

  • other_users.txt pour les UID supérieurs ou égaux à 2000

Question

Écrivez le script permettant de réaliser cela.

Indice

On peut trouver la liste des utilisateurs et leur UID dans le fichier /etc/passwd.

Indice

La commande cut est très utile pour extraire des informations depuis du texte ayant un format bien défini.

Solution

On créé et rend exécutable un fichier defi.sh qui va contenir notre script.

1
#!/bin/bash
2
3
for entry in $(cat /etc/passwd | cut -d":" -f1,3)
4
do
5
  user=$(echo "$entry" | cut -d":" -f1)
6
  user_id=$(echo "$entry" | cut -d":" -f2)
7
  if [ $user_id -ge 1000 ] && [ $user_id -lt 2000 ]
8
  then
9
    echo "L'utilisateur $user a comme UID $user_id" >> users.txt
10
  elif [ $user_id -lt 1000 ]
11
  then
12
    echo "L'utilisateur $user a comme UID $user_id" >> system_users.txt
13
  else
14
    echo "L'utilisateur $user a comme UID $user_id" >> other_users.txt
15
  fi
16
done

Il y a différentes manières de faire, mais celle-ci est plutôt une bonne proposition. On commence par faire une boucle for sur toutes les entrées du fichier /etc/passwd, dont l'on extrait uniquement le nom d'utilisateur et l'UID grâce à cut.

Pour chaque entrée on récupère le nom d'utilisateur et son UID dans deux variables séparées, toujours grâce à cut.

On applique ensuite une condition sur l'UID :

  • si l'UID est compris entre 1000 (inclus) et 2000 (exclus) on écrit le message à l'aide d'une redirection dans le fichier users.txt

  • si l'UID est plus petit que 1000 on écrit le message à l'aide d'une redirection dans le fichier system_users.txt

  • sinon on écrit dans other_users.txt

On prends garde à écrire à l'aide de redirections >>, et non pas >, pour ne pas écraser le contenu des fichiers à chaque écriture.