我是Linux和Unix的新手。我无法弄明白 如何列出Unix中特定组的所有登录用户。
我花了很多时间尝试它。我知道'who'命令为我提供了登录用户但我需要按特定组过滤它们。 请提供任何帮助和提示。
答案 0 :(得分:1)
使用:getent group group_name
获取特定群组的用户,w
为所有登录用户提供。您可以使用这两个来获得结果。
使用getent
时,:
分隔的字段为 -
答案 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;