Linux用户与权限管理从入门到实战:零基础也能轻松掌握
从“小白懵圈”到“熟练配置”,一文搞定用户、组、权限那些事儿
一、为什么我们要管用户和权限?
想象一下,你租了一间合租房,大门钥匙(root密码)每个人都能复制,今天张三带朋友来,明天李四搬走东西,最后屋里丢了东西都不知道该找谁。Linux系统如果不做用户管理,所有人共用 root 超级管理员,后果就是这样:
- 没有操作日志——谁动了配置文件?查不到人
- 误操作风险极高——一个
rm -rf /*可能让整个服务器瘫痪 - 权限无边界——开发、测试、运维都用同一个账号,数据库和网站代码随便删
用户管理的核心目标:让“谁、什么时候、做了什么”清清楚楚,同时做到最小权限原则——每个账号只拥有完成自己工作所必须的权限。
二、用户信息存在哪?三座“档案库”
Linux 把所有用户和组的信息存放在三个文本文件中,它们就是系统账号管理的“户籍档案”:
| 文件 | 存储内容 | 用途 |
|---|---|---|
/etc/passwd | 用户名、UID、主组ID、家目录、登录Shell | 基本账户信息(密码已移走) |
/etc/shadow | 加密后的密码、密码过期策略 | 真正存放密码的地方,权限极高 |
/etc/group | 组名、GID、组成员列表 | 组信息及成员关系 |
⚠️新手注意:千万不要用
vim直接编辑这些文件!必须用系统提供的命令(如useradd、usermod)来修改,否则格式出错会导致无法登录。
三、组管理——先把“部门”建好
在创建用户之前,通常先创建组(好比公司先设部门,再招人)。
3.1 创建组 ——groupadd
# 创建一个名为 devops 的组sudogroupadddevops# 创建组并指定 GID(组ID)为 3000sudogroupadd-g3000dba新手常见报错:
如果你创建组时提示group 'xxx' already exists,说明组名已被占用。可以用-f强制忽略,或换个组名。
3.2 修改组 ——groupmod
# 把组名 devops 改为 opssudogroupmod-nops devops# 修改组的 GID 为 4000sudogroupmod-g4000ops3.3 删除组 ——groupdel
sudogroupdelops🚨踩坑预警:如果某个用户的主组(primary group)正是这个组,那么无法删除该组!你必须先把用户的主组改掉或删除用户,才能删组。
四、用户管理——招人、换岗、离职
4.1 添加用户 ——useradd
# 最简单的创建(Rocky/CentOS 自动建家目录、指定 bash)sudouseradddev_user# Ubuntu 必须加上 -m(创建家目录)和 -s(指定Shell)sudouseradd-m-s/bin/bash dev_user# 指定 UID、主组、附加组sudouseradd-u2000-gdevops-Gdba,developer app_admin关于主组 vs 附加组(新手最晕的):
- 主组(Primary Group):每个用户必须有且只有一个,新建文件时默认所属组就是它。
- 附加组(Supplementary Groups):可以有 0 个或多个,用于授予额外权限(比如让开发人员临时加入运维组)。
创建用户时,如果不指定-g,系统会自动创建一个与用户名同名的组作为主组。
常用选项一览:
| 选项 | 含义 | 备注 |
|---|---|---|
-m | 创建家目录 | Rocky 可省,Ubuntu 必加 |
-s | 指定登录 Shell | 如/bin/bash或/sbin/nologin(禁止登录) |
-u | 指定 UID | |
-g | 指定主组 | 组必须已存在 |
-G | 指定附加组 | 多个组用逗号分隔 |
-r | 创建系统用户(无家目录,不可登录) | 用于运行服务进程 |
4.2 修改用户 ——usermod
# 修改用户的 Shellsudousermod-s/bin/bash dev_user# 修改家目录(同时迁移数据)sudousermod-d/opt/dev_user-mdev_user# 添加附加组(千万注意 -a 选项!)sudousermod-aGdba dev_user# ✅ 追加 dba 组sudousermod-Gdba dev_user# ❌ 会覆盖掉之前所有的附加组!新手翻车现场:
很多人忘记加-a,结果用户只剩一个dba组,原来在wheel等组里的权限全部丢失。记住:-aG是标配,-G单独用是重置。
锁定和解锁用户:
# 锁定用户(无法登录)sudousermod-Ldev_user# 解锁sudousermod-Udev_user锁定后,/etc/shadow中该用户密码字段前会多一个!符号。
4.3 删除用户 ——userdel
# 仅删除用户,家目录和邮箱保留sudouserdeldev_user# 删除用户并同时删除家目录和邮箱(-r)sudouserdel-rdev_user💡 工作场景中,通常建议先备份用户数据,再用
-r彻底清理,避免遗留孤儿文件。
4.4 设置密码 ——passwd与chpasswd
- 交互式设置(需要输入两次):
sudopasswddev_user- 非交互式(适合脚本)——Rocky 和 Ubuntu 通用:
echo"dev_user:MyPass123"|sudochpasswdRocky 还支持
echo "MyPass123" | passwd --stdin dev_user,但 Ubuntu 不支持,所以推荐统一用chpasswd。
五、Linux 权限模型 UGO —— 文件三权分立
Linux 中每个文件/目录都有属主(User)、属组(Group)和其他人(Other)三类访问者,各自拥有一套读(r)、写(w)、执行(x)权限。
5.1 rwx 对文件和目录的“大不同”
| 权限 | 对文件的意义 | 对目录的意义 |
|---|---|---|
| r(读) | 可以cat查看文件内容 | 可以ls罗列文件夹内全部资源(需配合 x) |
| w(写) | 可以vim修改内容 | 可以在目录内创建、删除、重命名文件(需配合 x) |
| x(执行) | 可以运行该程序/脚本 | 可以cd进入目录,是访问内部文件的前提 |
新手容易犯的错误:给目录只赋
r权限而没有x,导致无法cd进去,只能看名字却进不去。
5.2 权限表示法
- 字符法:
rwxr-x---
前三位属主(rwx)、中三位属组(r-x)、后三位其他人(—)。 - 数字法:将每组 rwx 视为二进制,有权限为1,无则为0,转十进制。
rwx= 111 = 7,r-x= 101 = 5,---= 000 = 0 → 750。
六、修改权限与属主 —— 日常高频操作
6.1 修改属主属组 ——chown/chgrp
# 只改属主sudochowndev_user project.log# 只改属组sudochown:devops project.log# 等价于 chgrp devops project.log# 同时改属主和属组sudochowndev_user:devops project.log# 递归修改整个目录(-R)sudochown-Rdev_user:devops /opt/app/6.2 修改权限 ——chmod
字符模式:
# 给属主添加执行权限chmodu+x script.sh# 移除属组的读权限chmodg-r secret.conf# 精确设置其他人的权限为只读chmodo=r public.txt# 给所有人类别赋予读写执行chmoda=rwx tool数字模式(更常用):
chmod755app.jar# 属主 rwx,属组 rx,其他人 rxchmod640config.yml# 属主 rw,属组 r,其他人无chmod750/opt/data# 属主 rwx,属组 rx,其他人无七、权限掩码 umask —— 新文件默认权限从哪来?
每次你创建新文件或目录,系统都会根据umask值计算默认权限。
- 计算公式:
文件默认权限 = 666 - umask
目录默认权限 = 777 - umask
查看当前 umask:
umask# 输出 0022(普通用户可能 0002)当 umask = 022 时:
新文件 → 666 - 022 = 644(-rw-r--r--)
新目录 → 777 - 022 = 755(drwxr-xr-x)当 umask = 027 时:
新文件 → 666 - 027 = 640(-rw-r-----)
新目录 → 777 - 027 = 750(drwxr-x---)
临时修改:umask 027
永久修改:写入~/.bashrc或/etc/profile。
🧠 很多新手以为 umask 是“减掉”的权限,实际是“屏蔽”的权限位。例如 umask 为 022,就是屏蔽掉属组的写权限和其他的写权限。
八、删除文件的本质 —— 为什么需要目录的写权限?
很多人误以为删除文件需要文件本身有写权限。其实不然!
删除文件实际上是在父目录中删除该文件的条目(文件名与 inode 的映射),所以真正要求的是父目录有写和执行权限。
实验验证:
- 创建一个目录并给满权限,里面的文件权限设为 000:
mkdir/opt/testecho"hello">/opt/test/file.txtchmod777/opt/testchmod000 /opt/test/file.txt- 用普通用户尝试删除该文件(需要普通用户对目录有写权限):
rm-f/opt/test/file.txt# 成功删除!尽管 file.txt 本身是 000- 反过来,如果目录没有写权限,即使文件是 777 也删不掉:
chmod555/opt/test# 目录无写权限rm-f/opt/test/file.txt# 报错 Permission denied结论:删除文件,看的是目录的权限,不是文件本身的权限。
九、权限委派 —— su 与 sudo 的正确用法
9.1 su —— 切换用户身份
sudev_user# 切换用户,但环境变量、当前目录保留原用户的su- dev_user# 切换用户并加载目标用户的环境(推荐)su- dev_user-c"ls -lh /home/dev_user"# 切换并执行一条命令使用
su - root需要知道 root 密码,并且切换后没有任何审计日志,不推荐在生产使用。
9.2 sudo —— 临时提权(推荐)
普通用户执行管理员命令时,只需在自己密码前加sudo,系统会检查/etc/sudoers是否授权。
将用户加入管理员组(最快速获得 sudo 权限):
| 发行版 | 管理员组 | 默认配置 |
|---|---|---|
| Rocky / RHEL | wheel | %wheel ALL=(ALL) ALL |
| Ubuntu / Debian | sudo | %sudo ALL=(ALL) ALL |
# Rocky 中加入 wheelsudousermod-aGwheel dev_user# Ubuntu 中加入 sudosudousermod-aGsudodev_user9.3 精细控制 sudo —— 使用visudo
编辑/etc/sudoers或单独文件/etc/sudoers.d/xxx(推荐后者):
sudovisudo-f/etc/sudoers.d/custom配置格式:用户/组 主机=(运行身份) 命令
示例:
# 允许 dev_user 执行任何命令(需密码)dev_userALL=(ALL)ALL# 允许 devops 组成员重启 nginx 且无需密码%devopsALL=(ALL)NOPASSWD: /usr/bin/systemctl restart nginx# 禁止某用户修改 root 密码bad_userALL=(ALL)ALL,!/usr/bin/passwd root验证权限:
sudo-l# 查看当前用户被允许的命令sudo-l-Udev_user# 查看指定用户的 sudo 权限十、综合实战:为若依项目创建标准化用户体系
场景:公司新部署了一套若依后台管理系统,需要为不同角色分配专属账号和权限。
| 角色 | 账号 | 所属组 | 权限需求 |
|---|---|---|---|
| 应用管理员 | ruoyi-admin | devops | 可重启 Nginx |
| 数据库管理员 | ruoyi-dba | dba | 可启停 MySQL |
| 开发人员 | ruoyi-dev | developer | 可查看应用日志 |
实施步骤:
1. 创建组
sudogroupadddevopssudogroupadddbasudogroupadddeveloper2. 创建用户并加入附加组
sudouseradd-Gdevops ruoyi-adminsudouseradd-Gdba ruoyi-dbasudouseradd-Gdeveloper ruoyi-dev# Ubuntu 需加 -m -s /bin/bash3. 设置统一密码(非交互)
echo"ruoyi-admin:Ruoyi@2026"|sudochpasswdecho"ruoyi-dba:Ruoyi@2026"|sudochpasswdecho"ruoyi-dev:Ruoyi@2026"|sudochpasswd4. 配置 sudo 精细权限
新建/etc/sudoers.d/ruoyi:
%devopsALL=(ALL)/usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx %dbaALL=(ALL)/usr/bin/systemctl start mysqld, /usr/bin/systemctl stop mysqld, /usr/bin/systemctl status mysqld %developerALL=(ALL)/usr/bin/tail-f/var/log/ruoyi/*, /usr/bin/cat /var/log/ruoyi/*5. 验证
sudo-l-Uruoyi-admin# 应显示可执行 restart 和 status十一、Rocky Linux 与 Ubuntu 差异速查表
| 操作 | Rocky/CentOS | Ubuntu |
|---|---|---|
| 创建用户 | useradd dev_user(自动家目录) | useradd -m -s /bin/bash dev_user |
| 非交互密码 | `echo “123” | passwd --stdin user` |
| 管理员组 | wheel | sudo |
| 查看 sudo 日志 | /var/log/secure | /var/log/auth.log |
建议跨发行版时统一使用
chpasswd和visudo,确保兼容。
十二、新手常见报错与解决
| 报错信息 | 原因 | 解决 |
|---|---|---|
useradd: group 'xxx' does not exist | 附加组未提前创建 | 先用groupadd建组 |
usermod: group 'xxx' does not exist | 同上 | 检查组名拼写 |
userdel: user xxx is currently used by process | 用户正在登录 | 强制踢出或用-f |
sudo: command not found | 未安装 sudo | dnf install sudo/apt install sudo |
permission denied删除文件 | 父目录缺少 w 权限 | chmod +w父目录 |
chmod: cannot access 'file' | 文件路径错误或权限不足 | 检查路径及当前身份 |
总结
- 用户管理三文件:
/etc/passwd、/etc/shadow、/etc/group,命令操作是正道,千万别手动改。 - 组与主/附加组:主组只有一个,附加组可多个,
-aG是追加的好朋友。 - 权限模型 UGO:r、w、x 对文件和目录含义不同,目录必须有 x 才能进入。
- 删除文件看目录:目录有 w 权限就能删,和文件本身无关。
- sudo 胜过 su:su 切换无审计,sudo 临时提权并记录日志,更安全可控。
通过今天的实战练习,你已经能独立完成用户体系搭建、权限分配和日常运维操作。接下来,不妨在自己的虚拟机里动手演练一遍,把每个命令敲出来,遇到报错再看看本文的“踩坑指南”,很快就能熟练于心!