如何在Linux(可能还有其他unix)中列出一个组的所有成员?


当前回答

下面是一个非常简单的awk脚本,它考虑了其他答案中列出的所有常见陷阱:

getent passwd | awk -F: -v group_name="wheel" '
  BEGIN {
    "getent group " group_name | getline groupline;
    if (!groupline) exit 1;
    split(groupline, groupdef, ":");
    guid = groupdef[3];
    split(groupdef[4], users, ",");
    for (k in users) print users[k]
  }
  $4 == guid {print $1}'

我将它用于支持ldap的设置,运行在任何具有符合标准的getent和awk的设备上,包括solaris 8+和hpux。

其他回答

下面的命令将列出属于<your_group_name>的所有用户,但只列出由/etc/group数据库管理的用户,不包括LDAP、NIS等。它也只适用于次要组,它不会列出将该组设置为主要组的用户,因为主要组存储为/etc/passwd.文件中的GID(数字组ID)

grep <your_group_name> /etc/group

下面是一个脚本,返回/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

你可以在一个命令行中完成:

cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1

上面的命令列出了所有使用groupname作为主组的用户

如果还希望列出具有groupname的用户作为次要组,则使用以下命令

getent group <groupname> | cut -d: -f4 |  tr ',' '\n'

有一个方便的Debian和Ubuntu包叫做“members”,它提供了这个功能:

描述:显示一个组的成员;默认为所有成员 Members是groups的补充:groups表示指定用户所属的组,Members表示用户 属于特定群体的 ... 你可以请求主要成员,次要成员,都在 一行,每一行都在单独的行上。

下面的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的名称。