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

列出所有指定的 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 上运行。

答案1

我不知道有任何工具可以做到这一点,但是编写脚本很容易。

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

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

答案2

此功能可同时适用于两个组:

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 d i; d=", "
            }; 
            printf "\n"  }'
}

答案3

小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

测试:

# 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

答案4

一种 bash 解决方案,每行包含多个用户,并且仅打印唯一组。正常输出是每行一个组,用于-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

相关内容