Linux 系统查看某个用户组下面的所有用户

Linux 系统中有关用户组的信息放在 /etc/group 这个文件中,而用户信息放在 /etc/passwd 文件中。

要查看某个用户组下面的所有用户,很明显我们需要把这两个文件提供的信息结合起来,下面做一些简单的介绍。

文件内容

在实际动手之前我们先来看看这两个文件中到底存了些啥。由于是纯文本文件,直接使用 cat 命令查看即可。

用户组信息

1
2
3
4
5
6
7
8
9
10
11
$ cat /etc/group
root:x:0:root
sys:x:3:bin
mem:x:8:
ftp:x:11:
mail:x:12:
log:x:19:
smmsp:x:25:
proc:x:26:
adm:x:999:daemon
......

可以看到一行表示一个用户组,总共有四个字段,字段之间使用冒号分隔,从左往右依次为:用户组名、用户组密码、用户组ID(GID)、用户列表(可以为空)。详细解释如下:

  • 用户组名:就是用户组的名字,在同一个 Linux 操作系统中不允许重复
  • 用户组密码:出于保密性考虑,在这个文件中都是用 x 代替的,真正的密码信息存放在 /etc/gshadow
  • 用户组ID:用户组的唯一标识,这是我们能够实现查找某个用户组下面的所有用户的关键
  • 用户列表:每个用户之间用 , 号分割,可以为空,如果字段为空表示用户组为 GID 的用户名

用户信息

1
2
3
4
5
6
7
8
9
10
11
$ cat /etc/passwd
root:x:0:0::/root:/bin/bash
bin:x:1:1::/:/usr/bin/nologin
daemon:x:2:2::/:/usr/bin/nologin
mail:x:8:12::/var/spool/mail:/usr/bin/nologin
ftp:x:14:11::/srv/ftp:/usr/bin/nologin
http:x:33:33::/srv/http:/usr/bin/nologin
nobody:x:65534:65534:Nobody:/:/usr/bin/nologin
uuidd:x:68:68::/:/usr/bin/nologin
git:x:977:977:git daemon user:/:/usr/bin/git-shell
......

同样的一行表示一个用户,共有七个字段,字段之间使用冒号分隔,从左往右依次为:用户名、用户密码、用户ID(UID),用户所在组的ID(GID),一些说明信息,用户的家目录,用户登录后的 shell。详细解释如下:

  • 用户名:用户登录时使用的名字,区分大小写,在同一个 Linux 操作系统中不允许重复
  • 用户密码:用户密码都是同样的都是用 x 代替。真正的密码信息存放在 /etc/shadow 文件中
  • 用户ID:用户的唯一标识,系统是通过 UID 来识别不同的用户和分配用户权限的。只有 UID>500 的用户才是普通用户,其他都是系统用户(也称为伪用户),是用来运行系统服务的,不能登录,也不能删除
  • 用户所在组的ID:这个”用户所在组“指的是初始组,用户一登录就立即拥有这个组的相关权限。每个用户只能有一个初始组,一般就是将和组名这个用户的用户名相同的组作为这个用户的初始组。除此之外还有附加组等
  • 一些说明信息:就是对该用户的一些描述,功能类似于注释,没有什么实际作用
  • 用户的家目录:即用户的 ~ 所代表的路径,一般情况下用户拥有他的家目录的所有权限
  • 用户登录后的 shell:用户登录后所使用 shell 的可执行文件路径,可以通过这里限制用户的登录行为

查找方式

Linux 系统中使用 UID 唯一标识一个用户,使用 GID 唯一标识一个用户组,再结合上面两个文件中的其他信息,我们很容易就能找到一个“查看一个用户组内所有用户”的方式。

首先从 /etc/group 文件中找出我们需要查找的用户组的 GID(这里以 http 用户组为例):

1
2
$ cat /etc/group | grep http
http:x:33:

从上面的结果中可以看到 http 用户组的 GID 是 33,接下来我们从 /etc/passwd 文件中找出所有的用户所在组ID为 33 的用户:

1
awk -F ":" '{print $1"\t"$4}' /etc/passwd | grep '33'

会一点 shell 编程的人应该很容易看懂这句命令的意思。先是使用 awk-F 参数指定使用使用冒号作为分隔符,然后 {print $1"\t"$4} 打印输出第一列和第四列(即用户名和 GID),中间用一个制表符 \t 分隔开来,最后将结果通过管道送给 grep 处理,从中查找出所有包含字符串“33”的行。

上述命令的输出结果如下所示:

1
http	33

这说明在我使用的系统中 http 用户组下只有一个名为 http 的用户。查找其他用户组的操作同理。