IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

liste de comptes doublons (cron)


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 65
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 65
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 65
    Par défaut
    j'en suis la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 65
    Par défaut
    fini en faite fallait juste pas laisser le fichier script dans le meme repertoire sinon il se traite aussi

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 731
    Par défaut
    Bonjour,

    Code non testé : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    ...
    ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 65
    Par défaut
    execution avec set -x il bloque ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour,

    Est-ce que ce code fonctionne? Je ne peux pas le tester ou je suis...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Citation Envoyé par jmelyn Voir le message
    Bonjour,

    Est-ce que ce code fonctionne? Je ne peux pas le tester ou je suis...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 731
    Par défaut oups
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for file in $Le_Repertoire/*

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 65
    Par défaut
    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

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 731
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  12. #12
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fichier_source
    <espace><espace>ligne1_champ1<espace>ligne1_champ2
    ligne2_champ1<espace>ligne2_champ2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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>.

Discussions similaires

  1. [VBA-E] Liste unique sans doublon
    Par MatMeuh dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/07/2007, 11h39
  2. Manipulation de listes (moyenne de doublons)
    Par BaBoU_77 dans le forum Prolog
    Réponses: 4
    Dernier message: 06/06/2007, 02h44
  3. [Formulaire]liste déroulante sans doublon
    Par kovrov dans le forum IHM
    Réponses: 15
    Dernier message: 01/04/2007, 21h09
  4. [Formulaire]Liste déroulante sans doublons
    Par frevale dans le forum IHM
    Réponses: 2
    Dernier message: 22/03/2007, 22h54
  5. Réponses: 3
    Dernier message: 24/04/2006, 20h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo