有没有一种简单的方法可以获取用户列表全部指定群体?
例如,如果我有以下用户:
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