我们来详细讲解 Linux 中 su 和 sudo 的作用与区别。这是两个用于提升权限的核心命令,理解它们的差异对于系统管理和安全至关重要。
核心概念总结
su:用于切换用户。默认切换到 root 用户,需要输入目标用户的密码。sudo:用于以其他用户(默认是 root)的身份执行一条命令。需要输入当前用户自己的密码(前提是该用户已被授权)。
详细解析
1. su
作用:substitute user 或 switch user 的缩写,意思是“切换用户”。
使用方法:
su:不加任何参数,默认切换到 root 用户。执行后会要求输入 root 用户的密码。成功后,命令行提示符会从$变为#,表示你获得了 root 的 shell 环境。su -:推荐用法。不仅切换用户身份,还会完全切换到目标用户的环境变量(如 HOME, SHELL, USER, PATH 等),就像直接用该用户登录一样。su - <username>:切换到指定的其他用户(如su - alice),需要输入该用户的密码。
示例:
# 切换到 root,环境不变
$ su
密码: <输入root的密码>
# whoami
root
# pwd
/home/your_username # 注意,工作目录还是原来的
# 完全切换到 root 环境(推荐)
$ su -
密码: <输入root的密码>
# pwd
/root # 工作目录变成了 root 的家目录
特点:
- 优点:简单直接,切换后可以执行多条需要特权的命令。
- 缺点:
- 需要知道目标用户(尤其是 root)的密码,存在安全风险。如果多人需要 root 权限,密码就得共享,不利于审计。
- 一旦切换到 root,用户就拥有了系统的完全控制权,容易因误操作导致问题。
2. sudo
作用:substitute user do 的缩写,意思是“以其他用户身份执行”。它允许被授权的用户以 root 或其他用户的身份执行特定的命令。
使用方法:
sudo <command>:以 root 身份执行一条命令。执行后会要求输入当前用户自己的密码。默认在短时间内(如 5 分钟)再次使用sudo无需重复输入密码。sudo -u <username> <command>:以指定用户的身份执行命令(如sudo -u alice whoami)。
示例:
# 以 root 身份更新软件列表
$ sudo apt update
[sudo] your_username 的密码: <输入当前用户自己的密码>
# 以用户 alice 的身份创建一个文件
$ sudo -u alice touch /tmp/alice_file.txt
配置:
sudo 的权限由 /etc/sudoers 文件控制。永远不要直接用文本编辑器(如 vim)直接修改这个文件,而应该使用 visudo 命令,因为它会检查语法错误,错误的配置可能导致所有用户都无法使用 sudo。
一个典型的授权配置如下:
# 允许 wheel 用户组的成员执行任何命令
%wheel ALL=(ALL) ALL
# 允许用户 alice 执行特定的关机命令,且无需输入密码
alice ALL=(ALL) NOPASSWD: /usr/bin/shutdown
特点:
- 优点:
- 精细化权限控制:可以精确控制某个用户能执行哪些命令,不能执行哪些命令。
- 不需要共享 root 密码:用户使用自己的密码来提升权限。
- 有日志审计:所有通过
sudo执行的命令都会被记录到系统日志中(通常是/var/log/auth.log),便于追踪和审计“谁在什么时候执行了什么命令”。 - 更安全:避免了用户长时间停留在 root 权限下,减少了误操作的风险。
- 缺点:配置稍复杂,需要管理员提前规划和设置。
核心区别对比表
| 特性 | su | sudo |
|---|---|---|
| 核心功能 | 切换用户身份 | 以其他用户身份执行一条命令 |
| 默认目标 | 切换到 root 用户 | 以 root 身份执行命令 |
| 密码要求 | 需要目标用户的密码 | 需要当前用户自己的密码 |
| 权限范围 | 切换后获得目标用户的完整权限 | 只能执行在 /etc/sudoers 中明确授权的命令 |
| Shell 环境 | 进入一个新的 shell 会话(特别是 su -) | 在当前 shell 中执行单条命令,不改变环境 |
| 审计能力 | 弱。只知道谁切换成了谁,但不知道具体做了什么。 | 强。所有执行的命令都会被详细记录。 |
| 使用场景 | 需要长时间以某个用户(尤其是 root)身份进行多项操作。 | 临时需要提升权限来执行特定管理任务。 |
| 安全性 | 较低(需要共享密码,权限过大)。 | 较高(无需共享密码,权限可控,有审计)。 |
现代最佳实践与结合使用
在现代 Linux 发行版(如 Ubuntu 及其衍生版)中,默认不设置 root 密码,而是鼓励用户使用 sudo 来执行管理任务。初始创建的用户默认就在 sudo 组中,拥有使用 sudo 的权限。
有时你会看到一种结合使用的模式:
sudo su -
这条命令的意思是:
- 使用
sudo(输入自己的密码)来获得 root 权限。 - 然后执行
su -命令,从而切换到 root 用户并加载其完整环境。
这实际上是一种“曲线救国”的方式,它利用了 sudo 不需要 root 密码的优点来最终实现 su - 的效果。但纯粹主义者认为,既然已经用了 sudo,就应该直接 sudo command,而不是开启一个 root shell。
总结
- 如果你只是需要临时执行一条管理命令,永远首选
sudo。它是更安全、更符合现代管理理念的工具。 - 如果你确实需要在一个会话中连续执行大量需要 root 权限的操作,并且你的系统允许,那么可以使用
su -或sudo -i(后者是通过sudo启动一个 root shell)。
简单来说:sudo 是“做一件事需要老板权限,于是向老板申请”,而 su 是“直接变成老板”。在绝大多数工作场景下,“申请权限”是比“变成老板”更安全、更合理的做法。
Linux su与sudo的区别详解

378

被折叠的 条评论
为什么被折叠?



