// 安全研究 · 2025-01-22

Linux 切换到 Root 用户的方式及差异详解

一、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 精细控制环境,是安全提权基础

七、使用场景与最佳实践

  1. 长期系统管理、配置维护 使用 sudo -i,环境完整、行为稳定、安全可追溯。

  2. 临时单命令特权操作 直接 sudo command,不切换 shell,权限最小。

  3. 临时交互特权、调试脚本 使用 sudo -s,保留当前目录与环境,轻量快捷。

  4. 传统兼容场景 可使用 sudo su -,但优先推荐原生 sudo -i。

  5. 严禁行为

    • 长期以 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