Contents

在Linux组中列出所有用户

1. 概述

在 Linux 系统中,用户是我们可以用来登录的帐户。唯一的标识号或 UID 标识每个这样的用户。

本文将讨论列出 Linux 组中所有用户的各种方法。

2. 使用*/etc/passwd*文件

/etc/passwd 文件包含 Linux 系统中用户的所有信息。我们可以通过使用cut 命令对*/etc/passwd*文件进行切片来获取 Linux 系统上当前可用的用户列表:

$ cut -d: -f1 /etc/passwd
daemon
mail
postmaster
ftp
sshd
at
cyrus
ntp
smmsp
svn

显示用户和组信息的直接方法是使用cut命令对/etc/group 文件进行切片:

$ cut -d: -f1,4 /etc/group
root:root
bin:root,bin,daemon
daemon:root,bin,daemon
sys:root,bin,adm
adm:root,adm,daemon

产生的输出由组名和关联的用户组成,用“:”分隔。

显示属于某个组的用户列表的间接方法是从*/etc/group*文件中获取组的 GID(数字组 ID):

$ cut -d: -f1,3 /etc/group | grep daemon
daemon:2

然后,在命令 ’ grep :GID$’ 中使用这个 GID ,我们可以过滤*/etc/passwd*文件内容:

$ cut -d: -f1,3 /etc/passwd | grep :2$
daemon:2

3. 使用getent

我们知道,/etc/group文件定义了 Linux 系统上的组,而*/etc/passwd文件描述了它的用户登录帐户。与包含给定组的用户名的/etc/group文件不同,/etc/passwd*文件只包含相关组的 GID。

但是,使用此 GID(对于用户及其关联的组而言),我们可以从/etc/passwd*文件中检索给定组的用户列表。* 获取属于名为“daemon”的组的用户列表的命令,因为他们的主要组是:

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

这个命令片段的逻辑类似于我们在第 2 节中看到的,包含三个不同的部分。根本区别在于getent的使用。让我们分解命令的每个部分的作用

第 1 步:使用getent ,我们获取名为*“daemon”*的组的 GID :

$ getent group daemon|cut -d: -f3
2

第 2 步:然后,我们对*/etc/passwd*文件进行切片,以获取由具有各自 GID 的用户组成的列表:

$ cut -d: -f1,4 /etc/passwd 
root:0 
bin:1 
daemon:2 
adm:4 
lp:7 
sync:0

第 3 步:使用grep ,我们使用其 GID(第 1 步)从具有各自 GID 的用户列表(第 2 步)中将用户列入*“daemon”*组的候选名单:

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

第 4 步:最后,我们对输出进行切片(第 3 步)以仅显示相应的用户。

我们还可以使用cuttr将属于我们正在查找的名称的组的用户(在本例中为“daemon”)列为他们的辅助组:

$ getent group daemon | cut -d: -f4 | tr ',' '\n'
root
bin
daemon

** getent如此受欢迎的原因之一是因为它可以在大多数形式的 Linux 中移植,并且可以与本地组/密码文件一起使用。**

4. 使用awk

让我们编写一个简单的awk 脚本,显示属于名为“daemon”的组的用户:

$ awk -F: '/^daemon/ {print $4;}' /etc/group
root,bin,daemon

此命令仅显示*/etc/group*数据库管理的那些用户。它不会打印 LDAP、NIS 或其他地方管理的其他类型的用户。

同样重要的是要注意它仅适用于次要组。它不会显示将该组设置为主要组的用户,因为*/etc/passwd*文件将主要组存储为 GID(数字)。