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