当您需要检查本地用户账户、确认 UID 或查看用户的家目录和登录 Shell 时,/etc/passwd 是首先要检查的文件之一。它存储本地账户元数据,而密码哈希通常保存在 /etc/shadow 中。

/etc/passwd 是一个存储在系统本地的纯文本账户数据库。它通常由 root 拥有,权限为 644,这使得所有用户都可以读取,但只有 root 或具有所需特权的进程可以写入。Linux 也可以通过名称服务切换 (NSS) 从 LDAP 或 NIS 等来源获取账户信息。

本指南解释了如何查看 /etc/passwd、读取其七个字段,并安全地管理其中包含的本地账户数据。

如何查看 /etc/passwd 文件

要将整个文件打印到终端,请运行:

终端

cat /etc/passwd

输出列出了文件中存储的每个本地账户条目,每行一个:

输出

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
mark:x:1001:1001:mark,,,:/home/mark:/bin/bash

第一行是 root 账户(UID 0,登录 Shell 为 Bash)。中间的系统账户使用 /usr/sbin/nologin 拒绝 Shell 登录,最后一行是一个常规本地用户账户。我们在下面分解每个字段。

如果文件很长且您想逐页滚动浏览,请使用:

终端

less /etc/passwd

使用 cat 进行快速转储,使用 less 以便更舒适地检查文件。

要通过 NSS 配置中设置的源查询 passwd 数据库,请使用:

终端

getent passwd

输出使用与 /etc/passwd 相同的冒号分隔格式。它可能包括目录服务账户和未存储在本地文件中的其他条目,尽管某些 NSS 源不支持列出每个条目。

/etc/passwd 格式

/etc/passwd 是一个文本文件,每行一个条目,代表一个本地用户账户。如上所示,您可以使用 cat 查看它或在文本编辑器中打开它。通常,第一行描述 root 用户,其次是系统用户和常规用户账户。账户管理工具通常会将新的本地条目附加到该文件中。

/etc/passwd 文件的每一行包含七个冒号分隔的字段:

输出

mark:x:1001:1001:mark,,,:/home/mark:/bin/bash
[--] - [--] [--] [-----] [--------] [--------]
|    |   |    |     |         |        |
|    |   |    |     |         |        +-> 7. 登录 Shell
|    |   |    |     |         +----------> 6. 家目录
|    |   |    |     +--------------------> 5. GECOS
|    |   |    +--------------------------> 4. GID
|    |   +-------------------------------> 3. UID
|    +-----------------------------------> 2. 密码
+----------------------------------------> 1. 用户名
  1. 用户名。本地账户的登录名称。每个用户名应该是唯一的。当前的 shadow-utils 版本接受长达 256 个字符的用户名,尽管其他工具和站点策略可能会施加更短的限制。
  2. 密码。旧系统将密码哈希存储在 /etc/passwd 中。在大多数现代系统上,此字段设置为 x,密码哈希存储在 /etc/shadow 中。
  3. UID。用户标识符是分配给每个用户的数字。操作系统使用它来引用用户。
  4. GID。用户主组的数字 ID。新创建的文件通常使用进程的有效 GID,这通常是用户的主组,但具有 setgid 位的目录会导致文件继承该目录的组。用户的次要组单独定义。
  5. GECOS 或注释字段。此可选字段是信息性的。按照惯例,它可以包含逗号分隔的值,例如:
    • 用户的全名或应用程序名称。
    • 房间号。
    • 工作电话号码。
    • 家庭电话号码。
    • 其他联系信息。
  6. 家目录。用作账户家目录的绝对路径以及登录时分配给 HOME 的值。常规用户账户通常使用 /home/username,但路径是可配置的。
  7. 登录 Shell。用户登录时启动的程序以及分配给 SHELL 的值。Bash 是常见的默认值,但配置的 Shell 因发行版和账户类型而异。

快速参考

字段位置示例
用户名1mark
密码占位符2x
UID31001
GID41001
GECOS/注释5mark,,,
家目录6/home/mark
登录 Shell7/bin/bash

常见问题解答

为什么密码字段设置为 x?
x 是一个占位符,表示密码哈希存储在 /etc/shadow 文件中。密码哈希已从 /etc/passwd 中移出,因为该文件必须保持可读,供常规用户和程序使用。

密码字段中的 * 或 ! 是什么意思?
这两个值都不是有效的密码哈希,因此 UNIX 密码认证已禁用。感叹号通常表示密码已锁定。这并不一定禁用整个账户,因为 SSH 密钥或其他认证方法可能仍然有效。

UID 0 是什么?
UID 0 是 root 用户。任何 UID 为 0 的账户都具有完整的超级用户特权,无论其用户名如何。

系统账户使用什么登录 Shell?
不应具有交互式 Shell 的系统账户通常使用 /usr/sbin/nologin 或 /bin/false。这些程序拒绝 Shell 登录尝试,但服务仍可以在该账户下运行。

为什么所有用户都可以读取 /etc/passwd?
该文件必须可读,以便系统和用户空间程序可以将 UID 映射到用户名、Shell 和家目录。密码哈希不存储在那里;它们保存在 /etc/shadow 中,后者仅限于 root。

我可以直接编辑 /etc/passwd 吗?
您应该使用 vipw 安全地编辑该文件。它会锁定文件以防止同时编辑并降低损坏风险。对于常规账户更改,请优先使用 usermod 和 useradd 等命令。