(modifié le 20 septembre 2017 à 2:19)

Voici une astuce rapide qui permet de lister la dates de changement du dernier mot de passe d'un compte systèmes ou utilisateur sous GNU/Linux au travers d'un script bash.

Je vais parler de la date de l'expiration du mot de passe, à ne pas confondre avec la date d'expiration du compte utilisateur.

L'origine du besoin

Sur un serveur Debian j'ai ajouté plusieurs utilisateurs. Tous ces utilisateurs ont été créés comme appartenant au même groupe primaire (GID) et disposent du même répertoire personnel /home/coucou qui contient un lien symbolique vers un script.

Je fais expirer immédiatement le mot de passe du compte :

passwd -e mon_utilisateur

La date prend la valeur du 01/01/1970.

Ce qui a pour effet de forcer chaque utilisateur à changer son mot de passe à la première connexion. La date de modification du mot de passe est alors mise à jour avec celle du jour lors du changement de mot de passe.

Grâce à cette information je sais si chaque utilisateur utilise le compte mis à sa disposition ou non. Si ce n'est pas le cas après 30j je supprime manuellement les comptes inutilisés.

Je peux donc me baser sur la date de dernière modification du mot de passe afin de savoir si l'utilisateur a utilisé son compte ou non.

Le champ de trouve dans la colonne 3 :

passwd -S bm
bm P 09/12/2017 0 99999 7 -1

Attention format anglais : mm/jj/aaaa.

Le script

Et voici le script qui parcourt /etc/passwd et exécute la commande passwd pour chaque entrée pour récupérer le statut du compte utilisateur

#!/bin/bash
# Author: Mr Xhark (@xhark)
# License : Creative Commons http://creativecommons.org/licenses/by-nd/4.0/deed.fr

# Couleurs
COUL_RESET="\033[0m"
COUL_ROUGE="\033[1;31m"

echo -e "\nVoici les dates du dernier changement de mdp :\n";

for i in `grep /home/coucou /etc/passwd |  awk -F : '{print $1}'`
  do
     COUL=""
     DATE_EXP=$(passwd -S $i |  awk -F " " '{printf $3}')
     if [[ $DATE_EXP == "01/01/1970" ]]; then
        COUL=$COUL_ROUGE
     fi
     echo -e "\t${COUL}expiration le $DATE_EXP pour le compte ${i} ${COUL_RESET}"
  done

echo -e "\n" && exit 0

Dans mon cas je filtre sur le répertoire personnel (homedir) commun à tous les utilisateurs car je me fiche des utilisateurs systèmes.

Tous les comptes dont dont la date de dernier changement de mot de passe est égale au 01/01/1970 sont ceux qui ne se sont jamais connectés, ils sont affichés en rouge.

Conclusion

C'est simple mais pratique et visuel pour repérer les comptes à supprimer par la suite. Vous pouvez jouer avec "grep -v" pour exclure des comptes particuliers, ou bien lire l'id et n'afficher que ceux supérieurs à 1000 par exemple.

Auteur : Mr Xhark

Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter