Elenca gli utenti in tutti i gruppi unix specificati

C'è un modo semplice per get un elenco di utenti che si trovano in tutti i gruppi specificati?

Ad esempio, se ho i seguenti utenti:

  • Quali sono le principali differenze tra Linux e FreeBSD dal punto di vista sysadmin?
  • Soddisfazione degli utenti con supporto IT
  • Utenti di prigionia in una directory
  • Windows dispone di collegamenti symlinks?
  • Migrazione di utenti tra i server Linux se gli UID devono cambiare?
  • Distride critiche (Unixlike) per Sysadmin speranza di avere esperienza con
  • fred - rainbow, dell jane - hp zippy - rainbow, hp, dell george - hp, dell bungle - rainbow, hp, dell 

    Vorrei qualcosa di simile:

     [me@box ~]$ magic "dell,hp" zippy, george, bungle 

    vale a dire il return degli utenti che si trovano sia in dell e hp.

    Se si tratta di passi multipli che va bene, anche se non è realmente ansible senza wherer ricorrere a un sacco di magia nera di Bash, ed è più veloce farlo in un editor di text abilitato a RE che va bene.

    Sto funzionando su RHEL4 se questo fa la differenza.

  • Minima serie di diritti per eseguire un process su un server Microsoft Windows
  • 4 Solutions collect form web for “Elenca gli utenti in tutti i gruppi unix specificati”

    Non conosco alcun attrezzo facendo questo, ma è facile da scrivere.

    Inizialmente ottieni l'elenco degli utenti sul sistema, quindi esegui i groups su ognuno e alla fine, grep nei gruppi desiderati:

     getent passwd | sed 's/:.*$//g' | \ while read user; do groups $user; done | \ grep group1 | grep group2 

    Questo funziona per due gruppi alla volta:

     getent group dell hp | cut -d: -f 4 | tr , '\n' | sort | uniq -d | sed ':a;$s/\n/, /g;N;ba' 

    Metterlo in una function con alcune modifiche e gestirà qualsiasi numero di gruppi:

     grmagic () { getent group "$@" | cut -d: -f 4 | tr , '\n' | sort | uniq -dc | grep "^[[:blank:]]*$#" | awk '{all = all d $3; d = ", "} END {print all}' } 

    Eseguirlo:

     $ grmagic dell hp zippy, george, bungle $ grmagic dell hp rainbow zippy, bungle 

    Una function che consiste principalmente di uno script AWK:

     grmagic () { getent group "$@" | awk -F: -v "c=$#" '{ split($4, a, ","); for (i in a) n[a[i]]++ } END { for (i in n) if (n[i] == c) { printf di; d=", " }; printf "\n" }' } 

    Piccolo script python:

     #!/usr/bin/python import subprocess,sys group={} for user in sys.argv[1:]: group[user] = set(subprocess.Popen("id -nG %s"%user, stdout=subprocess.PIPE, shell=True).stdout.read().split()) for g in group[sys.argv[1]] & group[sys.argv[2]]: print g 

    Test:

     # id user1 uid=1001(user1) gid=1001(user1) groups=1001(user1),1004(us1),1005(dell) # id user2 uid=1002(user2) gid=1002(user2) groups=1002(user2),1004(us1),1005(dell) # ./test.py user1 user2 dell us1 

    Una soluzione bash che richiede più di 1 utente per linea e printing solo gruppi unici. L'output normale è un groppo per linea, usa -c per get l'output separato da virgole.

     #!/bin/bash \unalias -a if [ $# -lt 1 ] then echo "Need at least one user" 1>&2 fi RESULT='' COMMA=0 while [ $# -gt 0 ] do if [ $1 == '-c' ] then COMMA=1 else RESULT="$RESULT $(id -Gn $1)" fi shift done if [ $COMMA -eq 0 ] then echo $RESULT |tr ' ' '\n'| sort -u else echo $RESULT |tr ' ' '\n' | sort -u |tr '\n' ', ' |sed 's/.$//g' echo fi 

    Esempio di output:

     # ./magic.sh coredump mongodb audio cdrom coredump dialout floppy lpadmin mongodb netdev nogroup plugdev powerdev video 

    Utilizzo di -c :

     # ./magic.sh -c coredump mongodb audio,cdrom,coredump,dialout,floppy,lpadmin,mongodb,netdev,nogroup,plugdev,powerdev,video 
    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.