Rechercher : dans
Par :

Script shell AWK

Dernière réponse le 23 jan 2008 à 10:02:38 JC, le 18 jan 2008 à 11:41:52 
 Signaler ce message aux modérateurs

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 !!!

Configuration: Windows XP
Firefox 2.0.0.11

Meilleures réponses pour « Script shell AWK » dans :
Exécuter un script shell VoirExécution d'un script Pour pouvoir exécuter un script ou un programme en ligne de commande il y a plusieurs possibilités : 1. Le chemin absolu 2. Le chemin relatif 3. Modifier la variable PATH Note: Le Sha...

1

jipicy, le 18 jan 2008 à 13:24:32

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...

Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

2

JC, le 18 jan 2008 à 13:40:21

Merci c'est utile..

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

merci

Répondre à JC

3

jipicy, le 18 jan 2008 à 14:59:17

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 ;-)))

Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

4

JC, le 18 jan 2008 à 15:46:41

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 !

Répondre à JC

5

jipicy, le 18 jan 2008 à 16:21:18

Même sans espace c'est pareil ;-(((

Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

6

JC, le 18 jan 2008 à 16:42:16

Et si tu copie/colle mon script et que tu le lances ?

(la variable FILE est à modifier)

Répondre à JC

7

jipicy, le 18 jan 2008 à 16:43:18

Ben c'est déjà fait, mais toujours pareil ;-((

Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

8

dubcek, le 19 jan 2008 à 15:55:21

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

Répondre à dubcek

9

jipicy, le 19 jan 2008 à 18:52:37

Merci ;-))

Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

10

dubcek, le 20 jan 2008 à 09:10:00

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]} ; ....

Répondre à dubcek

11

jipicy, le 20 jan 2008 à 10:26:20

Thanks again ;-))

Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

12

 JC, le 23 jan 2008 à 10:02:38

Merci à tous ! ça marche nickel !

Répondre à JC