一、Root 用户的本质与权限逻辑
在 Linux 系统中,root 是 UID 为 0 的特权用户,拥有对系统文件、进程、配置与硬件的完全控制权,是一切权限的最终来源。早期 Unix/Linux 普遍直接使用 root 登录管理,但随着系统安全与多用户协作需求提升,直接暴露 root 密码、长期以 root 运行操作的风险被不断放大。
现代发行版普遍采用最小权限原则:日常使用普通用户,仅在必要时临时提权。切换至 root 的核心工具只有两个:su 与 sudo,二者设计目标、权限模型、环境行为完全不同,这也是日常使用与安全运维中最容易混淆的底层差异。
二、su 命令:传统用户切换与环境机制
su 全称为 switch user,是 Unix 时代遗留的经典切换工具,核心逻辑是验证目标用户密码,直接切换身份。默认不指定用户时,目标即为 root。
1. su:非登录式切换
su
- 验证方式:输入 root 密码
- 环境行为:继承当前用户环境变量,不加载 root 登录配置
- 工作目录:保持切换前目录不变
- 配置文件:不执行
/root/.profile、.bashrc等登录环境 - 典型现象:
$HOME仍为原用户目录,$PATH可能缺少系统管理路径
这是最浅层次的身份切换,仅改变 UID 权限,不重建运行环境,适合临时单命令操作,但容易因环境不完整导致命令找不到、路径异常。
2. su -:登录式切换(标准完整切换)
su -
# 等价
su --login
- 验证方式:输入 root 密码
- 环境行为:清空当前环境,完整加载 root 登录环境
- 工作目录:自动切换至
/root - 配置文件:正常读取系统级与用户级登录配置
- 本质:启动一个 login shell,等同于直接以 root 登录系统
这是真正意义上“切换到 root”,环境干净、路径完整、行为稳定,是传统 root 管理的标准用法。
3. su -c “命令”:非交互式单次执行
su -c "systemctl restart nginx"
- 不进入交互式 shell,以 root 身份执行单条命令后退回原用户
- 搭配
-可使用 root 完整环境:su - -c "command"
4. su -p:强制保留环境
su -p
强制执行非登录切换,强制保留当前用户 PATH、HOME 等环境变量,不加载任何 root 配置,多用于需要特权但依赖原有环境的调试场景。
su 核心底层总结
- 权限模型:目标用户认证,必须知道 root 密码才能切换
- 环境分两类:login shell(
su -)与 non-login shell(su) - 无权限控制,无审计日志,一旦密码泄露即完全失控
- 不支持细粒度授权,只能“全有或全无”切换到 root
三、sudo 与 su 组合:现代提权模式
sudo 设计目标是授权普通用户以其他身份执行命令,依靠 /etc/sudoers 做权限策略,验证当前用户密码,而非 root 密码。sudo + su 是早期过渡用法,本质是用 sudo 获得临时特权,再调用 su 完成身份切换。
1. sudo su
sudo su
- 验证方式:当前用户密码(需拥有 sudo 权限)
- 环境行为:继承当前用户环境,non-login shell
- 目录不变,不加载 root 登录配置
- 等效于:以 root 身份执行
su,省略 root 密码
2. sudo su -
sudo su -
- 验证方式:当前用户密码
- 环境行为:login shell,完整 root 环境
- 目录切至
/root,加载全部登录配置 - 等效于:安全地获得一个干净的 root 环境
3. sudo su -c “命令”
单次以 root 完整环境执行命令,不进入交互 shell,多用于脚本与自动化任务。
四、sudo 原生切换:sudo -s 与 sudo -i
sudo 自身已内置完整的 shell 启动能力,无需依赖 su,-s、-i 是更简洁、更规范、更易审计的官方方案。
1. sudo -s:非登录特权 shell
sudo -s
- 启动 non-login shell
- 保留当前用户环境变量、工作目录
$HOME仍为原用户目录,PATH不变- 适合临时特权操作,快速、轻量
2. sudo -i:登录式特权 shell(推荐)
sudo -i
- 启动 login shell,模拟完整 root 登录
- 清空原有环境,加载 root 完整环境
- 自动切至
/root,配置文件正常加载 - 行为稳定、路径完整、日志可追溯
- 是生产环境切换到 root 的最佳实践
sudo 原生切换底层逻辑
- 认证:当前用户密码,无需 root 密码
- 权限:由
/etc/sudoers精确控制,可限制命令、主机、身份 - 日志:所有操作默认记入系统日志,可审计、可追溯
- 环境:
-i强隔离环境,避免路径劫持、变量污染
五、核心差异总表
(底层行为一目了然)
| 命令 | 认证密码 | Shell 类型 | 环境来源 | 工作目录 |
|---|---|---|---|---|
| su | root 密码 | 非登录 shell | 继承当前用户 | 不变 |
| su - | root 密码 | 登录 shell | root 完整环境 | /root |
| sudo su | 当前用户 | 非登录 shell | 继承当前用户 | 不变 |
| sudo su - | 当前用户 | 登录 shell | root 完整环境 | /root |
| sudo -s | 当前用户 | 非登录 shell | 继承当前用户 | 不变 |
| sudo -i | 当前用户 | 登录 shell | root 完整环境 | /root |
六、底层机制与安全本质
1. 登录 Shell vs 非登录 Shell
- login shell:加载系统 profile、用户登录配置,环境干净、路径完整
- non-login shell:仅加载交互环境配置,继承外部变量,易出现命令缺失、路径异常
这是 su/sudo 行为差异的根本来源,而非命令本身的语法区别。
2. 权限模型的本质区别
su:密码中心化,掌握 root 密码即掌握一切,无授权、无审计sudo:策略中心化,通过/etc/sudoers实现最小权限、命令白名单、免密规则、环境限制,所有操作可日志追溯
3. 环境安全与提权风险
su不隔离环境,变量、PATH可被劫持利用sudo -i重建环境,配合secure_path可彻底防御路径劫持sudo支持env_reset、env_keep精细控制环境,是安全提权基础
七、使用场景与最佳实践
-
长期系统管理、配置维护 使用
sudo -i,环境完整、行为稳定、安全可追溯。 -
临时单命令特权操作 直接
sudo command,不切换 shell,权限最小。 -
临时交互特权、调试脚本 使用
sudo -s,保留当前目录与环境,轻量快捷。 -
传统兼容场景 可使用
sudo su -,但优先推荐原生sudo -i。 -
严禁行为
- 长期以 root 登录运行
- 随意分发 root 密码
- 在不受信环境使用无环境隔离的
su/sudo -s
八、安全与运维总结
su 是传统身份切换工具,依赖 root 密码,环境简单粗暴,适合单机、可信环境;
sudo 是现代权限管理框架,支持细粒度授权、审计、环境隔离,是多用户、生产环境的标准方案。
su -、sudo su -、sudo -i 看似效果接近,底层差异在于环境来源、认证方式、权限边界、日志能力。在现代 Linux 运维中,优先使用 sudo -i 进入完整 root 环境,优先使用单次 sudo command 执行特权命令,既保证权限可控,也能从根源避免环境污染与提权风险。
原文 https://blog.csdn.net/2301_79518550/article/details/145301753