gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:44:03 26 4
gpt4 key购买 nike

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

我花了很多时间尝试。我知道“谁”命令为我提供了登录用户,但我需要按特定组对其进行过滤。
请提供任何帮助和提示。

最佳答案

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

举一个具体的例子,假设您对组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的“打开目录”条目列出了另外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中列出;它仅出现在数据库的“打开目录”部分中。

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

因此,正如我在开始时指出的那样,要找到您问题的答案并非直截了当。

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

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

关于linux - 列出登录到特定组的所有用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49833059/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com