su 命令 (Switch User / Substitute User)
su 命令用于切换到另一个用户身份,默认情况下是切换到超级用户(root)。

基本语法
su [选项] [用户名]
常用选项
-
或
-l或--login: 最常用、最推荐的选项。- 作用: 以登录 Shell 的方式切换用户。
- 效果: 这会加载目标用户的环境变量(如
.bashrc,.profile等),工作目录也会切换到目标用户的主目录,这更像是“真正地登录”到那个用户账户。 - 示例:
su -l username或简写为su - username。
-
-c或--command: 执行单个命令后立即退出。- 作用: 不需要进入目标用户的交互式 Shell,直接执行指定命令,然后返回到原用户。
- 示例:
su - root -c "apt update"(以 root 用户身份执行apt update命令)。
-
--session-command: 与-c类似,但不会创建新的会话。 -
-s或--shell: 指定要使用的 Shell。
(图片来源网络,侵删)- 作用: 切换用户时,强制使用指定的 Shell,而不是目标用户默认的 Shell。
- 示例:
su -s /bin/zsh username(切换到 username 用户,并使用 zsh 作为 Shell)。
-
-m或-p: 保留环境变量。- 作用: 切换用户后,不加载目标用户的环境配置,而是保留当前用户的环境变量,这在某些特殊调试场景下可能有用,但通常不推荐。
-
-f: 快速启动 Shell(主要针对csh或tcsh)。
使用示例
场景 1: 切换到 root 用户(不推荐)
# 输入此命令后,系统会提示你输入 root 用户的密码 su
- 问题: 这种方式没有加载 root 用户的完整环境,可能会导致一些命令行为异常,不推荐在生产环境中使用。
场景 2: 安全地切换到 root 用户(推荐)
# 输入此命令后,系统会提示你输入 root 用户的密码 su - # 或者 su -l root
- 优点: 你会获得一个干净、完整的 root 用户环境,工作目录切换到
/root,所有环境变量都正确加载。
场景 3: 切换到普通用户(切换到 oracle 用户)
# 假设你当前是 root 用户,要切换到 oracle 用户 # 输入此命令后,系统会提示你输入 oracle 用户的密码 su - oracle
场景 4: 以目标用户身份执行单个命令
假设你是一个普通用户,需要重启网络服务,但该命令需要 root 权限。
# 输入此命令后,系统会提示你输入 root 用户的密码 su - root -c "systemctl restart networking"
场景 5: 切换用户并立即退出
当你使用 su - username 切换后,可以通过以下方式返回:
- 输入
exit命令。 - 或使用快捷键
Ctrl + D。
su 的缺点
- 必须知道目标用户的密码: 如果你需要让一个普通用户拥有管理员权限,你必须告诉他 root 密码,这非常不安全,因为密码会被共享。
- 审计困难: 无法精确追踪到是哪个具体的人使用了 root 权限,因为所有知道 root 密码的人执行的操作看起来都一样。
- 权限过大: 一旦切换到 root,就拥有了系统的绝对控制权,容易误操作导致系统崩溃。
sudo 命令 (Superuser Do)
sudo 是 su 的现代替代品,它允许授权用户以其他用户(通常是 root)的身份来执行命令,而不需要知道目标用户的密码。
基本语法
sudo [选项] [命令]
核心概念与配置
sudo 的强大之处在于其灵活的配置,这些配置都存储在 /etc/sudoers 文件中。强烈建议使用 visudo 命令来编辑此文件,因为它可以检查语法错误,防止你锁住自己。
sudoers文件: 定义了哪些用户可以在哪些机器上以哪些用户的身份运行哪些命令。sudo组: 在大多数现代 Linux 发行版(如 Ubuntu, Debian)中,一个用户只要被加入到sudo组,就默认拥有了使用sudo的权限,可以以 root 身份执行任何命令。
常用选项
-
-u或--user: 指定要以哪个用户身份执行命令(默认是 root)。- 示例:
sudo -u oracle ls -l /home/oracle(以 oracle 用户的身份列出其主目录内容)。
- 示例:
-
-i或--login: 模拟一个登录 Shell。- 作用: 类似于
su -,它会加载目标用户(通常是 root)的完整环境配置。 - 示例:
sudo -i(切换到 root 的登录 Shell)。
- 作用: 类似于
-
-s或--shell: 启动一个 Shell。- 作用: 与
-i类似,但通常不会改变工作目录或加载完整的环境变量,只启动一个 Shell。 - 示例:
sudo -s(启动一个 root 用户的 Shell)。
- 作用: 与
-
-l或--list: 列出当前用户被允许执行的命令。- 示例:
sudo -l(查看自己有哪些 sudo 权限)。
- 示例:
-
-k: “杀死”当前的sudo认证缓存,下次使用sudo时需要重新输入密码。 -
-K: 与-k类似,但会完全删除时间戳文件,强制下次输入密码。
使用示例
场景 1: 以 root 身份执行单个命令
# 普通用户执行此命令,会提示输入当前用户的密码,而不是 root 密码 sudo apt update
场景 2: 以其他用户身份执行命令
# 以 oracle 用户身份执行一个命令 sudo -u oracle whoami # 输出将是: oracle
场景 3: 切换到 root 的登录 Shell
sudo -i # 提示输入当前用户的密码后,你会进入一个 root 用户的完整环境 # 输入 exit 返回原用户
场景 4: 编辑一个只有 root 可写的文件
# 普通用户无法直接编辑 /etc/hosts # 使用 sudo 可以 sudo nano /etc/hosts # 编辑完成后保存并退出
sudo 的优点
- 无需共享密码: 管理员只需配置
/etc/sudoers文件,普通用户使用自己的密码即可获得授权,提高了安全性。 - 精细的权限控制: 可以精确地控制某个用户只能执行特定的命令,而不是所有命令,可以允许用户
webadmin只能重启nginx服务,而不能执行其他危险操作。 - 完善的审计日志:
sudo会记录所有执行的命令、执行者、时间、终端等信息,日志通常存放在/var/log/auth.log或/var/log/secure中,这对于安全审计和故障排查至关重要。 - 临时提权: 权限是临时的,通常在一段时间(如15分钟)后失效,需要重新输入密码。
su vs sudo 对比总结
| 特性 | su (Switch User) |
sudo (Superuser Do) |
|---|---|---|
| 核心思想 | 切换到另一个用户,拥有该用户的所有会话和环境。 | 临时授权执行一个或多个命令,保持自己的原始会话。 |
| 密码要求 | 需要输入目标用户的密码(如 root 密码)。 | 需要输入当前用户自己的密码。 |
| 安全性 | 较低,需要共享高权限密码,无法审计具体操作人。 | 高,无需共享密码,权限可精细控制,有详细审计日志。 |
| 主要用途 | 系统管理员登录,或在服务账户间切换。 | 日常系统管理,让普通用户获得临时高级权限。 |
| 环境加载 | 可通过 -l 选项加载目标用户的完整环境。 |
通过 -i 模拟登录环境,但默认是当前用户环境。 |
| 推荐度 | 在现代系统管理中不推荐用于日常提权。 | 强烈推荐作为日常权限管理的标准工具。 |
结论与最佳实践
在现代 Linux 系统管理中:
-
对于日常操作:优先使用
sudo,这是最安全、最灵活、最符合现代运维实践的方式,将需要管理的用户加入到sudo组,并使用sudo来执行需要高权限的命令。 -
对于系统维护:
su仍然有其价值,尤其是在需要长时间以某个用户(如oracle,mysql)身份进行操作,或者需要进入一个完全干净的 root 环境进行排错时,但在这种情况下,也推荐使用sudo -i或sudo -s来替代su -,因为它们同样能提供完整的环境,并且审计日志更清晰。
- 想临时干个活?用
sudo。 - 想彻底变成另一个人去工作?用
su(但要谨慎)。
对于普通用户来说,你应该学会并习惯使用 sudo,而不是去寻找 root 密码。
