Linux用户与权限管理看这一篇就够了!从零基础到实战,彻底搞懂用户/组/sudo

Linux用户与权限管理从入门到实战:零基础也能轻松掌握

从“小白懵圈”到“熟练配置”,一文搞定用户、组、权限那些事儿


一、为什么我们要管用户和权限?

想象一下,你租了一间合租房,大门钥匙(root密码)每个人都能复制,今天张三带朋友来,明天李四搬走东西,最后屋里丢了东西都不知道该找谁。Linux系统如果不做用户管理,所有人共用 root 超级管理员,后果就是这样:

  • 没有操作日志——谁动了配置文件?查不到人
  • 误操作风险极高——一个 rm -rf /* 可能让整个服务器瘫痪
  • 权限无边界——开发、测试、运维都用同一个账号,数据库和网站代码随便删

用户管理的核心目标:让“谁、什么时候、做了什么”清清楚楚,同时做到 最小权限原则——每个账号只拥有完成自己工作所必须的权限。


二、用户信息存在哪?三座“档案库”

Linux 把所有用户和组的信息存放在三个文本文件中,它们就是系统账号管理的“户籍档案”:

文件存储内容用途
/etc/passwd用户名、UID、主组ID、家目录、登录Shell基本账户信息(密码已移走)
/etc/shadow加密后的密码、密码过期策略真正存放密码的地方,权限极高
/etc/group组名、GID、组成员列表组信息及成员关系

⚠️ 新手注意:千万不要用 vim 直接编辑这些文件!必须用系统提供的命令(如 useraddusermod)来修改,否则格式出错会导致无法登录。


三、组管理——先把“部门”建好

在创建用户之前,通常先创建组(好比公司先设部门,再招人)。

3.1 创建组 —— groupadd

# 创建一个名为 devops 的组
sudo groupadd devops

# 创建组并指定 GID(组ID)为 3000
sudo groupadd -g 3000 dba

新手常见报错
如果你创建组时提示 group 'xxx' already exists,说明组名已被占用。可以用 -f 强制忽略,或换个组名。

3.2 修改组 —— groupmod

# 把组名 devops 改为 ops
sudo groupmod -n ops devops

# 修改组的 GID 为 4000
sudo groupmod -g 4000 ops

3.3 删除组 —— groupdel

sudo groupdel ops

🚨 踩坑预警:如果某个用户的主组(primary group)正是这个组,那么无法删除该组!你必须先把用户的主组改掉或删除用户,才能删组。


四、用户管理——招人、换岗、离职

4.1 添加用户 —— useradd

# 最简单的创建(Rocky/CentOS 自动建家目录、指定 bash)
sudo useradd dev_user

# Ubuntu 必须加上 -m(创建家目录)和 -s(指定Shell)
sudo useradd -m -s /bin/bash dev_user

# 指定 UID、主组、附加组
sudo useradd -u 2000 -g devops -G dba,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

# 修改用户的 Shell
sudo usermod -s /bin/bash dev_user

# 修改家目录(同时迁移数据)
sudo usermod -d /opt/dev_user -m dev_user

# 添加附加组(千万注意 -a 选项!)
sudo usermod -aG dba dev_user   # ✅ 追加 dba 组
sudo usermod -G dba dev_user    # ❌ 会覆盖掉之前所有的附加组!

新手翻车现场
很多人忘记加 -a,结果用户只剩一个 dba 组,原来在 wheel 等组里的权限全部丢失。记住:-aG 是标配,-G 单独用是重置。

锁定和解锁用户:

# 锁定用户(无法登录)
sudo usermod -L dev_user

# 解锁
sudo usermod -U dev_user

锁定后,/etc/shadow 中该用户密码字段前会多一个 ! 符号。


4.3 删除用户 —— userdel

# 仅删除用户,家目录和邮箱保留
sudo userdel dev_user

# 删除用户并同时删除家目录和邮箱(-r)
sudo userdel -r dev_user

💡 工作场景中,通常建议先备份用户数据,再用 -r 彻底清理,避免遗留孤儿文件。


4.4 设置密码 —— passwdchpasswd

  • 交互式设置(需要输入两次):
sudo passwd dev_user
  • 非交互式(适合脚本)——Rocky 和 Ubuntu 通用
echo "dev_user:MyPass123" | sudo chpasswd

Rocky 还支持 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

# 只改属主
sudo chown dev_user project.log

# 只改属组
sudo chown :devops project.log   # 等价于 chgrp devops project.log

# 同时改属主和属组
sudo chown dev_user:devops project.log

# 递归修改整个目录(-R)
sudo chown -R dev_user:devops /opt/app/

6.2 修改权限 —— chmod

字符模式

# 给属主添加执行权限
chmod u+x script.sh

# 移除属组的读权限
chmod g-r secret.conf

# 精确设置其他人的权限为只读
chmod o=r public.txt

# 给所有人类别赋予读写执行
chmod a=rwx tool

数字模式(更常用):

chmod 755 app.jar       # 属主 rwx,属组 rx,其他人 rx
chmod 640 config.yml    # 属主 rw,属组 r,其他人无
chmod 750 /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 的映射),所以真正要求的是 父目录有写和执行权限

实验验证:

  1. 创建一个目录并给满权限,里面的文件权限设为 000:
mkdir /opt/test
echo "hello" > /opt/test/file.txt
chmod 777 /opt/test
chmod 000 /opt/test/file.txt
  1. 用普通用户尝试删除该文件(需要普通用户对目录有写权限):
rm -f /opt/test/file.txt   # 成功删除!尽管 file.txt 本身是 000
  1. 反过来,如果目录没有写权限,即使文件是 777 也删不掉:
chmod 555 /opt/test        # 目录无写权限
rm -f /opt/test/file.txt   # 报错 Permission denied

结论:删除文件,看的是目录的权限,不是文件本身的权限。


九、权限委派 —— su 与 sudo 的正确用法

9.1 su —— 切换用户身份

su dev_user          # 切换用户,但环境变量、当前目录保留原用户的
su - dev_user        # 切换用户并加载目标用户的环境(推荐)
su - dev_user -c "ls -lh /home/dev_user"   # 切换并执行一条命令

使用 su - root 需要知道 root 密码,并且切换后没有任何审计日志,不推荐在生产使用

9.2 sudo —— 临时提权(推荐)

普通用户执行管理员命令时,只需在自己密码前加 sudo,系统会检查 /etc/sudoers 是否授权。

将用户加入管理员组(最快速获得 sudo 权限):

发行版管理员组默认配置
Rocky / RHELwheel%wheel ALL=(ALL) ALL
Ubuntu / Debiansudo%sudo ALL=(ALL) ALL
# Rocky 中加入 wheel
sudo usermod -aG wheel dev_user

# Ubuntu 中加入 sudo
sudo usermod -aG sudo dev_user

9.3 精细控制 sudo —— 使用 visudo

编辑 /etc/sudoers 或单独文件 /etc/sudoers.d/xxx(推荐后者):

sudo visudo -f /etc/sudoers.d/custom

配置格式
用户/组 主机=(运行身份) 命令

示例:

# 允许 dev_user 执行任何命令(需密码)
dev_user ALL=(ALL) ALL

# 允许 devops 组成员重启 nginx 且无需密码
%devops ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx

# 禁止某用户修改 root 密码
bad_user ALL=(ALL) ALL, !/usr/bin/passwd root

验证权限

sudo -l        # 查看当前用户被允许的命令
sudo -l -U dev_user   # 查看指定用户的 sudo 权限

十、综合实战:为若依项目创建标准化用户体系

场景:公司新部署了一套若依后台管理系统,需要为不同角色分配专属账号和权限。

角色账号所属组权限需求
应用管理员ruoyi-admindevops可重启 Nginx
数据库管理员ruoyi-dbadba可启停 MySQL
开发人员ruoyi-devdeveloper可查看应用日志

实施步骤

1. 创建组

sudo groupadd devops
sudo groupadd dba
sudo groupadd developer

2. 创建用户并加入附加组

sudo useradd -G devops ruoyi-admin
sudo useradd -G dba ruoyi-dba
sudo useradd -G developer ruoyi-dev
# Ubuntu 需加 -m -s /bin/bash

3. 设置统一密码(非交互)

echo "ruoyi-admin:Ruoyi@2026" | sudo chpasswd
echo "ruoyi-dba:Ruoyi@2026" | sudo chpasswd
echo "ruoyi-dev:Ruoyi@2026" | sudo chpasswd

4. 配置 sudo 精细权限

新建 /etc/sudoers.d/ruoyi

%devops ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx
%dba ALL=(ALL) /usr/bin/systemctl start mysqld, /usr/bin/systemctl stop mysqld, /usr/bin/systemctl status mysqld
%developer ALL=(ALL) /usr/bin/tail -f /var/log/ruoyi/*, /usr/bin/cat /var/log/ruoyi/*

5. 验证

sudo -l -U ruoyi-admin
# 应显示可执行 restart 和 status

十一、Rocky Linux 与 Ubuntu 差异速查表

操作Rocky/CentOSUbuntu
创建用户useradd dev_user(自动家目录)useradd -m -s /bin/bash dev_user
非交互密码`echo “123”passwd --stdin user`
管理员组wheelsudo
查看 sudo 日志/var/log/secure/var/log/auth.log

建议跨发行版时统一使用 chpasswdvisudo,确保兼容。


十二、新手常见报错与解决

报错信息原因解决
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未安装 sudodnf 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 临时提权并记录日志,更安全可控。

通过今天的实战练习,你已经能独立完成用户体系搭建、权限分配和日常运维操作。接下来,不妨在自己的虚拟机里动手演练一遍,把每个命令敲出来,遇到报错再看看本文的“踩坑指南”,很快就能熟练于心!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值