Script shell AWK

Résolu
JC -  
 JC -
Bonjour,

je souheterais créer un fichier csv avec les champs :

serveur : user : group : date expiration : etat date expiration

j'ai créé un script avec une commande AWK qui récupère l'etat d'expiration des user à partir de /etc/shadow (en nombre de jour >0 ou <0)

par contre, pour les champs date d'expiration et group je galère.

dans /etc/shadow, la date d'expiration est notée en nombre de jours depuis 1970. Est-ce que je peux convertir ça en date ?
Sinon est-ce que je peux integrer la commande CHAGE dans AWK ?

Et pour le groupe, je pensais utiliser la commande id mais comment integrer ça dans le AWK ?

voila à quoi ressemble mon AWK pour l'instant :

jour=$((sec/86400))

awk -v "jour=$jour", -v "hostname=$hostname" -F ":" '{print $hostname":"$1": " $8-jour}' /etc/shadow

Merci pour votre aide !!!
A voir également:

10 réponses

jipicy Messages postés 41342 Statut Modérateur 4 896
 
Salut,

dans /etc/shadow, la date d'expiration est notée en nombre de jours depuis 1970. Est-ce que je peux convertir ça en date ?
Oui :
$ A="212814"
$ A=$(($A * 86400))
$ echo $A
18387129600
$ date -u -d "1970-01-01 $A seconds" +"%d-%m-%Y"
03-04-2008
Voir "info date" pour plus de détails...
0
JC
 
Merci c'est utile..

mais comment je peux faire intégrer la conversion pour chaque user de /etc/shadow dans mon AWK ?

merci
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
J'ai bien trouvé la syntaxe sous "awk" qui serait sensée permettre de faire la même chose que sous le shell "bash" avec la date, mais ça marche pas et je comprends pas pourquoi !!!
$ awk -F":" '/jp/ { print $8 }' fich.txt
212814

$ awk -F":" '/jp/ { print ($8 * 86400) }' fich.txt
1,83871e+10

$ awk -F":" '/jp/ { print strftime ( "%d-%m-%Y" , ($8 * 86400)) }' fich.txt
13-12-1901
Si on y colle la date du jour ça marche :
$ awk -F":" '/jp/ { print strftime ( "%d-%m-%Y" , systime()) }' fich.txt
18-01-2008
???

Si ça parle à quelqu'un, merci de me permettre de me coucher moins c*n ce soir ;-)))
0
JC
 
essaye sans espaces car chez moi ça marche !

voila le script qui marche

#!/bin/sh
sec=`date +%s`
jour=$((sec/86400))
FILE=/home/exec_cmd/expire2.tmp
hostname=`hostname`
echo $hostname
echo "" > $FILE
awk -v "jour=$jour" -F":" '$8 >0 {print $1 ":" $8-jour ":" strftime ( "%d-%m-%Y" , $8*86400)} $8 == "" {print $1 ":Jamais"}' /etc/shadow >> $FILE

Il me reste un dernier probleme c'est la récupération du groupe de chaque user (à integrer dans le AWK)...

en tout cas chapeau JP !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Même sans espace c'est pareil ;-(((
0
JC
 
et si tu copie/colle mon script et que tu le lances ?

(la variable FILE est à modifier)
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Ben c'est déjà fait, mais toujours pareil ;-((
0
dubcek Messages postés 19021 Statut Contributeur 5 637
 
le GID se trouve dans /etc/passwd, le nom du groupe dans /etc/group, donc je ferais:
awk -v "jour=$jour" -F":" 'BEGIN {while("cat /etc/passwd "|getline)pwd[$1]=$4} ; $8 >0 {print $1 ":" ......

et donc pwd[$1] c'est le GID, $1 étant le user
si je veux le nom du groupe
awk -v "jour=$jour" -F":" 'BEGIN {while("cat /etc/group "| getline)grp[$3]=$1 ; while("cat /etc/passwd "|getline)pwd[$1]=grp[$4]} ; $8 >0 {print $1 ":" ......

et donc pwd[$1] c'est le group_name
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Merci ;-))
0
dubcek Messages postés 19021 Statut Contributeur 5 637
 
On peut condenser la deuxième version:
awk -v "jour=$jour" -F":" 'BEGIN {while("cat /etc/group /etc/passwd "| getline)NF==4 ? grp[$3]=$1: pwd[$1]=grp[$4]} ; ....
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Thanks again ;-))
0
JC
 
Merci à tous ! ça marche nickel !
0