Linux用户管理核心配置文件详解:passwd、shadow、group与sudoers

发布时间:2026/10/12 2:41:28
Linux用户管理核心配置文件详解:passwd、shadow、group与sudoers 以下是我们来看 /etc/passwd、/etc/shadow、/etc/group、/etc/sudoers 这几组文件。Linux 用户管理大多数操作最终都是在跟这几个文件打交道。面试里问“创建用户后系统做了什么改动”“为什么密码不直接存在 passwd 里”“useradd 和 adduser 有什么区别”答案都藏在这些文件里。这篇文章把每个文件字段、命令与文件的对应关系、高频面试题一次性讲清楚最后给一套排查思路。1. 配置文件速览Linux 用户管理相关的核心文件并不多面试和日常排错主要记住下面几个文件作用涉及命令/etc/passwd保存用户基本信息、UID、GID、家目录、登录 Shelluseradd、usermod、userdel、id、finger/etc/shadow保存加密密码、密码有效期、账号过期时间passwd、chage、usermod/etc/group保存组信息、组成员列表groupadd、groupmod、groupdel、gpasswd/etc/gshadow保存组密码、组管理员信息gpasswd/etc/login.defs用户和密码默认策略UID 范围、密码过期天数等useradd、passwd 创建时读取/etc/default/useradduseradd 创建用户时的默认配置家目录、Shell、删除策略useradd、userdel/etc/skel新用户家目录的模板目录useradd 创建家目录时复制/etc/sudoerssudo 授权规则visudo、sudo优先级最高的是前面四个文件也就是 passwd、shadow、group、gshadow。很多面试题表面上问“用户怎么创建”实际考察的是你对这四个文件的字段含义和内部关联是否清楚。2. /etc/passwd 字段详解/etc/passwd 是 Linux 用户信息的主文件每一行代表一个用户。先看一个典型行root:x:0:0:root:/root:/bin/bash用冒号分隔成 7 个字段字段位置字段名示例值含义1用户名root登录系统时输入的用户名必须唯一2密码占位x密码占位符不保存真实密码3UID0用户 ID系统内核识别用户用4GID0用户初始组 ID5注释信息root用户全名或描述信息一般叫 GECOS 字段6家目录/rootroot 用户的家目录7登录 Shell/bin/bash用户登录后执行的 Shell 程序这里有两个容易踩坑点。第一为什么第二个字段是 x 而不是密码?因为早期 Unix 把加密密码放在 passwd 里后来为了安全把密码挪到了只有 root 可读的 /etc/shadow 中passwd 里只保留一个 x 占位符。有些发行版如果不需要 shadow这个位置可能是*或空表示账号被锁定或无密码登录。面试里问“能不能把第二个字段改成空实现免密登录”答案是部分老系统可以现代系统不行因为登录验证已经由 shadow 接管。如果你手工清掉 /etc/shadow 对应行的密码字段这个账号通常表现为无法登录或无需密码登录具体行为取决于系统配置。第二UID 作用比用户名更重要。Linux 内核只认 UID不认用户名。你删掉用户后再次创建相同用户名如果 UID 不同新用户继承不了原用户拥有的文件。这也是为什么面试会问你“误删用户后文件还在怎么找回归属”——本质上就是找原 UID然后用chown -R 原UID:新GID重新关联。手动编辑 /etc/passwd 是可以的但强烈建议通过命令修改。手动改错字段会导致用户无法登录、ldd 解析出错甚至系统无法启动比如把 /bin/bash 写错。如果确实需要手动查看或验证用getent更安全getent passwd root getent passwd 1000getent会同时查询文件数据库和 NSS 配置的远程数据库比如 LDAP、NIS。排查“用户存在却登录不了”时先getent passwd username再id username能快速定位是本地文件问题还是认证库问题。3. /etc/shadow 字段详解/etc/shadow 存放用户密码和有效期信息权限默认是 root 可读写、shadow 组可读。普通用户无权查看这也是它和 passwd 最直观的安全区别。典型行root:$6$abc123...:19000:0:99999:7:::按冒号分隔成 9 个字段字段位置字段含义示例1用户名与 passwd 中用户名一致2加密密码$6$... 表示 SHA-512 加密3最后一次修改密码的日期从 1970-01-01 起的天数4密码最少使用天数0 表示可立即修改5密码最多使用天数99999 表示几乎不过期6密码过期前警告天数7 表示过期前 7 天提醒7密码过期后宽限天数空或不填表示不宽限8账号过期日期从 1970-01-01 起的天数9保留字段暂时无用密码字段里如果出现感叹号!或!!表示该用户密码被锁定不能正常登录。passwd -l锁定账号就是往这个位置加锁标记。区分几个概念usermod -L锁定密码passwd -l锁定密码chage -E 2025-12-31设定账号过期日期/etc/shadow 第 8 个字段是账号最终过期时间时间一到即使密码正确也不能登录修改密码的有效期优先用chage而不是直接改 shadow。chage会校验日期格式和天数关系手工改容易写出负数或前后矛盾。常用命令# 查看用户密码状态 chage -l username # 强制用户下次登录必须改密码 chage -d 0 username # 设定密码 90 天过期 chage -M 90 username如果第二字段是*表示该用户从未设置密码或者系统账户无法用密码登录。比如bin、daemon、sys这类系统账号passwd 和 shadow 里的密码字段多为x、*、!。nginx 默认创建的 nobody 用户也是锁定状态。面试里经常出现“为什么系统用户密码是 ! 还能跑服务”的题。解释是锁定密码只影响交互式登录和密码认证不影响 root 通过 su 切换也不影响服务以该用户身份启动。服务进程由 init/systemd 启动时系统不会去 check 密码所以 nobody 这类账号锁不锁都能跑守护进程。4. /etc/group 与 /etc/gshadow/etc/group 保存组信息字段结构类似 passwdsudo:x:27:alice,bob四个字段分别是组名、组密码占位、GID、组成员列表。第三个字段是成员列表用逗号分隔没有成员时为空。组密码一般不使用占位为 x真正的组密码放在 /etc/gshadow。/etc/gshadow 的结构是groupname:group-password:group-admins:members第二个字段是加密的组密码第三个字段是组管理员列表第四个字段是组成员列表日常管理组时很少直接编辑文件都是用 groupadd、groupmod、groupdel 和 gpasswd。常见需求# 新建组 groupadd devteam # 将用户加入组 gpasswd -a alice devteam # 将用户移出组 gpasswd -d alice devteam # 设置组管理员 gpasswd -A bob devteam这里牵扯到一个面试高频概念初始组primary group和附加组supplementary group。/etc/passwd 第 4 个字段是初始组 ID/etc/group 的成员列表是附加组。用户创建文件时默认属于初始组但如果用户被加入多个附加组可以用newgrp临时切换初始组或者用sg按指定组身份执行命令。测试组的实际归属不用看文件直接id alice groups alice如果组名存在但groups命令没显示多半是 /etc/group 文件成员列表没写进去或者 NSS 缓存未刷新。个别系统修改 group 文件后可能需要清除 nscd 缓存sudo systemctl restart nscd5. 用户管理命令与配置文件的关系到这里可以把命令和文件的关系整理成一张对应表面试答题时可以按“命令会改动哪些文件”的维度去讲。命令修改文件说明useradd username/etc/passwd、/etc/shadow、/etc/group可能修改 /etc/gshadow创建用户但不设置密码passwd username/etc/shadow设置或修改用户密码usermod -aG group user/etc/group、/etc/gshadow添加附加组usermod -s /sbin/nologin user/etc/passwd修改登录 Shellusermod -L / -U user/etc/shadow锁定/解锁密码userdel -r user/etc/passwd、/etc/shadow、/etc/group并删除家目录和 mail spool删除用户并清理家目录groupadd group/etc/group、/etc/gshadow创建组gpasswd -a user group/etc/group、/etc/gshadow将用户加入组chage -E date user/etc/shadow设置账号过期注意useradd和adduser不是同一个东西。useradd是系统自带低层命令直接写配置文件不创建家目录除非指定 -m不设置密码。adduser在多数发行版中是 Perl 包装脚本交互式创建用户会自动创建家目录、设置密码、补齐默认配置。CentOS/RHEL 中 adduser 是一个链接行为与 useradd 一致Debian/Ubuntu 中才是真正的交互式包装脚本。面试时如果被问两者区别需要先反问你所在发行版。6. /etc/login.defs 与 /etc/default/useradd 默认策略创建用户时系统会读取两个默认配置文件决定 UID 范围、家目录路径、密码过期策略等。/etc/login.defs 常用项配置项作用UID_MIN / UID_MAX普通用户 UID 范围SYS_UID_MIN / SYS_UID_MAX系统用户 UID 范围GID_MIN / GID_MAX普通组 GID 范围PASS_MAX_DAYS密码最多使用天数PASS_MIN_DAYS密码最少使用天数PASS_WARN_AGE密码过期前警告天数CREATE_HOME是否默认创建家目录USERGROUPS_ENAB删除用户时是否删除同名初始组这里的经典面试点是“手动改 login.defs 后已有用户的密码策略不会自动变”。比如你把 PASS_MAX_DAYS 改成 30只是影响之后创建的用户老用户的 /etc/shadow 第 5 个字段不变。要批量调整已有用户需要配合chagefor user in alice bob carol; do chage -M 30 $user done/etc/default/useradd 里包含 HOME、SHELL、SKEL、GROUP 等默认值。例如HOME/home SHELL/bin/bash SKEL/etc/skel CREATE_MAIL_SPOOLyes看当前 useradd 默认参数可以用useradd -D想要修改默认 Shell、默认家目录改这个文件比每次给 useradd 传参更省事。系统里新增用户时默认 Shell 由这里决定。7. /etc/skel 目录和新用户家目录模板每次用 useradd 创建用户时如果创建了家目录系统会把 /etc/skel 里的所有隐藏文件复制到新用户家目录。这个目录里通常有/etc/skel/.bashrc /etc/skel/.bash_profile /etc/skel/.profile /etc/skel/.bash_logout原理很简单家目录模板机制。系统管理员可以在 /etc/skel 里放公共配置比如统一的环境变量、Vim 配置、安全告警脚本之后所有新用户都会带上这些文件。改动 /etc/skel 不会影响已有用户只影响之后创建的新用户。如果要批量给老用户同步配置需要手工复制并处理权限for home in /home/*; do user$(basename $home) cp -r /etc/skel/. $home/ 2/dev/null chown -R $user:$user $home done这条命令不适用于 UID 和用户名不一致的历史目录跑之前先检查。注意一个细节useradd -k -m 可以强制指定使用 /etc/skel 模板-k 是指定 SKEL 目录。默认创建用户时如果系统存在 /etc/skel就会自动复制。8. /etc/sudoers 与提权配置用户管理和权限管理经常放一起考。/etc/sudoers 控制哪些用户可以以 root 或其他用户身份执行命令。直接通过 visudo 修改不要手工编辑文件因为 visudo 会做语法检查防止写错字段后 sudo 全部失效。一个典型行alice ALL(ALL) ALL含义是alice 可以在任何主机上以任何用户身份执行任何命令。涉及的字段字段含义用户或组alice组用 %devteam主机列表ALL对应源主机目标用户(ALL) 表示可以切换到任意用户命令列表ALL表示任何命令常见场景配置# 允许 devteam 组执行所有命令 %devteam ALL(ALL) ALL # 允许 alice 免密执行 systemctl alice ALL(ALL) NOPASSWD: /usr/bin/systemctl # 禁止 bob 执行 useradd bob ALL(ALL) ALL, !/usr/sbin/useraddsudoers 的解析顺序是从上到下后匹配规则会覆盖先匹配规则。如果既写了 ALL 又写了禁止项禁止项需要放在 ALL 后面。!排除规则在复杂配置里经常出问题建议你先在测试环境验证。visudo 修改完成后用另一个终端验证配置没坏sudo -l -U alice如果误改 sudoers 导致 sudo 不可用可以用 pkexec 或直接进入单用户模式修复。Debian/Ubuntu 还可以在恢复模式下用 root 编辑。9. 面试高频题整理下面按照面试答题逻辑整理题目覆盖“原理 配置 排错”三个层面。9.1 为什么 Linux 密码不直接存在 /etc/passwd而是存在 /etc/shadow从历史和安全两个角度回答。早期系统把加密密码存在 /etc/passwd这个文件所有用户可读攻击者可以拿到哈希做离线破解。后来把密码移到只有 root 和 shadow 组可读的 /etc/shadow普通用户只能看到 passwd 中的 x 占位符。即使哈希被泄露也无法直接登录系统因为认证过程由 PAM/shadow 机制接管。9.2 /etc/passwd 各个字段含义按顺序说出 7 个字段用户名、密码占位 x、UID、GID、注释信息、家目录、登录 Shell。提到 UID 0 是 root1-999 一般是系统用户1000 以上是普通用户。需要补充一句UID 范围由 /etc/login.defs 控制。9.3 如何强制用户下次登录修改密码chage -d 0 username原理是把 /etc/shadow 第三个字段改成 0表示密码最近修改时间为 1970-01-01系统检测到密码已超过最大使用期限强制用户修改。9.4 useradd 和 adduser 的区别取决于发行版。CentOS/RHEL 中 adduser 等价于 useradd。Debian/Ubuntu 中 adduser 是交互式脚本会自动创建家目录、默认 Shell、密码设置。岗位面试写上 “useradd 是低层命令adduser 是发行版包装脚本” 基本就稳了。9.5 创建用户后系统修改了哪些文件至少答出四个/etc/passwd 新增一行/etc/shadow 新增密码记录/etc/group 创建同样用户名初始组或加入已有组/etc/gshadow 同步更新。如果创建了家目录还涉及 /etc/skel 复制。9.6 UID 修改需要注意什么先看目标用户是否在运行进程ps -u username直接修改 /etc/passwd 里的 UID 不会自动修改用户文件属性需要配合 chownfind /home/username -exec chown 新UID:新GID {} \;还要检查 crontab、邮件、临时目录。面试回答就一句修改 passwd 的 UID 只是改身份标识文件归属必须手工调整。9.7 nologin 和 false 的区别/sbin/nologin 会给用户输出一条提示信息“This account is currently not available”然后退出/bin/false 直接返回非零状态。两者都阻止交互式登录。区别在于 nologin 输出更有意义的提示适合给服务账号使用。邮件服务、FTP 服务常用 nologin。9.8 如何批量创建用户并设置密码用 for 循环for user in user1 user2 user3; do useradd $user echo 初始密码 | passwd --stdin $user 2/dev/null || echo $user:初始密码 | chpasswd doneCentOS 支持 passwd --stdinDebian 不支持chpasswd 通用性最好。9.9 如何排查“用户存在但无法登录”检查顺序/etc/passwd 是否存在用户行/etc/shadow 密码字段是否锁定Shell 是否合法家目录是否存在且权限正确账号是否过期PAM 配置是否拦截。getent passwd username getent shadow username ls -ld /home/username chage -l username10. 排错思路与修复示例日常运维里用户配置文件最常见的故障是手工编辑出错。下面给一套验证流程。检查文件语法一致性。passwd 和 shadow 每个字段都必须完整行数少了会造成系统调用 getpwnam 失败awk -F: NF ! 7 {print bad passwd line:, $0} /etc/passwd awk -F: NF ! 9 {print bad shadow line:, $0} /etc/shadow检查 UID/GID 是否存在引用。用户引用了不存在的 GIDid 命令会显示为数字而不是组名for gid in $(awk -F: {print $4} /etc/passwd); do grep -q ^$gid: /etc/group || echo missing GID: $gid done检查 shadow 密码字段格式。正常哈希应以 $ 或 ! 开头如果出现空密码字段或异常字符按需重置passwd username如果 /etc/shadow 文件权限不对普通用户登录会直接失败。正确权限ls -l /etc/shadow # 应为 -rw-r----- root shadow chmod 640 /etc/shadow chown root:shadow /etc/shadow如果 /etc/passwd 被改坏导致 root 都无法 su可以进入单用户模式或 live CD 挂载根分区修复。平时操作这类关键文件先备份cp /etc/passwd /etc/passwd.bak cp /etc/shadow /etc/shadow.bak终端里执行用户管理命令后不需要重启服务因为 getpwnam、getspnam 每次实时读取文件。部分缓存场景例外比如 NSS 使用 nscd 时修改 group 后可能需清理缓存。11. 用户管理安全边界用户配置文件的权限体系本身就是安全机制。确保以下文件权限不被放宽文件建议权限所有者/etc/passwd644root:root/etc/shadow640 或 600root:shadow 或 root:root/etc/group644root:root/etc/gshadow640 或 600root:shadow 或 root:root/etc/sudoers440root:root/bin/su 和 /usr/bin/sudo 的权限也不能随意放开。检查是否有人通过chmod 666 /etc/passwd之类操作绕过权限注意保证 /etc/shadow 不包含明文密码或空密码。如果确实需要无密码服务账号用 nologin 加锁定密码而不是删除 shadow 密码字段。定时巡检可以用下面命令查看所有用户 UID 0awk -F: $3 0 {print $1, $3, $7} /etc/passwd正常情况下只有 root 的 UID 是 0。出现其他 UID 0 账号需要立刻确认是不是后门账号。12. 总结用户管理文件的核心就一句话用户信息写在 /etc/passwd密码认证在 /etc/shadow组信息在 /etc/group权限提升规则在 /etc/sudoers。创建用户时系统会同时更新 passwd、shadow、group、gshadow家目录模板来自 /etc/skel默认策略由 login.defs 和 default/useradd 控制。面试答题时建议按“字段含义、文件关系、实际排错步骤”的层次展开这样会显得既有理论基础也有动手经验。遇到用户无法登录或权限异常的问题先查文件格式和权限再查密码状态和 sudoers。用 getent 和 id 验证用 chage 查看密码有效期用 visudo 修改 sudo 规则。记住备份文件和最小权限原则绝大部分用户管理类故障都能在两分钟内定位。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询