从 su 到 sudo:Linux 提权的 “进化史”

从 su 到 sudo:Linux 提权的 “进化史”
从 su 到 sudoLinux 提权的 “进化史”Linux提权管理su命令切换当前登录用户默认需要目标用户密码# 普通用户myz执行su命令切换到root身份不带-参数仅切换用户不加载root的完整环境变量[myzcentos7 ~13:57:03]$suPassword:[rootcentos7 myz13:57:07]# env | grep myz# 输出结果说明此时环境变量仍保留大量myz用户的信息如USER、PWD、MAIL、PATH等这是su不带-参数的特点HOSTNAMEcentos7.myz.cloudUSERmyzPATH/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/myz/.local/bin:/home/myz/binMAIL/var/spool/mail/myzPWD/home/myzLOGNAMEmyzXDG_DATA_DIRS/home/myz/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share# 执行su -l等同于su -完全切换到root用户环境重置所有环境变量[rootcentos7 myz13:57:24]# su -lLast login: Sat Jul1813:57:07 CST2026on pts/1# 再次检查环境变量已无myz相关信息仅保留主机名[rootcentos7 ~13:57:41]# set | grep myzHOSTNAMEcentos7.myz.cloud# 非交互式为用户laowang设置密码--stdin参数支持从标准输入读取密码适合脚本场景[rootcentos7 ~13:58:01]# echo 123 | passwd --stdin laowangChanging passwordforuser laowang. passwd: all authentication tokens updated successfully.# 查看/etc/passwd文件中laowang用户的基本信息[rootcentos7 ~13:59:04]# grep laowang /etc/passwdlaowang:x:1001:1001::/home/laowang:/bin/bash# 以laowang用户身份执行id命令-c参数用于指定要执行的命令[rootcentos7 ~13:59:25]# su -l laowang -c iduid1001(laowang)gid1001(laowang)groups1001(laowang)contextunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023# 以laowang用户身份执行cat /etc/hosts命令带单引号包裹命令[rootcentos7 ~13:59:48]# su -l laowang -c cat /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6# 以laowang用户身份执行cat /etc/hosts命令不带引号效果同上此处输出hello为自定义内容[rootcentos7 ~13:59:48]# su -l laowang -c cat /etc/hostshello hello# 以myz身份执行touch haha当前在root家目录myz无写入权限报错权限不足[rootcentos7 ~14:00:42]# su -c touch haha myztouch: cannottouch‘haha’: Permission denied# 查看/etc/passwd中adm用户信息其登录Shell为/sbin/nologin禁止交互式登录[rootcentos7 ~14:02:59]# grep adm /etc/passwdadm:x:3:4:adm:/var/adm:/sbin/nologin# 直接切换adm用户执行命令因Shell为nologin提示账号不可用[rootcentos7 ~14:03:17]# su -l adm -c idThis account is currently not available.# 临时指定Shell为/bin/bash绕过nologin限制成功执行id命令查看用户信息[rootcentos7 ~14:03:27]# su -l adm -s /bin/bash -c iduid3(adm)gid4(adm)groups4(adm)contextunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023# 临时指定bash作为登录shell登录adm账号因缺少环境配置文件终端仅显示简易提示符[rootcentos7 ~14:03:59]# su -l adm -s /bin/bashLast login: Sat Jul1814:03:44 CST2026on pts/1 -bash-4.2$# 按CtrlC中断操作-bash-4.2$ ^C# 退出adm用户回到root-bash-4.2$logout[rootcentos7 ~14:04:57]## 再次查看adm用户信息登录shell仍为/sbin/nologin未做永久修改[rootcentos7 ~14:04:57]# grep adm /etc/passwdadm:x:3:4:adm:/var/adm:/sbin/nologin# 拷贝系统默认环境配置文件到adm家目录/var/adm补齐登录环境[rootcentos7 ~14:05:11]# cp /etc/skel/{.bash_profile,.bashrc} /var/adm# 再次临时指定bash登录adm加载新拷贝的环境文件登录正常[rootcentos7 ~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 不是系统用户提示不存在[myzcentos7 ~14:13:44]$suidsu: useriddoes not exist# myz 使用sudo提权执行id命令首次使用弹出系统安全提示[myzcentos7 ~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:uid0(root)gid0(root)groups0(root)contextunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023# 完整切换至laowang用户[myzcentos7 ~15:02:31]$su- laowang Password: Last login: Sat Jul1813:59:59 CST2026on pts/1[laowangcentos7 ~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#验证[laowangcentos7 ~15:23:09]$su- laowang Password: Last login: Sat Jul1815:23:02 CST2026on pts/1[laowangcentos7 ~15:23:16]$sudoid[sudo]passwordforlaowang:uid0(root)gid0(root)groups0(root)contextunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023示例不需要密码直接执行# laowang 记录如下laowangALL(ALL)NOPASSWD:ALL[laowangcentos7 ~15:32:07]$sudoiduid0(root)gid0(root)groups0(root)contextunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023示例只能执行特定命令# laowang 记录如下laowangALL(ALL)/sbin/useradd,/sbin/usermod,/sbin/userdel[rootcentos7 ~15:36:52]# su -l laowangLast login: Sat Jul1815:32:04 CST2026on pts/1[laowangcentos7 ~15:37:00]$sudoid[sudo]passwordforlaowang:uid0(root)gid0(root)groups0(root)contextunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023[laowangcentos7 ~15:37:15]$sudouseraddlaozhang[laowangcentos7 ~15:37:26]$idlaozhanguid8895(laozhang)gid8895(laozhang)groups8895(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需当前用户密码临时提权权限可按需管控普通用户临时执行管理命令