1 分钟阅读 次阅读

1. su (Switch User)

  • 作用:切换到另一个用户的环境。如果不加用户名,默认切换到 root 用户。
  • 密码要求:需要输入 目标用户(即 root)的密码
  • 环境变更
  • 如果只输入 su,你会获得 root 权限,但环境变量(如 $PATH, $HOME, 当前目录)依然保留原用户的。这可能会导致某些只能在 root 环境变量下运行的命令找不到路径。
  • 最佳实践:通常使用 su -(或 su -l),这会触发一次完整的登录 Shell,将环境变量彻底切换为 root 的环境。

  • 适用场景:知道 root 密码,且需要长时间在 root 环境下进行大量系统级操作的场景。

2. sudo su

  • 作用:使用 sudo 提权来执行 su 命令。结果同样是切换到了 root 用户的 Shell。
  • 密码要求:需要输入 当前用户的密码(前提是当前用户必须在 /etc/sudoers 列表或 sudo/wheel 用户组中)。
  • 环境变更:与单纯的 su 类似,通常保留当前用户的环境变量。如果是 sudo su - 则会切换到 root 环境变量。
  • 适用场景:很多现代 Linux 发行版(如 Ubuntu)默认不设置 root 密码,也不允许 root 直接登录。在这种系统上,你无法使用纯粹的 su(因为你不知道 root 密码),此时 sudo su 成了获取完整 root Shell 的常用捷径。

3. sudo 直接执行命令 (sudo <命令>)

  • 作用:临时以 root(或指定用户)权限执行单条命令。命令执行完毕后,立即恢复为普通用户身份。
  • 密码要求:需要输入 当前用户的密码。默认情况下,输入一次密码后会有一个“免密窗口期”(通常为 15 分钟)。
  • 安全与审计(最核心优势)
  • 最小权限原则:仅在这单个命令的执行期间拥有特权,极大降低了因为手误(比如误敲 rm -rf /)导致系统崩溃的风险。
  • 日志溯源:通过 sudo 执行的每一条命令,都会被记录到系统日志中(如 /var/log/auth.log/var/log/secure)。管理员可以清晰地查到“谁在什么时间执行了什么特权命令”。

  • 适用场景:绝大多数日常管理和运维操作。这是系统安全规范中最推荐的做法。

使用sudo执行命令是环境变量的行为

1. 默认行为:安全隔离 (env_reset)

在几乎所有现代 Linux 发行版的 /etc/sudoers 配置文件中,默认都开启了 Defaults env_reset 选项。 当你直接输入 sudo <命令> 时,系统会这样做:

  • 清理大部分变量:把你当前普通用户的大部分自定义环境变量(比如你在 .bashrc 里 export 的各种路径或变量)全部丢弃。
  • **重写 $PATH**:系统会强制使用 /etc/sudoers中定义的secure_path(通常是 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)。这就是为什么有时候你直接敲命令可以运行,但加了 sudo却提示command not found——因为 root 的安全 $PATH 里没有你这个程序的路径。
  • 保留少数安全变量:通常只会保留 $TERM(终端类型)、$LANG(语言环境)等少数几个不影响安全的变量。

2. 如何打破默认规则?(3种常用场景)

如果你需要控制环境变量的传递,可以使用 sudo 的不同参数:

场景 A:我想把当前用户的环境变量带给 root

如果你在当前普通用户下配置了代理、特殊库路径(如 LD_LIBRARY_PATH)或者交叉编译工具链,想以 root 权限运行它:

  • 命令sudo -E <命令> (或 --preserve-env)
  • 效果:明确告诉 sudo:“请保留我当前的所有环境变量,并带着它们去执行后面的命令。”
  • 注意:如果 /etc/sudoers 中对某些极度敏感的变量做了强限制,-E 也可能无法传递,但它能解决 90% 的普通变量传递问题。

场景 B:我想彻底使用 root 用户的环境变量

如果你运行的安装脚本或命令需要读取 root 的 .profile.bashrc(比如某些环境依赖 root 的 $HOME):

  • 命令sudo -i <命令> * 效果:模拟 root 的初始登录(Login Shell)。它会先加载 root 的所有环境变量配置文件,把 $HOME 切换到 /root,把当前目录也切换到 /root,然后再执行你的命令。

场景 C:我想使用 root 权限,但把环境目录设定为 root 的家目录

  • 命令sudo -H <命令>
  • 效果:它主要作用是将 $HOME 变量强行设置为 target user 的主目录(通常是 /root)。当你使用 sudo pip install 这种会在用户主目录写入缓存或配置的命令时,加上 -H 可以防止 root 文件意外污染你当前普通用户的家目录。

总结对比

执行方式 环境变量状态 适用场景
sudo <命令> 被清洗。使用系统安全的 $PATH 绝大多数日常安全运维操作。
sudo -E <命令> 保留当前用户环境 当普通用户配置了特殊编译环境、代理路径,且需要特权执行时。
sudo -i <命令> 加载 Root 专属环境。相当于切换到了 root 本人。 执行严格依赖 root 系统级变量和 ~/.bashrc 配置的复杂安装脚本。
sudo -H <命令> **修改 $HOME 指向 /root** 使用 npmpip 等包管理器全局安装软件,防止权限污染。

留下评论