web-dev-qa-db-fra.com

Formatage de la sortie de date de la commande chage

Je souhaitais qu'un script avertisse visuellement les utilisateurs de mon système que leur mot de passe était sur le point d'expirer. J'ai trouvé celui-ci ici .

Le fait est que l'auteur de ce script obtient le nombre de jours nécessaires à l'expiration du mot de passe en convertissant les dates en secondes, en soustrayant puis en passant de secondes à jours.

Le problème est que mon système affiche ces dates en tant que "08 août 2018" (pour aujourd'hui). Si je m'en tiens à l'utilisation de la commande de date pour la conversion de la date en secondes comme l'auteur l'a fait, j'obtiens une erreur: date invalide 'il y a 08 août 2018'.

De l'aide?

Voici le script complet:

#! /bin/bash
# Issue a desktop notification if the user password is about to expire
# Uses the "chage" command frome the "passwd" package (likely installed)
# Best added to the session startup scripts

# get password data in array
saveIFS=$IFS
IFS=$'\n'
chagedata=( $(chage -l $USER | cut -d ':' -f 2 | cut -d " " -f 2-) )    
IFS=$saveIFS

# obtain times in seconds
now=$(date +%s)
expires=$(date +%s -d "${chagedata[1]}")

# compute days left (roughly...)
daysleft=$(( ($expires-$now)/(3600*24) ))
echo "Days left: $daysleft" 
# leave some evidence that the script really ran at startup
echo "Days left: $daysleft" > /var/tmp/$(basename $0).out

# determine and send the notification (stays mute if outside the warning period) 
if [[ $daysleft -le 0 ]]
then
    notify-send -i face-worried.png -t 0 "Password expiration" "Your password expires within a day"'!' 
Elif [[ $daysleft -le ${chagedata[6]} ]]
then
    notify-send -i face-smirk.png -t 0 "Password expiration" "Your password expires in $daysleft days."
fi
2
Roman Rdgz

Selon date ' documentation , l'entrée doit être au format indépendant des paramètres régionaux . Ils suggèrent d'utiliser LC_TIME=C pour produire une sortie de date indépendante des paramètres régionaux. Dans votre cas, vous devrez ajouter la commande chage pour lui donner une chaîne de date que date pourra analyser:

chagedata=( $(LC_TIME=C chage -l $USER | cut -d ':' -f 2 | cut -d " " -f 2-) )
4
danzel