原文地址:How to List Users in Linux | Linuxize

你是否也希望列出你的 Linux 系统中的所有用户,或者统计一下系统中的用户数量?已经有一些用于创建、删除用户以及列出已登录的命令了,但哪个命令才是在 Linux 中列出用户的呢?

本教程将告诉你如何在 Linux 系统中列出用户。

使用 /etc/passwd 文件

本地用户信息存储在 /etc/passwd 文件中。这个文件中的每一行代表一个用户的登录信息。你可以使用 cat 或者 less 来打开这个文件:

less /etc/passwd

文件的每一行都有用冒号分割的 7 个字段,包含如下信息:

  • 用户名
  • 加密的密码(x 表示密码是存储在 /etc/shadow 文件中的)
  • 用户 ID 号(UID)
  • 用户的组 ID 号(GID)
  • 用户的全名(GECOS)
  • 用户的家目录
  • 登录 shell(默认是 /bin/bash

如果你只想显示用户名,可以使用 awk 或者 cut 命令打印只包含用户名的第一个字段:

awk -F: '{print $1}' /etc/passwd
cut -d: -f1 /etc/passwd
root
daemon
bin
sys
sync
...
...
sshd
vagrant
jack
anne

使用 getent 命令

getent 命令显示来自 /etc/nsswitch.conf 文件中配置的数据库条目,包括 passwd 数据库,可用于查询全部用户列表。

要获取全部的 Linux 用户列表,输入如下命令:

getent passwd

正如你所见,输出跟 /etc/passwd 文件的内容是一样的。如果你使用 LDAP 进行用户身份认证,则 getent 会显示包括 /etc/passwd 文件和 LDAP 数据库中的所有 Linux 用户。

你也可以使用 awkcut 来打印只包含用户名的第一个字段:

getent passwd | awk -F: '{ print $1}'
getent passwd | cut -d: -f1

检查一个用户是否已经在 Linux 系统中

现在我们知道如何去列出所有用户,要检查一个用户是否存在于我们的 Linux 中,可以简单的用 grep 命令过滤一下用户列表。

例如,想要从我们的 Linux 系统中找出一个名为 jack 的用户,我们使用如下的命令:

getent passwd | grep jack
如果这个用户存在,上面的命令会打印用户的登录信息,而什么输出都没有就意味着用户不存在。
我们也可以不使用 grep 命令来检查一个用户是否存在:
getent passwd jack
就像之前的那样,如果用户存在,命令会显示用户的登录信息。 如果你希望查到你的系统中有多少个用户账户,管道链接 getent passwdwc 命令即可:
getent passwd | wc -l
33
可以看到,上面的输出显示我的 Linux 系统有 33 个用户账户。

系统和普通用户

对于系统和普通用户,没有真正的技术区别。通常系统用户是通过安装操作系统和新的包创建的。一些场景下,你可以自行创建用于某系应用的系统用户。

普通用户是有 root 或者其他拥有 sudo 权限的用户创建的。通常,一个普通用户有一个真实的登录 shell 和家目录。

每个用户都有一个叫做 UID 的数字用户 ID,如果在使用 useradd 命令创建新用户的时候没有指定,则 UID 会从 /etc/login.defs 文件中自动选出来,依赖于 UID_MINUID_MAX 的值。

要检查你系统的 UID_MINUID_MAX 的值,你可以使用如下命令:

grep -E '^UID_MIN|^UID_MAX' /etc/login.defs
UID_MIN          1000
UID_MAX         60000

从上面的输出中,我们可以看到所有普通用户的 UID 应该在 1000 到 60000 之间。知道最小和最大的值,就允许我们去查询我们系统中所有普通用户的列表了。

下面的命令将列出我们 Linux 系统中的所有普通用户

getent passwd {1000..60000}
你系统的 UID_MINUID_MAX 可能不同,所以更通用版本的命令是这样的:
eval getent passwd {$(awk '/^UID_MIN/ {print $2}' /etc/login.defs)..$(awk '/^UID_MAX/ {print $2}' /etc/login.defs)}
如果你只想打印用户名,只需要管道输出到 cut 命令:
eval getent passwd {$(awk '/^UID_MIN/ {print $2}' /etc/login.defs)..$(awk '/^UID_MAX/ {print $2}' /etc/login.defs)} | cut -d: -f1

结论

在这个教程中,你学习到了如何列出和过滤 Linux 系统中的用户,并且知道系统用户和普通用户之间的主要区别。

同样的命令适用于任何 Linux 发行版,包括 Ubuntu、CentOS、RHEL、Debian 和 Linux Mint。

如果您有任何问题,请随时发表评论。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据