☰
Linux用户与组管理:从配置文件到权限控制实战
2026/10/17 4:06:56 网站建设 项目流程

1. 用户管理的底层逻辑:别急着敲命令,先看懂那四个文件

很多人准备CSA(系统管理认证)这类考试时,上来就背useradd的十几个参数,然后到考场上一紧张,参数混了一半。我自己复习的时候也有这个阶段,后来带我的老师傅说了一句点醒我的话:"Linux 里的一切都是文件,用户管理无非就是改那四个文件,命令只是帮你改文件的工具。"

这句话直接改变了我复习的思路。用户和用户组管理确实绕不开/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow这四个文件,你把它们的字段结构吃透了,后面所有命令都变得有据可循,不用硬背。

1.1 /etc/passwd 的结构与解读

这是所有用户信息的"户口本",每个用户占一行,字段之间用冒号分隔,一共7个字段:

用户名:密码占位符:UID:GID:描述信息:家目录:登录Shell
[root@localhost ~]# head -n 5 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

这里有几个容易忽略的点:

  • 第二个字段在早期的 Unix 系统里真的存密码,现在出于安全考虑统一存成x,真正的密码挪到了/etc/shadow。看到x说明系统启用了 shadow 密码机制。
  • UID 0 是超级用户,这是硬编码特权,不是看用户名是不是 root。你把某个用户改成 UID 0,它就和 root 权限一样了。考试里有时候会拿这个做文章。
  • UID 1-999 一般是系统用户,CentOS 7 之后这个区间是 1-999,普通用户从 1000 开始。很多考试题会问"创建一个系统用户"要用哪个参数,其实就是-r。

1.2 /etc/shadow 的密码策略

/etc/shadow里存的是加密后的密码和密码策略信息,普通用户没权限读,只有 root 能看到。

[root@localhost ~]# awk -F: '{print $1, $2}' /etc/shadow root $6$9RK6Ad9z$QyOQ5p0CjVWPk... daemon !! bin !!

格式上是9个字段,重点记这几个:

  • 第一个是用户名,要和/etc/passwd对应。
  • 第二个是加密后的密码,!!或!*表示这个用户没有可用密码,无法直接登录。
  • 第三个是最后一次修改密码的时间,注意单位是"从 1970 年 1 月 1 日算起的天数",不是时间戳。有些同学用chage -l 用户名查看的时候会疑惑那个"Last password change"的日期,就是这个字段换算出来的。
  • 后面还跟着最短修改天数、最长使用天数、到期提醒天数、宽限天数等策略值,都可以用chage命令调整。

1.3 /etc/group 和 /etc/gshadow

/etc/group里维护用户组信息,格式也简单:

组名:组密码占位符:GID:组成员列表
[root@localhost ~]# grep devops /etc/group devops:x:1001:zhangsan,lisi

最后一个字段是"这个组额外包含的用户",如果用户的基本组就是这个组,通常不会重复列在这里。这个细节经常有人搞混,记住基本组信息其实写在/etc/passwd的 GID 字段里,/etc/group最后一个字段存的是附属组信息。

/etc/gshadow是组密码,里面存的是组管理员的权限信息,日常很少用到,但考试偶尔会问组密码是什么文件管理的。

这四个文件的关系可以这样理解:/etc/passwd记录用户是谁,/etc/shadow记录用户的钥匙(密码),/etc/group记录有哪些群组,/etc/gshadow记录群组的钥匙。命令只是这些文件的"中间商",所以排查问题的时候,第一反应应该是直接看文件内容有没有被改坏。

2. 用户管理命令:从创建到删除的完整闭环

文件逻辑搞清楚了,再来敲命令就是水到渠成的事。我建议你按"创建用户 -> 修改用户 -> 设置密码 -> 删除用户"这条线来复习,每个环节都手动过一遍,不要光看文档。

2.1 useradd 的参数详解与使用场景

useradd是创建用户的核心命令,常见参数有:

useradd -u 1200 zhangsan # 指定 UID useradd -g devops zhangsan # 指定基本组(组必须存在) useradd -G devops,qa zhangsan # 指定附加组,多个组用逗号分隔 useradd -d /data/zhangsan zhangsan # 指定家目录 useradd -s /sbin/nologin zhangsan # 指定登录 Shell useradd -M zhangsan # 不创建家目录 useradd -r zhangsan # 创建系统用户(UID 在系统范围内)

几个容易踩坑的细节:

  • -g和-G的区别必须记牢,-g是基本组,-G是附加组。基本组在/etc/passwd里表现为 GID,附加组体现在/etc/group最后一个字段。如果-g指定的组不存在,命令直接报错;但-G指定的组不存在,有些发行版会直接忽略或者报错,CentOS 上是会报错的。
  • -d指定家目录路径,但如果不加-m(或-M的相反),默认并不会帮你创建这个家目录。很多新手以为指定了-d目录就自动建好了,结果ls /home一看是空的。实际组合一般是-d 路径 -m,-m才会创建目录并拷贝骨架文件。
  • 不指定-s时,系统会使用/etc/default/useradd里的默认 Shell,CentOS 默认是/bin/bash。检查一个用户能不能用来登录系统,不只要看密码,还要看 Shell 是不是/sbin/nologin。
  • -r创建系统用户时,不会创建家目录,这是默认行为。如果你需要系统用户有家目录,得手动指定,这种情况一般是为了跑服务。

2.2 usermod 的修改技巧

usermod的很多参数和useradd是重叠的,可以理解为"把已存在用户改造成新状态":

usermod -l newname zhangsan # 改名(login name) usermod -L zhangsan # 锁定用户密码 usermod -U zhangsan # 解锁用户密码 usermod -aG devops zhangsan # 追加附加组(-a 必须和 -G 一起用) usermod -g newgroup zhangsan # 修改基本组 usermod -d /new/home -m zhangsan # 修改家目录并移动内容

这里最重要的一条经验是:修改附加组时,如果没加-a,用户原来的附加组会被清掉。我有一次在生产环境上想把某个同事加进新项目组,写成了usermod -G projectx tom,结果把 tom 原本所在的 devops、qa 组全踢出去了,那兄弟立刻失去了一堆权限。正确写法是:

usermod -aG projectx tom

这条在考试里基本必考,务必刻进记忆。

2.3 userdel 删除用户的正确姿势

删除用户是看似简单、实则危险的操作。基础命令是:

userdel zhangsan # 只删除用户,不删家目录和邮件池 userdel -r zhangsan # 删除用户及家目录

-r会把用户的家目录、邮件池一起删掉,但如果用户家目录下有别的服务数据,或者用户是很多文件的所有者,删除后那些文件会变成 UID 对应的"孤儿文件",ls -l看过去就是一个数字 ID。这是生产环境上非常容易踩的坑。

所以我的习惯是:删除前先查一下这个用户所有了哪些文件,可以用find / -user zhangsan扫一遍,确认没有重要数据再动手。如果文件太多,更稳妥的方式是把文件先chown -R给其他用户,再删除原用户。

2.4 passwd 与密码策略设置

创建完用户就要设置密码,passwd的常见用法:

passwd zhangsan # root 给指定用户改密码 passwd -l zhangsan # 锁定密码(等同于 usermod -L) passwd -u zhangsan # 解锁 passwd -n 7 zhangsan # 最短 7 天才能改密码 passwd -x 90 zhangsan # 最长 90 天必须改密码 passwd -w 7 zhangsan # 提前 7 天提醒 passwd -e zhangsan # 强制用户下次登录改密码

如果只是普通用户想改自己的密码,直接敲passwd,系统会让你先输旧密码再输新密码。但是 root 给普通用户设密码时不需要知道旧密码。

chage命令算是passwd策略参数的"高级版",它还可以设置账户过期时间:

chage -l zhangsan # 查看完整的密码策略 chage -M 90 zhangsan # 密码最长使用 90 天 chage -E 2025-12-31 zhangsan # 账户在指定日期过期

实操里我经常用chage -E给临时外包账号设置有效期,到期自动失效,省得手动清理。

3. 用户组管理:权限分配的幕后功臣

很多新手觉得用户组管理就是创建组、加人,没什么好学的。但放到实际运维里,组策略是权限控制的基石——你不可能给 100 个人直接发文件权限,而是建两三个组,把人归进去,一劳永逸。

3.1 groupadd/groupmod/groupdel

用户组的增删改命令和用户的玩法很像:

groupadd devops # 创建组,默认 GID 从 1000+ 分配 groupadd -g 1500 qa # 指定 GID groupadd -r sysgroup # 创建系统组 groupmod -n newname devops # 改组名 groupmod -g 1600 devops # 改 GID groupdel qa # 删除组

删除组的时候有个限制:如果一个用户的"基本组"是这个组,那么删不掉,系统会提示组 busy。除非把这个用户的usermod -g改到别的组,或者先删除该用户,然后才能把组删掉。这个和 Windows 的"某文件夹被占用无法删除"有点像。

3.2 附属组的切换与临时身份

用户登录后的基本组是/etc/passwd里指定的 GID。如果你想临时切换到某个附属组,有两条路:

newgrp devops # 切换当前 Shell 的基本组为 devops sg devops -c "touch /data/test" # 以 devops 组身份执行单条命令

newgrp会启动一个新的 Shell,环境变量$GROUPS会变,退出这个 Shell 就回到原来的组。这个命令平时用得少,但在考试里经常出现在"以组身份创建文件"的场景题中。还有一种更干净的做法是用su指定临时身份:

su - zhangsan -c "id"

借助id命令可以快速确认当前用户的 UID、GID 和所有组:

[root@localhost ~]# id zhangsan uid=1001(zhangsan) gid=1001(zhangsan) groups=1001(zhangsan),1002(devops)

这个输出非常直观,是我排查权限问题时第一个会执行的命令。

来一道经典的练习题场景:有个同事说"我在某服务器上明明属于 devops 组,但创建出来的文件组却是别的",原因多半是他在新开的终端里还没有重新加载组信息。用户登录时组信息就被加载进会话了,中途被加入新组的话,要么重新登录,要么用newgrp刷新。

4. 权限管理:用户和组存在的最终意义

用户和用户组本身不是目的,权限才是。这一节我把文件权限串一遍,因为 CSA 考试里用户管理和文件权限经常会综合出题,比如"新建一个目录,让某组成员能读写,其他人都不能进"。

4.1 文件权限的三元组与特殊权限

一个文件的权限位从ls -l输出里可以直接看到:

[root@localhost ~]# ls -l test.sh -rwxr--r--. 1 root root 52 Jan 10 10:30 test.sh

第一位是文件类型,-表示普通文件,d表示目录,l是软链接,还有b/c/s/p等,不常见但知道一下没坏处。后面九位分成三组,分别属于属主、属组、其他人,每组三位,顺序是 r(读)、w(写)、x(执行)。

在目录上,权限的含义和文件完全不一样,很多人会在这里栽跟头:

  • 目录的r:可以列出目录内容,比如ls能看到文件名列表。
  • 目录的w:可以在目录里创建、删除、改名文件或子目录。
  • 目录的x:可以进入目录(cd),也可以遍历目录中的文件,访问文件时需要有路径上所有目录的x权限。

只给rw不给x,你只能看到目录里的文件名,但无法cd进去,也无法读取里面任何文件的元数据。反过来,只有x没有r,你可以cd进去,但看不到目录里有哪些文件。实际分配目录权限时,最常用的组合是755(可读可执行可进入,无需写)和2770(带组粘滞位,后面细说)。

特殊权限位有三个,考试常客:

  • setuid(SUID):数字上表现为 4,对可执行文件生效,效果是"执行者临时获得文件属主的身份"。经典例子是/usr/bin/passwd,普通用户执行它时能临时以 root 身份改/etc/shadow。
[root@localhost ~]# ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 34976 Mar 15 2023 /usr/bin/passwd
  • setgid(SGID):数字上表现为 2,对目录生效,效果是"在该目录下新建的文件和子目录,组自动继承当前目录的组"。

  • sticky bit(粘滞位):数字上表现为 1,对目录生效,效果是"只有文件属主、目录属主或 root 才能删除该目录下的文件"。典型场景是/tmp。

[root@localhost ~]# ls -ld /tmp drwxrwxrwt. 19 root root 4096 Jan 10 10:35 /tmp

chmod设置特殊权限的写法有两种:

chmod 1777 /tmp/public # 用四位数字,1 是粘滞位 chmod u+s /usr/local/bin/tool # 加 SUID chmod g+s /data/project # 加 SGID chmod +t /tmp/public # 加粘滞位

4.2 chown/chmod 的实际组合玩法

日常中权限管理极其频繁,但组合路数其实有迹可循。举个例子,你想给运维组的同事开一个共享目录:

mkdir -p /data/shared chown root:devops /data/shared # 属主 root,属组 devops chmod 2770 /data/shared # 带 SGID,属主和组内成员可读写执行,其他人无权进入

这里用了 SGID,保证任何属于 devops 组的用户在这个目录下新建的文件,组自动变成 devops,不会因为创建人的基本组不同而乱套。如果不加 SGID,一个新用户如果基本组是 devops 还好,如果基本组是别的、只是附加组在这里,新建的文件组就会错乱,落地必须加2770。

如果要把整个目录递归改掉:

chown -R root:devops /data/shared chmod -R 770 /data/shared

不过-R有风险,它会把目录里所有已经设置好的 SUID 权限也一并重置,有时会误伤。更精准的做法是只对目录本身加 SGID,用find找出特殊的文件单独处理。

5. 常见问题与排查实录

这部分是我在真实环境里反复遇到的坑,整理成一个速查表,考试前看一遍,突发故障时拿出来对照。

故障现象可能原因排查思路解决办法
用户登录时报"no shell"该用户的登录 Shell 指向了不存在的程序grep 用户名 /etc/passwd看最后一个字段usermod -s /bin/bash 用户名修正
用户输入正确密码却登录失败密码被passwd -l锁定,或/etc/shadow对应字段为!/*passwd -S 用户名查看状态passwd -u 用户名解锁
用户能登录但没有家目录创建时用了-M或家目录被误删检查/etc/passwd的家目录字段是否指向真实存在的目录手动mkdir并用cp -r /etc/skel/.初始化
以某用户身份创建的文件属组不对用户是从多个 Shell 会话登录的,组信息没刷新退出重登或用newgrp 组名刷新确认用户的附加组是否包含正确组
删除的用户留下大量孤儿文件删除前未转移或确认文件属主find / -nouser -ls找出孤儿文件chown -R 新用户:新组接管
忘记 root 密码单用户模式重置重启进入 rescue 模式或单用户模式passwd重置,后执行touch /.autorelabel(如系统启用 SELinux)
目录设置了 777 但用户还是进不去路径上某个层级的目录没有x权限逐层ls -ld检查给中间层目录补上x权限

5.1 细致排查技巧

排查权限问题时,有一个我屡试不爽的小套路,先从id确认身份,然后逐层检查路径权限:

[root@localhost ~]# id lisi uid=1003(lisi) gid=1003(lisi) groups=1003(lisi) [root@localhost ~]# ls -ld /data /data/project /data/project/docs drwxr-xr-x. 3 root root 4096 Jan 10 09:00 /data drwxrwx---. 2 root devops 4096 Jan 10 09:05 /data/project drwxr-xr-x. 2 root root 4096 Jan 10 09:10 /data/project/docs

lisi 不属于 devops 组,虽然/data/project是 770,但他在第一层/data/project就连cd进去的权限都没有,更别提访问里面的 docs。这时候正确的做法是把 lisi 加进 devops 组:

usermod -aG devops lisi

同时提醒他退掉现有会话重新登录生效。很多人把这个流程背下来并不难,难的是实际排障时想不到"一层层往上查",因为路径中间某一层如果没有x,就会被系统拦住,和最后一层权限没关系。

5.2 用户删除后的密集排障

我再分享一个真实事故。某次我把一个离职同事的账号userdel -r删掉之后,第二天发现他之前负责的定时任务目录整个没法访问,ls -l一看全是数字 UID:

[root@localhost ~]# ls -ld /data/scripts drwx------. 1007 root 4096 Jan 9 23:10 /data/scripts

那个1007就是被删用户的 UID。因为目录是 700,root 能进,但是新接手的人没法操作。解决办法很简单:

find /data/scripts -user 1007 -exec chown zhangsan:devops {} \;

如果文件很多,用find加-exec会比chown -R更精准,只处理属于特定 UID 的文件,不会动别人的权限。

5.3 UID 冲突与权限异常

还有一种隐蔽的权限问题来自 UID 重用。老用户删了,新用户创建时被系统分配了相同的 UID,结果新用户"继承"了不属于他的文件所有权。这是 Linux 用户管理的经典隐患,生产环境上应该尽量避免复用 UID。

我处理这类事情的思路是:如果公司内部使用 LDAP 或集中认证,以统一账号体系为主,本地用户尽量只作为系统用户存在。如果确实需要在本地创建用户,给每个用户固定 UID,并登记在案,避免复用。

6. 一条龙的复习实操清单

如果你正要参加 CSA 或类似认证的考试,我给你一套自测流程,你跟着做一遍,基本就能覆盖用户和用户组管理的绝大部分考点。

# 第 1 步:创建用户和组 groupadd -g 2000 devops useradd -u 1500 -g devops -G wheel -d /home/zhangsan -m zhangsan echo "Passw0rd!" | passwd --stdin zhangsan # 第 2 步:验证身份信息 id zhangsan grep -E "zhangsan|devops" /etc/passwd /etc/group /etc/shadow # 第 3 步:测试文件权限 mkdir /data/project chown root:devops /data/project chmod 2770 /data/project su - zhangsan -c "touch /data/project/test.txt && ls -l /data/project/test.txt" # 第 4 步:设置密码策略 chage -M 90 -W 7 zhangsan chage -l zhangsan | grep -E "Maximum|Warning" # 第 5 步:创建共享目录测试 SGID newgrp devops umask 002 touch /data/project/newfile ls -l /data/project/newfile # 第 6 步:锁定与解锁 usermod -L zhangsan passwd -S zhangsan usermod -U zhangsan # 第 7 步:清理用户(确认没有孤儿文件后) userdel -r zhangsan groupdel devops

每一步执行完都手动cat /etc/passwd、cat /etc/group去核对文件内容,这比单纯看命令输出更能加深理解。

6.1 核心考点速查

再强调几个考试高频点:

  • useradd默认创建用户的同时是否创建家目录?在 CentOS 上默认创建,前提是没有-M。
  • 普通用户可以修改自己的密码吗?可以,但必须符合密码复杂度策略(如果配置了 PAM)。
  • usermod -G和-aG的区别?后者是追加,前者是覆盖。
  • 目录的哪三个权限影响"能否在里面创建文件"?需要写权限w和执行权限x。
  • 删除组时提示 busy 怎么办?先把用户从该基本组移走或删除用户,再删组。
  • /etc/passwd中用户字段缺失,会导致什么?登录时getpwnam返回空,用户无法通过认证。

6.2 每天一个练手小项目

如果时间充足,建议在虚拟机里搭一个小场景:创建三个用户,建两个组,设计一套目录权限,让 A 组的两个用户能互相读写共享目录,但 B 组的用户看不到,甚至连这个目录的存在都发现不了。这种场景不复杂,但能把用户组、目录权限、SGID、umask、newgrp 全部串起来,是我当年复习时觉得最有效率的方式。

另外一个小技巧:平时复习时多折腾几台不同发行版的虚拟机,CentOS 和 Ubuntu 在用户管理上有个经典差异——CentOS 里useradd默认创建家目录,而 Ubuntu 里更推荐adduser(交互式),但底层记录文件是完全一致的。考试按哪个发行版来就以哪个为准,实际运维中记住机制本身更重要。

用超过 90 天的口令策略或者账户过期时间这类题目,直接用chage验证,马上就能看到字段变化。多动手敲几遍之后,再看到题目你会觉得所有配置项都似曾相识,而不是靠临时回忆参数。

我个人在实际操作中的体会是,用户管理可能是 Linux 考试里最"背了就会"的部分,但也是生产环境最容易出事故的部分。命令参数记错可以靠 man 手册兜底,真正吃透的还是那四个文件的作用机制——权限链路的每一步都从文件开始,最终也必须回归到文件去确认。希望你复习时也能先把文件逻辑理顺,再去玩命令,这样无论题目怎么变,你都能站得住脚。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询