如何在Linux(可能还有其他unix)中列出一个组的所有成员?
当前回答
下面的shell脚本将遍历所有用户,并只打印属于给定组的用户名:
#!/usr/bin/env bash
getent passwd | while IFS=: read name trash
do
groups $name 2>/dev/null | cut -f2 -d: | grep -i -q -w "$1" && echo $name
done
true
使用的例子:
./script 'DOMAIN+Group Name'
注意:此解决方案将检查NIS和LDAP中的用户和组(不仅仅是passwd和group文件)。它还将考虑未添加到组但已将组设置为主组的用户。
编辑:为用户不属于同名组的罕见场景添加了修复。
编辑:以shell脚本的形式编写;根据@Max Chernyak aka hakunin的建议,添加了true以0状态退出;为了跳过那些偶然的组,丢弃了stderr:找不到组ID xxxxxx的名称。
其他回答
下面是一个脚本,返回/etc/passwd和/etc/group中的用户列表 它不检查NIS或LDAP,但它显示了将该组作为默认组的用户 在Debian 4.7和solaris 9上测试
#!/bin/bash
MYGROUP="user"
# get the group ID
MYGID=`grep $MYGROUP /etc/group | cut -d ":" -f3`
if [[ $MYGID != "" ]]
then
# get a newline-separated list of users from /etc/group
MYUSERS=`grep $MYGROUP /etc/group | cut -d ":" -f4| tr "," "\n"`
# add a newline
MYUSERS=$MYUSERS$'\n'
# add the users whose default group is MYGROUP from /etc/passwod
MYUSERS=$MYUSERS`cat /etc/passwd |grep $MYGID | cut -d ":" -f1`
#print the result as a newline-separated list with no duplicates (ready to pass into a bash FOR loop)
printf '%s\n' $MYUSERS | sort | uniq
fi
或者作为一行程序,您可以直接从这里剪切和粘贴(在第一个变量中更改组名)
MYGROUP="user";MYGID=`grep $MYGROUP /etc/group | cut -d ":" -f3`;printf '%s\n' `grep $MYGROUP /etc/group | cut -d ":" -f4| tr "," "\n"`$'\n'`cat /etc/passwd |grep $MYGID | cut -d ":" -f1` | sort | uniq
getent group insert_group_name_here | awk -F ':' '{print $4}' | sed 's|,| |g'
这将返回一个空格分隔的用户列表,我曾在脚本中使用该列表填充数组。
for i in $(getent group ftp | awk -F ':' '{print $4}' | sed 's|,| |g')
do
userarray+=("$i")
done
or
userarray+=("$(getent group GROUPNAME | awk -F ':' '{print $4}' | sed 's|,| |g')")
使用Python列出组成员:
import grp;打印grp.getgrnam (GROUP_NAME)[3]”
参见https://docs.python.org/2/library/grp.html
我所做的与上面的perl代码类似,但是用本地perl函数替换了getent和id。它要快得多,应该可以跨不同的*nix口味工作。
#!/usr/bin/env perl
use strict;
my $arg=shift;
my %groupMembers; # defining outside of function so that hash is only built once for multiple function calls
sub expandGroupMembers{
my $groupQuery=shift;
unless (%groupMembers){
while (my($name,$pass,$uid,$gid,$quota,$comment,$gcos,$dir,$shell,$expire)=getpwent()) {
my $primaryGroup=getgrgid($gid);
$groupMembers{$primaryGroup}->{$name}=1;
}
while (my($gname,$gpasswd,$gid,$members)=getgrent()) {
foreach my $member (split / /, $members){
$groupMembers{$gname}->{$member}=1;
}
}
}
my $membersConcat=join(",",sort keys %{$groupMembers{$groupQuery}});
return "$membersConcat" || "$groupQuery Does have any members";
}
print &expandGroupMembers($arg)."\n";
下面的shell脚本将遍历所有用户,并只打印属于给定组的用户名:
#!/usr/bin/env bash
getent passwd | while IFS=: read name trash
do
groups $name 2>/dev/null | cut -f2 -d: | grep -i -q -w "$1" && echo $name
done
true
使用的例子:
./script 'DOMAIN+Group Name'
注意:此解决方案将检查NIS和LDAP中的用户和组(不仅仅是passwd和group文件)。它还将考虑未添加到组但已将组设置为主组的用户。
编辑:为用户不属于同名组的罕见场景添加了修复。
编辑:以shell脚本的形式编写;根据@Max Chernyak aka hakunin的建议,添加了true以0状态退出;为了跳过那些偶然的组,丢弃了stderr:找不到组ID xxxxxx的名称。