当前位置:  开发笔记 > 编程语言 > 正文

如何列出Linux组中的所有用户?

如何解决《如何列出Linux组中的所有用户?》经验,为你挑选了8个好方法。

如何在Linux(以及可能的其他unices)中列出组中的所有成员?



1> 小智..:
getent group ;

它可以在Linux和Solaris上移植,并且可以与本地组/密码文件,NIS和LDAP配置一起使用.


不显示将该组作为其默认组的用户.

2> Zed..:

不幸的是,我知道没有好的,可移植的方法来做到这一点.如果您尝试解析/ etc/group,正如其他人所建议的那样,您将错过将该组作为其主要组的用户以及通过UNIX平面文件以外的机制(即LDAP,NIS,已添加到该组)的任何人pam-pgsql等).

如果我自己绝对必须这样做,我可能会反过来做:id用来获取系统上每个用户的组(这会将所有源都提供给NSS),并使用Perl或类似的东西来维护哈希发现每个组的表都注意到该用户的成员身份.

编辑:当然,这会给您留下类似的问题:如何获取系统上每个用户的列表.由于我的位置仅使用平面文件和LDAP,因此我可以从两个位置获取列表,但这可能适用于您的环境,也可能不适用.

编辑2:传递给我的人提醒我getent passwd将返回系统中所有用户的列表,包括来自LDAP/NIS /等的用户, getent group仍然会遗漏仅通过默认组条目成员的用户,这样就激励我写这个快速黑客.

#!/usr/bin/perl -T
#
# Lists members of all groups, or optionally just the group
# specified on the command line
#
# Copyright © 2010-2013 by Zed Pobre (zed@debian.org or zed@resonant.org)
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#

use strict; use warnings;

$ENV{"PATH"} = "/usr/bin:/bin";

my $wantedgroup = shift;

my %groupmembers;
my $usertext = `getent passwd`;

my @users = $usertext =~ /^([a-zA-Z0-9_-]+):/gm;

foreach my $userid (@users)
{
    my $usergrouptext = `id -Gn $userid`;
    my @grouplist = split(' ',$usergrouptext);

    foreach my $group (@grouplist)
    {
        $groupmembers{$group}->{$userid} = 1;
    }
}

if($wantedgroup)
{
    print_group_members($wantedgroup);
}
else
{
    foreach my $group (sort keys %groupmembers)
    {
        print "Group ",$group," has the following members:\n";
        print_group_members($group);
        print "\n";
    }
}

sub print_group_members
{
    my ($group) = @_;
    return unless $group;

    foreach my $member (sort keys %{$groupmembers{$group}})
    {
        print $member,"\n";
    }
}


我为你添加了一个类似ISC的许可证,它应该与几乎任何组都兼容.您可以随意将其提交到您认为可以接受的任何地方.
感谢所有回答的人.我一直在寻找一种可移植的方式来做到这一点.您的信息不是一种简单易用的方式,这对您有所帮助.你还详细介绍了帮助我更深入地理解问题的情况,我很欣赏,我选择你的答案作为公认的答案.
您是否有可能将您的脚本捐赠给Linux基金会?这是2012年,仍然没有简单的方法来获得一个团体的成员.这是让我对Linux感到沮丧的事情.

3> 小智..:

使用Python列出组成员:

python -c"import grp; print grp.getgrnam('GROUP_NAME')[3]"

请参阅https://docs.python.org/2/library/grp.html



4> 小智..:
lid -g groupname | cut -f1 -d'(' 


这将是最好的方式,除了盖子不在标准的Debian安装中.在Ubuntu中,它位于libuser可选包中(它不是id-utils中具有相同名称的包).我没有在Debian中找到它:(
@JohnMcGehee RHEL应该被称为AustereLinux

5> Jose Bagatel..:

以下命令将列出属于的所有用户,但仅列出由/etc/group数据库管理的用户,而不是LDAP,NIS等.它也仅适用于辅助组,它不会列出将该组设置为主要组的用户,因为主要组是存储为GID(数字组ID)在文件中/etc/passwd.

grep  /etc/group


您可以直接grep到该文件,如grep /etc/group.更快,更少开销.

6> Didier Tross..:

以下命令将列出属于的所有用户,但仅列出由/etc/group数据库管理的用户,而不是LDAP,NIS等.它也仅适用于辅助组,它不会列出将该组设置为主要组的用户,因为主要组是存储为GID(数字组ID)在文件中/etc/passwd.

awk -F: '/^groupname/ {print $4;}' /etc/group


不显示将该组作为其默认组的用户.
不检查NIS和LDAP.

7> Paweł Nadols..:

以下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用户和组(不仅passwdgroup文件).它还会考虑未添加到组但将组设置为主组的用户.

编辑:添加了针对罕见场景的修复,其中用户不属于具有相同名称的组.

编辑:以shell脚本的形式编写; 按照@Max Chernyak aka hakunin建议的状态添加true退出; 丢弃以便偶尔跳过那些.0stderrgroups: cannot find name for group ID xxxxxx



8> Bhavik..:

您可以在一个命令行中执行此操作:

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

以上命令列出了将groupname作为主要组的所有用户

如果还要列出具有groupname作为其辅助组的用户,请使用以下命令

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


作为主要组的所有用户
作为其辅助组的用户,请使用以下命令
推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有