列出所有指定的Unix组中的用户

有一个简单的方法来获取所有指定中的用户列表吗?

例如,如果我有以下用户:

fred - rainbow, dell jane - hp zippy - rainbow, hp, dell george - hp, dell bungle - rainbow, hp, dell 

我想这样的东西:

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

即返回dell和hp中的用户。

如果它是多个步骤就没有问题,但如果不需要使用大量的Bash黑魔法,那么这个步骤实际上是不可能的,而且在启用了RE的文本编辑器中也可以更快。

如果这有什么区别的话,我正在RHEL4上运行。

我不知道这样做的任何工具,但脚本很容易。

首先获取系统上的用户列表,然后在每个groups上运行groups ,然后在所需的groups上运行grep

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

这适用于两个小组:

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

把它放在一个有一些修改的函数中,它可以处理任意数量的组:

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

运行:

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

一个主要由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" }' } 

小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 

testing:

 # 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 

一个bash解决scheme,每行只有一个用户,并且只打印唯一的组。 正常的输出是每行一行,使用-c输出以逗号分隔的输出。

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

示例输出:

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

使用-c

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