列出登录特定组的所有用户

时间:2018-04-14 15:26:23

标签: linux shell unix

我是Linux和Unix的新手。我无法弄明白 如何列出Unix中特定组的所有登录用户。

我花了很多时间尝试它。我知道'who'命令为我提供了登录用户但我需要按特定组过滤它们。 请提供任何帮助和提示。

3 个答案:

答案 0 :(得分:1)

使用:getent group group_name获取特定群组的用户,w为所有登录用户提供。您可以使用这两个来获得结果。

使用getent时,:分隔的字段为 -

  • 群组名称
  • 加密密码(通常不使用)
  • 数字组ID
  • 逗号分隔的成员列表

答案 1 :(得分:1)

在一般情况下,这是一项痛苦的练习。我已经看到生产中使用的密码和组文件违反了逻辑 - 但是工作。

为了具体示例,我们假设您对群组student的登录成员感兴趣。

现在,/etc/group等命名组的组数据库(student文件和网络资源)中的条目可能会也可能不会列出任何成员。但这并不一定意味着该组中没有成员。密码数据库(/etc/passwd文件中的每个条目以及网络资源)都分配了组编号,组编号可能与组student的组编号相同,在这种情况下,用户属于也是小组。

但是,我们还没有完成。假设组数据库中的条目为:

student:x:2971:newton,einstein,socrates,plato

组数据库中可能还有其他条目,例如:

student_2020:x:2971:able,cain,adam,eve

因为此条目使用与组student相同的组号,所以student_2020条目中列出的任何人在功能上都是组student的成员 - o / s内核使用数字,而不是名称,以确定组。

分割组文件条目可能有合理的理由;至少在历史上,如果名单太长,某些程序会遇到问题。这是糟糕的编程,但是当系统提供的软件执行崩溃时,您可以避免触发崩溃。因此有多个条目。

您最终可能会为同一组名称使用不同组编号的多个条目(确实令人困惑!)或同一组编号的多个名称(如上所述)或具有相同组编号和名称的多个条目。对于任何给定名称或号码的报告内容,可能会被忽略。

您可以在密码文件中遇到类似的问题。例如,所有具有相同用户编号的多个用户名有时用于允许多人root访问(他们的用户编号为0),但每个用户名都有一个单独的密码,因此一些跟踪是可行的。但是,这些天使用sudo通常更好 - 但并不总是可用。偶尔会出现错误,同一个用户名会出现两次不同的用户号。通常,使用文件中的第一个条目,但它可能会令人困惑(充其量)。

但是,目前尚不清楚可以使用哪些程序来分析这些问题,或者得出关于什么是什么的明确答案。如果按名称搜索组(C中为getgrnam()),则通常会获得与该名称匹配的第一个条目(但不一定要清楚该条目是来自网络还是本地文件系统)。如果按编号搜索组(C中为getgrgid()),则通常会获得与该编号匹配的第一个条目。但是,如果您使用setgrent()加上重复getgrent()endgrent()(可选)扫描整个数据库,您可能会看到各种条目。

作为一个例子,我可以在我的Mac上运行此代码:

#include <grp.h>
#include <stdio.h>

int main(void)
{
    struct group *grp;
    while ((grp = getgrent()) != 0)
    {
        printf("%5d %-15s", grp->gr_gid, grp->gr_name);
        char **mem = grp->gr_mem;
        char *pad = " -- ";
        while (*mem != 0)
        {
            printf("%s%s", pad, *mem++);
            pad = ", ";
        }
        putchar('\n');
    }
    return(0);
}

当我这样做并通过sort -n管道输出时,我得到(部分):

   -2 nobody         
   -2 nobody         
   -1 nogroup        
   -1 nogroup        
    0 wheel           -- root
    0 wheel           -- root
    1 daemon          -- root
    1 daemon          -- root
    2 kmem            -- root
    2 kmem            -- root
    3 sys             -- root
    3 sys             -- root
    4 tty             -- root
    4 tty             -- root
    5 operator        -- root
    5 operator        -- root
    6 mail            -- _teamsserver
    6 mail            -- _teamsserver
    7 bin            
    7 bin            
…
   16 group          
   16 group          
   20 staff           -- root
   20 staff           -- root, informix, anonymous, supernumerary
   24 _networkd      
   24 _networkd    
…

为什么双重录入?好吧,文件/etc/group包含一组条目 - 例如:

staff:*:20:root

还有一个咨询过的数据库Open Directory。实际上,Mac上/etc/group文件的第一行是注释行(其他o / s通常不支持注释):

##
# Group Database
# 
# Note that this file is consulted directly only when the system is running
# in single-user mode.  At other times this information is provided by
# Open Directory.
#
# See the opendirectoryd(8) man page for additional information about
# Open Directory.
##

/etc/passwd文件的顶部有一个类似的spiel。 staff的Open Directory条目列出了3个其他用户。令我感到好奇的是,当我运行id时,我也在staff组中:

uid=501(jleffler) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts),204(_developer),399(com.apple.access_ssh),701(com.apple.sharepoint.group.1),100(_lpoperator),702(com.apple.sharepoint.group.2)

我的名字甚至没有列在/etc/passwd中;它只出现在数据库的Open Directory部分中。

我的名字只在组数据库中明确列出了组204和399;在密码数据库中给出组20;我不确定组12,61,100,701,702如何与我的用户ID相关联。 (这对我来说是个新闻,我不知道这一点 - 有时回答一个问题比提出问题的人更有教育意义。)

所以,正如我在开始时所指出的那样,找到你问题的答案并不是直截了当的。

如果您扫描密码数据库和分组数据库,您可以获得所需信息的合理近似值,但除非您浏览平台上的控件,否则可能永远无法获得完整答案。

answer Abhishek Keshhri表示有一个(特定于Linux的? - 不在macOS上,无论如何)命令getent可用于分析组数据库(可能还有用户或密码数据库,也许还有其他人)。 macOS上有Open Directory工具来分析macOS上的密码和组数据库。你不必编写和编译C代码(但显示的代码不是火箭科学)。

答案 2 :(得分:0)

请执行以下命令。替换&#34;测试&#34;与组名

用户| xargs组| grep测试| awk -F:&#39; {print $ 1}&#39;