Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 08/02/2010, 09h56   #1
Invité régulier
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 7
Points : 7
Par défaut liste de comptes doublons (cron)

Bonjour à tous,

avec la commande uniq je n'arrive pas a sortir quelques choses de propres de cette liste pour insérer les vrai compte comme (pas comme - , cron , Poller )
dans le fichier cron.allow si il n'y sont pas deja.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 
 
 
 
 
cron
 
 
-
nagios
 
 
nagios
 
 
 
 
cron
 
 
 
nagios
 
Poller
nagios
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
de
nagios
 
donnees
nagios
 
root
root
root
 
 
root
root
pour l'instant j'en suis ici :

Code :
1
2
3
 
cd /etc/cron.d/
for i in *; do cat $i | awk -F " " '{print $6}'; done >> liste.txt
il existe une autre commande mieux que uniq pour faire ça ?

merci d'avance
zorooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 10h26   #2
Invité régulier
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 7
Points : 7
Code :
1
2
 
for i in *; do cat $i | awk -F " " '{print $6}'; done | sed '/^$/d' | awk '!($1 in a);{a[$1]}' >> liste.txt
maintenant il faut que je test si chaque ligne est un vrai utilisateur avec passwd et l'inserer dans cron.allow si il n'y est pas deja...
zorooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 11h31   #3
Invité régulier
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 7
Points : 7
j'en suis la :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
for i in *; do cat $i | awk -F " " '{print $6}'; done | sed '/^$/d' | awk '!($1 in a);{a[$1]}' >> liste.tmp
 
awk -F ":" '{print $1}' /etc/passwd >> liste-reel-user.tmp
 
for z in `cat liste.tmp`; do grep $z liste-reel-user.tmp; done >> user-futur-cron.tmp
 
for z in `cat user-futur-cron.tmp`
do
if ! grep $z cron.allow
then
 echo $z >> cron.allow
else
 echo lol >> /dev/null
fi
done
ça marche mais y a un petit bug avec un user "shutdown" qui traine et se retrouve dans mon cron.allow alors qu'il a rien a y foutre.
zorooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 12h08   #4
Invité régulier
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 7
Points : 7
fini en faite fallait juste pas laisser le fichier script dans le meme repertoire sinon il se traite aussi
zorooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 12h25   #5
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 896
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 896
Points : 3 676
Points : 3 676
Bonjour,

Code non testé :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

Le_Repertoire=/path/repertoire
users=( $(cut -d':' -f1 /etc/passwd | sort) )
for file in $Le_Repertoire
do while read senfout senfout senfout senfout senfout SENFOUTPAS senfout
   do y_est=0
      for user in "${users[@]}"
      do [ "$user" = "$SENFOUTPAS" ] && y_est=1
      done
   done
   [ $y_est -eq 0 ] && echo $SENFOUTPAS >> cron.allow
   done < <(sort -u $file)
done
...
?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 14h14   #6
Invité régulier
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 7
Points : 7
execution avec set -x il bloque ici :

Code :
1
2
3
4
5
6
7
8
 
+ Le_Repertoire=/etc/cron.d/
+ users=($(cut -d':' -f1 /etc/passwd | sort))
++ cut -d: -f1 /etc/passwd
++ sort
++ sort -u
+ for file in '$Le_Repertoire'
+ read senfout senfout senfout senfout senfout SENFOUTPAS senfout
zorooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 14h18   #7
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
Bonjour,

Est-ce que ce code fonctionne? Je ne peux pas le tester ou je suis...
Code :
1
2
awk '/^[0-9]/ {print $6}' /etc/cron.d/* | sort -u > /tmp/cron.users
awk -F ':' {print $1}' /etc/passwd | join - /tmp/cron.users > /etc/cron.d/cron.allow
__________________
Un problème bien posé est déjà résolu (H. Bergson).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 14h42   #8
Membre habitué
 
Inscription : mai 2007
Messages : 138
Détails du profil
Informations personnelles :
Âge : 59

Informations forums :
Inscription : mai 2007
Messages : 138
Points : 108
Points : 108
Citation:
Envoyé par jmelyn Voir le message
Bonjour,

Est-ce que ce code fonctionne? Je ne peux pas le tester ou je suis...
Code :
1
2
awk '/^[0-9]/ {print $6}' /etc/cron.d/* | sort -u > /tmp/cron.users
awk -F ':' {print $1}' /etc/passwd | join - /tmp/cron.users > /etc/cron.d/cron.allow
manque une quote
Code :
1
2
awk '/^[0-9]/ {print $6}' /etc/cron.d/* | sort -u > /tmp/cron.users
awk -F ':' '{print $1}' /etc/passwd | join - /tmp/cron.users > /etc/cron.d/cron.allow
noooop est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 15h08   #9
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 896
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 896
Points : 3 676
Points : 3 676
Par défaut oups

Code :
for file in $Le_Repertoire/*
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 15h42   #10
Invité régulier
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 7
Points : 7
il manque pas grand chose pour que ça fonctionne mais y a des drole de truc il oubli des utilisateurs et ne rempli pas le cron.allow, a mon avis tu es pas loin et y a moins de ligne que l'usine a gaz que j'ai fais
zorooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 22h08   #11
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 896
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 896
Points : 3 676
Points : 3 676
Citation:
Envoyé par zorooo
Il manque pas grand chose pour que ça fonctionne mais y a des drole de truc il oubli des utilisateurs et ne rempli pas le cron.allow, a mon avis tu es pas loin et y a moins de ligne que l'usine a gaz que j'ai fais
Tu parles, Charles !
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash

NOM="${0##*/}"
allowed="cron.allow"
REP="/path/repertoire"

#[ -f "$allowed" ] && rm "$allowed"

users=( $(cut -d':' -f1 /etc/passwd | sort) )

for file in $REP/*; do
   # l'exclusion du script n'est sans doute pas nécessaire
   if [ -f "$file" -a ! "${file##*/}" = "$allowed" -a ! "${file##*/}" = "$NOM" ]; then
      while read senfout senfout senfout senfout senfout SENFOUTPAS senfout; do
         for user in "${users[@]}"; do

            if [ "$SENFOUTPAS" = "$user" -a ! -f "$allowed" ]; then
               echo "$SENFOUTPAS" >> "$allowed"
            elif [ "$SENFOUTPAS" = "$user" -a -f "$allowed" ]; then

               # SENFOUTPAS ne doit pas non plus déjà être dans cron.allow
               while read line; do
                  y_est=0
                  if [ "$SENFOUTPAS" = "$line" ]; then
                     y_est=1
                     break
                  fi
               done < "$allowed"

               [ "$y_est" -eq 0 ] && echo "$SENFOUTPAS" >> "$allowed"
            fi

         done
      done < <(sort -u "$file")
   fi
done

sort "$allowed"
La solution de jmelyn semble incontestablement meilleure.
Je me demande si un simple cut, ne serait pas plus "économique" que awk...
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2010, 08h42   #12
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
Bonjour,

J'ai utilise awk par habitude, mais dans ce cas precis (fichier /etc/passwd parfaitement structure) la commande cut irait tres bien. La difference est que awk est plus intelligent: C'est le nombre de champs qui est compte, pas le nombre de separateurs. Exemple:
Code :
1
2
3
fichier_source
<espace><espace>ligne1_champ1<espace>ligne1_champ2
ligne2_champ1<espace>ligne2_champ2
Code :
1
2
3
4
5
6
7
8
commandes:
cut -d ' ' -f 1 fichier_source

ligne2_champ1

awk '{print $1}' fichier_source
ligne1_champ1
ligne2_champ1
Ici cut affichera <espace> en premiere ligne, tandis que awk affichera le premier champ non separateur, c'est-a-dire ligne1_champ1. Cette difference permet aux scripts d'etre plus robustes si jamais un espace additionnel, pas tres detectable a la lecture, est ajoute par erreur.

Edit: J'ai oublie de preciser que ce fonctionnement n'est valide qu'avec le separateur <espace>.
__________________
Un problème bien posé est déjà résolu (H. Bergson).

Dernière modification par jmelyn ; 09/02/2010 à 10h28.
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 17h37.


 
 
 
 
Partenaires

Hébergement Web