从 su 到 sudo:Linux 提权的 “进化史”
Linux提权管理
su命令
切换当前登录用户,默认需要目标用户密码
# 普通用户myz执行su命令,切换到root身份(不带-参数,仅切换用户,不加载root的完整环境变量)[myz@centos7 ~13:57:03]$suPassword:[root@centos7 myz13:57:07]# env | grep myz# 输出结果说明:此时环境变量仍保留大量myz用户的信息(如USER、PWD、MAIL、PATH等),这是su不带-参数的特点HOSTNAME=centos7.myz.cloudUSER=myzPATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/myz/.local/bin:/home/myz/binMAIL=/var/spool/mail/myzPWD=/home/myzLOGNAME=myzXDG_DATA_DIRS=/home/myz/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share# 执行su -l(等同于su -),完全切换到root用户环境,重置所有环境变量[root@centos7 myz13:57:24]# su -lLast login: Sat Jul1813:57:07 CST2026on pts/1# 再次检查环境变量,已无myz相关信息,仅保留主机名[root@centos7 ~13:57:41]# set | grep myzHOSTNAME=centos7.myz.cloud# 非交互式为用户laowang设置密码,--stdin参数支持从标准输入读取密码(适合脚本场景)[root@centos7 ~13:58:01]# echo 123 | passwd --stdin laowangChanging passwordforuser laowang. passwd: all authentication tokens updated successfully.# 查看/etc/passwd文件中laowang用户的基本信息[root@centos7 ~13:59:04]# grep laowang /etc/passwdlaowang:x:1001:1001::/home/laowang:/bin/bash# 以laowang用户身份执行id命令,-c参数用于指定要执行的命令[root@centos7 ~13:59:25]# su -l laowang -c iduid=1001(laowang)gid=1001(laowang)groups=1001(laowang)context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023# 以laowang用户身份执行cat /etc/hosts命令,带单引号包裹命令[root@centos7 ~13:59:48]# su -l laowang -c 'cat /etc/hosts'127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6# 以laowang用户身份执行cat /etc/hosts命令,不带引号(效果同上,此处输出hello为自定义内容)[root@centos7 ~13:59:48]# su -l laowang -c cat /etc/hostshello hello# 以myz身份执行touch haha,当前在root家目录,myz无写入权限,报错权限不足[root@centos7 ~14:00:42]# su -c 'touch haha' myztouch: cannottouch‘haha’: Permission denied# 查看/etc/passwd中adm用户信息,其登录Shell为/sbin/nologin,禁止交互式登录[root@centos7 ~14:02:59]# grep adm /etc/passwdadm:x:3:4:adm:/var/adm:/sbin/nologin# 直接切换adm用户执行命令,因Shell为nologin,提示账号不可用[root@centos7 ~14:03:17]# su -l adm -c idThis account is currently not available.# 临时指定Shell为/bin/bash,绕过nologin限制,成功执行id命令查看用户信息[root@centos7 ~14:03:27]# su -l adm -s /bin/bash -c iduid=3(adm)gid=4(adm)groups=4(adm)context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023# 临时指定bash作为登录shell,登录adm账号,因缺少环境配置文件,终端仅显示简易提示符[root@centos7 ~14:03:59]# su -l adm -s /bin/bashLast login: Sat Jul1814:03:44 CST2026on pts/1 -bash-4.2$# 按Ctrl+C中断操作-bash-4.2$ ^C# 退出adm用户,回到root-bash-4.2$logout[root@centos7 ~14:04:57]## 再次查看adm用户信息,登录shell仍为/sbin/nologin,未做永久修改[root@centos7 ~14:04:57]# grep adm /etc/passwdadm:x:3:4:adm:/var/adm:/sbin/nologin# 拷贝系统默认环境配置文件到adm家目录/var/adm,补齐登录环境[root@centos7 ~14:05:11]# cp /etc/skel/{.bash_profile,.bashrc} /var/adm# 再次临时指定bash登录adm,加载新拷贝的环境文件,登录正常[root@centos7 ~14:05:22]# su adm -l -s /bin/bashLast login: Sat Jul1814:04:53 CST2026on pts/1补充知识点:
su 与 su - 的区别:
su:仅切换用户身份,不重置环境变量(如当前目录、PATH、USER 等),常用于临时提权但保留原用户环境su -/su -l:完全切换用户环境,加载目标用户的.profile/.bash_profile,重置所有变量,是推荐的切换方式
passwd --stdin:非交互式设置密码,常用于自动化脚本,CentOS/RHEL 系列支持此参数su -l 用户 -c 命令:以指定用户身份执行单次命令,执行完成后自动切回原用户,无需交互式登录
sudo 命令
sudo让普通用户临时获取管理员权限执行命令,无需切换 root
# su 后跟命令格式错误,su 仅用于切换用户,id 不是系统用户,提示不存在[myz@centos7 ~14:13:44]$suidsu: useriddoes not exist# myz 使用sudo提权执行id命令,首次使用弹出系统安全提示[myz@centos7 ~15:02:09]$sudoidWe trust you have received the usual lecture from thelocalSystem Administrator. It usually boils down to these three things:#1) Respect the privacy of others.#2) Think before you type.#3) With great power comes great responsibility.# 输入myz自身密码,首次输入错误[sudo]passwordformyz: Sorry, try again.# 重新输入正确密码,成功以root权限执行id[sudo]passwordformyz:uid=0(root)gid=0(root)groups=0(root)context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023# 完整切换至laowang用户[myz@centos7 ~15:02:31]$su- laowang Password: Last login: Sat Jul1813:59:59 CST2026on pts/1[laowang@centos7 ~15:02:59]$sudoid# 同样弹出sudo安全提示We trust you have received the usual lecture from thelocalSystem Administrator. It usually boils down to these three things:#1) Respect the privacy of others.#2) Think before you type.#3) With great power comes great responsibility.# 输入laowang密码,该用户未被授予sudo权限,操作被拒绝并记入日志[sudo]passwordforlaowang: laowang is notinthe sudoers file. This incident will be reported.示例:
# laowang 记录如下laowangALL=(ALL)ALL#验证[laowang@centos7 ~15:23:09]$su- laowang Password: Last login: Sat Jul1815:23:02 CST2026on pts/1[laowang@centos7 ~15:23:16]$sudoid[sudo]passwordforlaowang:uid=0(root)gid=0(root)groups=0(root)context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023示例:(不需要密码直接执行)
# laowang 记录如下laowangALL=(ALL)NOPASSWD:ALL[laowang@centos7 ~15:32:07]$sudoiduid=0(root)gid=0(root)groups=0(root)context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023示例:(只能执行特定命令)
# laowang 记录如下laowangALL=(ALL)/sbin/useradd,/sbin/usermod,/sbin/userdel[root@centos7 ~15:36:52]# su -l laowangLast login: Sat Jul1815:32:04 CST2026on pts/1[laowang@centos7 ~15:37:00]$sudoid[sudo]passwordforlaowang:uid=0(root)gid=0(root)groups=0(root)context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023[laowang@centos7 ~15:37:15]$sudouseraddlaozhang[laowang@centos7 ~15:37:26]$idlaozhanguid=8895(laozhang)gid=8895(laozhang)groups=8895(laozhang)Linux 用户提权方式总结
一、su 切换用户(切换身份,需目标用户密码)
1.基础语法 & 作用
su# 切到root,保留原用户环境、目录(不推荐)su- /su-l# 完整登录root,重置环境变量、切换到家目录(推荐)su用户名# 仅切换到指定普通用户,保留环境su- 用户名# 完整登录指定普通用户,加载对方全部环境2. 核心规则
- 普通用户互相切换:必须输入目标用户密码
- root 切换任意普通用户:无需密码
- 仅切换用户,不具备精细权限管控能力
3. 常见报错
su id:用法错误,su后只能跟用户名,不能跟命令- 提示
user xxx does not exist:目标用户已删除 / 未创建
二、sudo 临时提权(普通用户借用管理员权限)
1.基础语法
sudo命令# 临时以root权限执行单条命令sudo-l# 查看当前用户拥有的sudo权限sudo-i# 完全进入root登录环境2. 核心规则
- 验证密码:输入当前自己的密码,不是 root 密码
- 时效:认证后默认 5 分钟内重复使用免输密码
- 前提:用户必须被
/etc/sudoers文件授权
3. 两种授权方式(root 执行)
方式 1:加入 wheel 组(系统默认规则,简单)
# 追加用户到wheel组,获得完整sudo权限 usermod -aG wheel 用户名方式 2:编辑 sudoers 文件(精细控制,visudo专用命令)
1.编辑配置(禁止直接 vi 改文件)
visudo2.末尾添加规则
# 规则1:输自身密码,拥有全部权限 laowang ALL=(ALL) ALL # 规则2:使用sudo全程免密码(重点) laowang ALL=(ALL) NOPASSWD:ALL3.Esc→:wq保存退出
三、su 与 sudo 核心对比
| 命令 | 密码要求 | 权限特点 | 适用场景 |
|---|---|---|---|
| su | 需目标用户密码 | 完整接管对方身份,无权限限制 | 长期切换登录某用户 |
| sudo | 需当前用户密码 | 临时提权,权限可按需管控 | 普通用户临时执行管理命令 |