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 :

Lister et utiliser les utilisateurs d'un groupe


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 17
    Par défaut Lister et utiliser les utilisateurs d'un groupe
    Bonjour à tous,

    J'explique mon problème :

    j'ai actuellement 1 groupe que l'on va nommer "groupe1" qui possède plusieurs utilisateurs (user1, user2 et user3)

    Je dois créer un script sous linux qui me permet de récupérer la liste des utilisateurs du groupe groupe1 et pour chaque utilisateur, exécuter une suite d'action.

    j'ai déjà vérifier qu'une commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat /etc/group |grep groupe1
    me renvoie bien la ligne associée au groupe1 du fichier /etc/group. Mais j'aimerai tirer de cette commande uniquement la liste des utilisateurs et pouvoir réaliser pour chaque utilisateur plusieurs action

    Merci d'avance pour vos conseils et réponses!!

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Tu aurais pu faire plus simple que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat /etc/group |grep groupe1
    en laissant tomber le cat inutile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep groupe1 /etc/group
    Mais problème si tu as aussi un groupe nommé groupe10, ca ne marche plus. Le code suivant est meilleur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -w groupe1 /etc/group
    mais les groupes peuvent être définis ailleurs que dans /etc/group.

    Cette commande gère toutes les sources pour la base group:
    mais il subsiste un autre problème, seuls les utilisateurs dont le groupe group1 est un groupe secondaire seront listés. Si tu veux aussi ceux dont c'est le groupe primaire, il faudra regarder chaque entrée utilisateur dans la base passwd.

    Voilà quelque chose qui devrait régler les problèmes évoqués ci-dessus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for user in $(g=$1
    gid=$(getent group $1 | awk -F : '{print $3}')
    (
      getent group $1 | awk -F : '{gsub(","," ",$4);print $4}'
      getent passwd | awk -F : -v gid=$gid '$3==gid {print $1}'
    ) | sort -u )
    do
      echo user=$user
    done

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 17
    Par défaut
    Merci pour ta réponse,

    Effectivement on s'approche de la réponse, cependant, j'ai créé 2 utilisateurs au groupe groupe1 et lorsque j'exécute ton code, il me les trouve pas.

    J'ai alors exécuté la commande :

    et effectivement je n'ai pas les nouveaux utilisateurs d'affiché....

    Pourtant quand je vais dans la gestion des utilisateurs, j'ai bien mes nouveaux utilisateurs qui appartiennent tout deux au groupe groupe1.

    Est ce que j'ai loupé un truc?

    Je n'arrive d'ailleurs pas trop à comprendre ce qui se passe dans la partie de code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    gid=$(getent group $1 | awk -F : '{print $3}')
    (
      getent group $1 | awk -F : '{gsub(","," ",$4);print $4}'
      getent passwd | awk -F : -v gid=$gid '$3==gid {print $1}'
    ) | sort -u )
    je me doute que cela doit renvoyer l'id du groupe passé en paramètre du script, et encore j'en suis pas certain....

    J'ai vérifié et dans le fichier /etc/passwd il y a bien mes nouveaux utilisateurs. Mais pas moyen que le code que tu as fourni me les trouve....

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mistertiger29 Voir le message
    Effectivement on s'approche de la réponse, cependant, j'ai créé 2 utilisateurs au groupe groupe1 et lorsque j'exécute ton code, il me les trouve pas.

    J'ai alors exécuté la commande :

    et effectivement je n'ai pas les nouveaux utilisateurs d'affiché....

    Pourtant quand je vais dans la gestion des utilisateurs, j'ai bien mes nouveaux utilisateurs qui appartiennent tout deux au groupe groupe1.

    Est ce que j'ai loupé un truc?
    Bonjour

    Les groupes reliés à un utilisateur se trouvent à 2 endroits
    1) dans le fichier /etc/passwd, sur la ligne correspondant à l'user, il y a son id de groupe en position 4.
    2) dans le fichier /etc/group, chaque groupe mentionne les users qui sont invités chez-lui. Mais il ne mentionne pas les users qui sont de son groupe (parce que l'info se trouve déjà dans /etc/passwd)

    Exemple: tu as le groupe user:x:200: et le groupe admin:x:100:.
    Tu crées un utilisateur "toto" de groupe "user". Tu auras alors, dans /etc/passwd, la ligne suivante: toto:x:123:200:...:/home/toto:/bin/bash.
    Toutefois, à ce niveau là, rien ne change dans /etc/group. La référence "200" permet de savoir que toto est de groupe "user".

    Maintenant tu décides que "toto", tout en restant user, sera aussi invité de "admin". A ce moment là, tu modifies dans /etc/group la ligne admin qui devient la suivante: admin:x:100:toto.

    Ainsi c'est en associant les deux fichiers qu'on peut savoir que toto est groupe "user" mais qu'il est aussi membre du groupe "admin".

    Au niveau des droits, c'est automatique. Si un fichier est du groupe "admin" alors toto y aura automatiquement accès selon les droits "g" (et non "o"). De même pour un fichier du groupe "user". A ce niveau là, on peut dire que toto est autant "user" que "admin".
    Là où il y a une différence, c'est quand toto crée un fichier. Le fichier créé (ne pouvant avoir qu'un seul groupe) prendra le groupe principal de toto, à savoir "user".

    Citation Envoyé par mistertiger29 Voir le message
    je me doute que cela doit renvoyer l'id du groupe passé en paramètre du script, et encore j'en suis pas certain....
    Ben en général on écrit un script pour qu'il réponde à ce qu'on veut ; on ne fait pas l'inverse (regarder si ce que l'on veut correspond au script)...

    Citation Envoyé par mistertiger29 Voir le message
    Je dois créer un script sous linux qui me permet de récupérer la liste des utilisateurs du groupe groupe1 et pour chaque utilisateur, exécuter une suite d'action.
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
     
    for group
    do
    	info=$(getent group $group)
    	gid=$(echo $info |cut -f3 -d:)
    	guest=$(echo $info |cut -f4 -d:)
     
    	for user in $(cut -f1,4 -d: /etc/passwd |grep ":$gid$" |cut -f1 -d:; echo $guest |sed -e "s/,/ /g")
    	do
    		echo "$user"
    	done
    done
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par mistertiger29 Voir le message
    Effectivement on s'approche de la réponse, cependant, j'ai créé 2 utilisateurs au groupe groupe1 et lorsque j'exécute ton code, il me les trouve pas.
    As-tu créé un script contenant mon code ?
    Lui as-tu bien passé "groupe1" en paramètre ?
    N'a-t-il vraiment rien affiché ?
    Tu peux ajouter set -x au début du script pour voir ce qui se passe.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 17
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    As-tu créé un script contenant mon code ?
    Lui as-tu bien passé "groupe1" en paramètre ?
    Oui j'ai créé un script contenant ton code et je l'ai exécuté en passant en paramètre le nom du groupe dont je veux récupérer ses utilisateurs.

    Citation Envoyé par jlliagre Voir le message
    N'a-t-il vraiment rien affiché ?
    Si il affiche bien 1 utilisateur qui appartient bien au groupe mais pas tous

    Citation Envoyé par jlliagre Voir le message
    Tu peux ajouter set -x au début du script pour voir ce qui se passe.
    Je vais essayer et je vous tiens au courant.

    Citation Envoyé par Sve@r Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
     
    for group
    do
    	info=$(getent group $group)
    	gid=$(echo $info |cut -f3 -d:)
    	guest=$(echo $info |cut -f4 -d:)
     
    	for user in $(cut -f1,4 -d: /etc/passwd |grep ":$gid$" |cut -f1 -d:; echo $guest |sed -e "s/,/ /g")
    	do
    		echo "$user"
    	done
    done
    J'ai créé un script en modifiant un poil ton code et en effet cela à l'ai de faire ce que je souhaite. J'ai juste enlevé la première boucle for et remplacé le $group par $1 car le groupe dont je souhaite récupérer les utilisateurs sera passé en paramètre.
    De plus j'ai un utilisateur qui est invité du groupe groupe1 et aussi y fait partie :

    dans /etc/passwd j'ai : operatorEwss:503:506::/home/operatorEwss:/bin/bash
    et dans /etc/group j'ai : operatorEwss:506:operatorEwss

    Du coup le scipt me renvoie 2 fois l'utilisateur operatorEwss.
    Or les utilisateurs que je vais rajouter, appartiendront au groupe operatorEwss (groupe et utilisateur), c'est à dire que cela sera leur groupe primaire dans tous les cas.
    Je me disais donc que le code ci dessous devrait suffir.... Dites moi je me trompe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    info=$(getent group $1)
    gid=$(echo $info |cut -f3 -d:)
     
    for user in $(cut -f1,4 -d: /etc/passwd |grep ":$gid$" |cut -f1 -d:)
    do
    	echo "$user"
    done
    Merci de votre aide à tous les deux

  7. #7
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par mistertiger29 Voir le message
    J'ai juste enlevé la première boucle for et remplacé le $group par $1 car le groupe dont je souhaite récupérer les utilisateurs sera passé en paramètre.
    C'est un changement inutile car c'est ce que faisait déjà le for du script de Sve@r.

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mistertiger29 Voir le message
    J'ai créé un script en modifiant un poil ton code et en effet cela à l'ai de faire ce que je souhaite. J'ai juste enlevé la première boucle for et remplacé le $group par $1 car le groupe dont je souhaite récupérer les utilisateurs sera passé en paramètre.
    C'est ce que faisait ma boucle. Sauf que elle, elle traitait n groupes l'un après l'autre alors que toi tu n'en traites qu'un seul !!!
    Faudrait quand-même que tu apprennes les bases des structures shell...

    Citation Envoyé par mistertiger29 Voir le message
    dans /etc/passwd j'ai : operatorEwss:x:503:506::/home/operatorEwss:/bin/bash.
    et dans /etc/group j'ai : operatorEwss:x:506:operatorEwss.
    Du coup le scipt me renvoie 2 fois l'utilisateur operatorEwss.
    Oui c'est vrai que je n'avais pas envisagé cette config. Pas grave, suffit de filtrer le résultat
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
     
    for group
    do
    	info=$(getent group $group)
    	gid=$(echo $info |cut -f3 -d:)
    	guest=$(echo $info |cut -f4 -d:)
     
    	for user in $(cut -f1,4 -d: /etc/passwd |grep ":$gid$" |cut -f1 -d:; echo $guest |sed -e "s/,/ /g")
    	do
    		echo "$user"
    	done |uniq # (ou done |sort -u si on les veut en plus triés)
    done
    Hé oui, le shell n'est fait que de briques. Tu veux une action en plus ? Tu rajoutes au bon endroit la bonne brique...

    Citation Envoyé par mistertiger29 Voir le message
    Je me disais donc que le code ci dessous devrait suffir.... Dites moi je me trompe.
    J'en sais rien. Quand tu fais un script, ben j'espère que tu le testes aussi... et dans différentes configurations...
    Le tien utilise le awk à outrance. Or si le awk est un très bon outil, c'est aussi un outil très lourd. Certains aiment bien essayer d'arriver au résultat en n'utilisant que les outils pile-poils adaptés à l'action (éviter d'écraser une souris à la catapulte par exemple)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par mistertiger29 Voir le message
    Je n'arrive d'ailleurs pas trop à comprendre ce qui se passe dans la partie de code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    gid=$(getent group $1 | awk -F : '{print $3}')
    (
      getent group $1 | awk -F : '{gsub(","," ",$4);print $4}'
      getent passwd | awk -F : -v gid=$gid '$3==gid {print $1}'
    ) | sort -u )
    je me doute que cela doit renvoyer l'id du groupe passé en paramètre du script, et encore j'en suis pas certain....
    Non, ça renvoie les noms des utilisateurs membres du groupe dont le nom est passé en paramètre.

    Revoici mon code légèrement amélioré et surtout avec des commentaires:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for user in $(
    # récupération dans gid de l'identifiant de groupe (3eme champs dans la base group) correspondant au nom de groupe passé en paramètre
    gid=$(getent group $1 | awk -F : '{print $3}'| head -1)
    (
      # affichage de la liste des membres du groupe (4eme champs), suppression du séparateur virgule 
      getent group $1 | awk -F : '{gsub(","," ",$4);print $4}'
      # affichage des noms des utilisateurs dont le groupe primaire est celui recherché
      getent passwd | awk -F : -v gid=$gid '$3==gid {print $1}'
    ) | sort -u ) # classement par ordre alphabétique des noms précédement trouvés et suppression des éventuels doublons
    do # boucle sur chaque nom d'utilisateur membre du groupe
      echo user=$user
    done
    Et sa sortie avec le même contenu que toi dans les fichiers group et passwd pour le nom recherché:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ grep operatorEwss /etc/passwd /etc/group
    /etc/passwd:operatorEwss:x:503:506::/home/operatorEwss:/bin/bash
    /etc/group:operatorEwss:x:506:operatorEwss,jlliagre
    $ ./go operatorEwss
    user=operatorEwss
    user=jlliagre
    $

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lister les utilisateurs d'un groupe AD
    Par Represente37 dans le forum VBScript
    Réponses: 0
    Dernier message: 17/02/2012, 14h17
  2. [Débutant] Lister les utilisateur d'un groupe ACTIVE DIRECTORY
    Par FromHell04 dans le forum VB.NET
    Réponses: 0
    Dernier message: 01/02/2012, 18h23
  3. LDAP Active directory récupérer les utilisateurs d'un groupe
    Par *alexandre* dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 19/01/2012, 09h58
  4. recherche code pour limiter une lister et utiliser les bouton suivant precedent
    Par carmen256 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/09/2006, 17h43

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