Linux中su和sudo命令怎么用?常用场景与实例详解
更新时间:2026年11月08日 10:20:59 作者:思-无-涯
还在纠结su和sudo的区别?本文用对比表格和实际场景,带你搞懂su切换用户和sudo临时提权的用法、密码要求及安全差异,并附上配置sudoers和故障排除技巧,帮你更安全高效地管理Linux系统
一、基本概念和作用
1.su(Switch User/Substitute User)
- 作用:切换用户身份,主要用于切换到root用户
- 语法:
su [选项] [用户名]
核心功能:完全切换到另一个用户的shell环境
su,su -,su root均可切换到root用户;

2.sudo(SuperUser DO / Substitute User DO)
- 作用:以超级用户或其他用户权限执行特定命令
- 语法:
sudo [选项] 命令 - 核心功能:临时提升权限执行单个命令
二、详细对比表
| 特性 | su | sudo |
|---|---|---|
| 主要用途 | 切换用户身份,常用来切换到root | 以root权限执行单个命令 |
| 密码要求 | 需要目标用户的密码 | 需要当前用户的密码(配置决定) |
| 权限控制 | 要么有完整权限,要么没有 | 可通过配置精细控制命令权限 |
| 日志记录 | 只记录用户切换,不记录具体命令 | 详细记录所有执行的命令(/var/log/auth.log) |
| 环境变量 | 默认不加载目标用户的环境变量(除非用-) | 保留当前用户的环境变量 |
| 安全等级 | 较低(需要共享root密码) | 较高(无需知道root密码) |
| 使用场景 | 需要长时间使用root权限 | 临时执行需要特权的命令 |
三、常用命令和场景(带示例结果)
su的常见用法
# 1. 切换到root用户(需要root密码) $ su 密码:******** # 切换成功,但仍在当前目录 # 提示符变为 # 表示现在是root用户 root@server:/home/alice# # 2. 切换到root并加载环境变量(推荐) $ su - 密码:******** # 完全切换到root环境,目录变为/root root@server:~# pwd /root # 3. 切换到其他用户 $ su bob 密码:******** bob@server:/home/alice$ whoami bob # 4. 切换到其他用户并执行命令后返回 $ su -c "id" bob 密码:******** uid=1001(bob) gid=1001(bob) groups=1001(bob) $ whoami # 命令执行后自动返回原用户 alice # 5. 验证是否成功切换 $ su - 密码:******** root@server:~# whoami root root@server:~# echo $USER root root@server:~# exit # 退出root $ whoami alice
sudo的常见用法
# 1. 以root权限执行命令
$ sudo apt update
[sudo] alice的密码:********
命中:1 http://archive.ubuntu.com/ubuntu focal InRelease
获取:2 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
...
$ whoami # 命令执行后仍然是普通用户
alice
# 2. 以其他用户身份执行命令
$ sudo -u bob whoami
[sudo] alice的密码:********
bob
# 3. 切换到root的交互式shell
$ sudo -i
[sudo] alice的密码:********
# 进入root的shell,环境变量已加载
root@server:~# pwd
/root
root@server:~# exit
$
# 4. 查看当前用户的sudo权限
$ sudo -l
匹配 %alice 在 server 上的默认条目:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
用户 alice 可以在 server 上运行以下命令:
(ALL : ALL) ALL
# 5. 保留当前目录和环境
$ pwd
/home/alice/projects
$ sudo -E env | grep PATH
PATH=/home/alice/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 6. 在脚本中使用sudo(需要配置免密码)
$ sudo -n apt list --upgradable
Listing... Done
四、实际应用场景(带示例结果)
使用su的场景
场景1:系统维护 - 需要长时间以root身份操作
$ whoami alice $ su - 密码:******** root@server:~# systemctl stop nginx root@server:~# tar -czf /backup/nginx-$(date +%Y%m%d).tar.gz /etc/nginx root@server:~# ls -lh /backup/ 总用量 4.0K -rw-r--r-- 1 root root 2.3K Apr 15 10:30 nginx-20240415.tar.gz root@server:~# systemctl start nginx root@server:~# exit $ whoami alice
场景2:切换服务账户 - 以服务用户身份操作
$ sudo -u postgres psql
psql (13.7)
输入 "help" 来获取帮助信息.
postgres=# \l
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限
-----------+----------+----------+-------------+-------------+-------------------
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(3 行记录)
使用sudo的场景
场景1:日常管理 - 临时安装软件
$ sudo apt install nginx
[sudo] alice的密码:********
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成
下列【新】软件包将被安装:
nginx
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 23 个软件包未被升级。
需要下载 0 B/51.6 kB 的归档。
解压缩后会消耗 143 kB 的额外空间。
...
$ sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-04-15 10:30:00 CST; 1min ago
场景2:受限权限 - 普通用户管理特定服务
# 假设用户alice只能管理nginx服务
$ sudo -l
用户 alice 可以在 server 上运行以下命令:
(root) /usr/bin/systemctl start nginx,
(root) /usr/bin/systemctl stop nginx,
(root) /usr/bin/systemctl status nginx
$ sudo systemctl restart nginx
[sudo] alice的密码:********
$ sudo systemctl status nginx | grep Active
Active: active (running) since Mon 2024-04-15 10:31:00 CST; 1s ago
# 尝试其他命令会被拒绝
$ sudo apt update
对不起,用户 alice 无权以 root 的身份在 server 上执行 /usr/bin/apt update。
场景3:审计跟踪 - 查看sudo执行记录
# 管理员查看sudo日志 $ sudo grep sudo /var/log/auth.log | tail -5 Apr 15 10:30:00 server sudo: alice : TTY=pts/0 ; PWD=/home/alice ; USER=root ; COMMAND=/usr/bin/apt update Apr 15 10:30:15 server sudo: alice : TTY=pts/0 ; PWD=/home/alice ; USER=root ; COMMAND=/usr/bin/systemctl status nginx Apr 15 10:31:00 server sudo: alice : TTY=pts/0 ; PWD=/home/alice ; USER=root ; COMMAND=/usr/bin/systemctl restart nginx
五、权限配置示例
配置/etc/sudoers
# 使用visudo安全编辑(检查语法) $ sudo visudo # 添加以下内容后的实际效果: # 1. 允许用户alice执行所有命令(需要密码) alice ALL=(ALL:ALL) ALL # 测试配置 $ sudo -u bob whoami [sudo] alice的密码:******** bob # 2. 允许用户bob执行apt命令(无需密码) bob ALL=(ALL) NOPASSWD: /usr/bin/apt # 测试配置(bob用户) $ sudo -u bob bash -c "sudo -n apt update" # 直接执行,无需输入密码 命中:1 http://archive.ubuntu.com/ubuntu focal InRelease # 3. 允许wheel组的所有成员 %wheel ALL=(ALL:ALL) ALL # 将用户加入wheel组 $ sudo usermod -aG wheel charlie $ groups charlie charlie : charlie wheel # 4. 创建单独的配置文件 $ echo "%developers ALL=(ALL) /usr/bin/git, /usr/bin/docker" | sudo tee /etc/sudoers.d/developers %developers ALL=(ALL) /usr/bin/git, /usr/bin/docker # 测试 $ sudo -u developer1 git status [sudo] developer1的密码:******** 位于分支 main 无文件要提交,干净的工作区
六、实际工作流程示例
场景:部署Web应用
# 开发人员alice的工作流程 $ whoami alice # 1. 拉取代码(无需特权) $ git pull origin main remote: Enumerating objects: 5, done. remote: Counting objects: 100% (5/5), done. remote: Compressing objects: 100% (3/3), done. remote: Total 3 (delta 2), reused 0 (delta 0), pack-reused 0 展开对象中: 100% (3/3), 完成。 # 2. 重启服务(需要特权) $ sudo systemctl restart myapp [sudo] alice的密码:******** # 3. 查看日志(需要特权但只读) $ sudo tail -f /var/log/myapp.log 2024-04-15 10:35:00 INFO: Application started successfully 2024-04-15 10:35:01 INFO: Connected to database at localhost:5432 # 4. 遇到复杂问题需要深入调试 $ sudo -i [sudo] alice的密码:******** root@server:~# journalctl -u myapp --since "10 minutes ago" -- Logs begin at Mon 2024-04-15 09:00:00 CST, end at Mon 2024-04-15 10:36:00 CST. -- Apr 15 10:35:00 server systemd[1]: Started My Application Service. Apr 15 10:35:00 server myapp[1234]: Starting application with config: /etc/myapp/config.yaml root@server:~# exit $ whoami # 已返回普通用户 alice
七、故障排除示例
问题1:用户不在sudoers文件中
$ sudo apt update alice 不在 sudoers 文件中。此事将被报告。 # 解决方案:用root用户添加 $ su - 密码:******** root@server:~# usermod -aG sudo alice root@server:~# exit $ sudo apt update # 再次尝试 [sudo] alice的密码:******** 命中:1 http://archive.ubuntu.com/ubuntu focal InRelease
问题2:su认证失败
$ su bob 密码:******** su: 认证失败 # 检查用户是否存在 $ getent passwd bob bob:x:1001:1001::/home/bob:/bin/bash # 可能原因:密码错误或用户被锁定 $ sudo passwd -S bob bob P 04/15/2024 0 99999 7 -1 # P表示密码可用 # 如果是root用户,Ubuntu默认被锁定 $ su - 密码:******** su: 认证失败 $ sudo -i # 使用sudo代替 [sudo] alice的密码:******** root@server:~#
问题3:sudo配置语法错误
# 错误配置导致sudo无法使用 $ sudo visudo >>> 在文件中添加错误语法 <<< alice ALL=(ALL:ALL) ALLL # 多了一个L # 保存时报错 >>> /etc/sudoers: 语法错误 near line 28 <<< 现在做什么? 选项有: 1) 重新编辑 2) 不保存退出 3) 仍然保存 选择 2 # 选择不保存退出
八、安全最佳实践示例
配置sudo免密码需谨慎
# 危险配置:完全免密码 alice ALL=(ALL) NOPASSWD: ALL # 安全配置:仅特定命令免密码 alice ALL=(ALL) NOPASSWD: /usr/bin/apt update, /usr/bin/apt upgrade # 测试安全配置 $ sudo -n apt update # 无需密码 命中:1 http://archive.ubuntu.com/ubuntu focal InRelease $ sudo -n apt install nginx # 需要密码 [sudo] alice的密码:********
限制su的使用
# 编辑PAM配置,只允许wheel组成员使用su $ sudo nano /etc/pam.d/su # 取消注释或添加 auth required pam_wheel.so use_uid # 测试效果 $ groups alice alice : alice sudo # 不在wheel组 $ su - 密码:******** su: 拒绝权限 # 将用户加入wheel组 $ sudo usermod -aG wheel alice $ su - 密码:******** # 现在可以成功切换 root@server:~#
九、总结建议
| 情况 | 推荐使用 | 示例命令 | 理由 |
|---|---|---|---|
| 日常管理 | sudo | sudo apt update | 安全、可审计、无需共享root密码 |
| 长时间root操作 | sudo -i | sudo -i | 有完整的root环境,操作完成后自动退出 |
| 服务账户操作 | sudo -u serviceuser | sudo -u postgres psql | 更安全,无需知道服务账户密码 |
| 自动化脚本 | 配置免密码sudo | sudo -n command | 避免硬编码密码,安全可控 |
| 多管理员环境 | 每人配置特定sudo权限 | alice ALL=(ALL) /usr/bin/systemctl * nginx | 权责分明,便于审计 |
黄金法则示例
# ❌ 不要这样做(共享root密码) # "这是root密码,大家都可以用" # ✅ 应该这样做(每人独立账户+sudo权限) $ whoami alice $ sudo systemctl restart nginx # 执行需要特权的任务 [sudo] alice的密码:******** # 查看谁做了什么 $ sudo grep alice /var/log/auth.log Apr 15 10:40:00 server sudo: alice : TTY=pts/0 ; PWD=/home/alice ; USER=root ; COMMAND=/usr/bin/systemctl restart nginx
实践建议:
- 为新用户配置sudo权限而非共享root密码
- 定期审计sudo日志:
sudo grep COMMAND /var/log/auth.log - 使用
sudo -l检查自己的权限 - 配置完成后用
visudo -c验证语法 - 始终遵循最小权限原则
通过以上详细的命令示例和结果展示,您可以清楚地了解su和sudo在实际工作中的使用方式和区别,从而更安全高效地管理系统。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
【专家教程】xmrig挖矿病毒清除攻略,保护你的服务器免受侵害!
面对日益猖獗的XMRig挖矿病毒,是时候采取行动了!这份攻略将带你一步步清除这个隐蔽的威胁,让你的设备再次安全起来,快来看看我们的秘诀,让病毒无处遁形!2024-02-02
Linux服务器下Nginx与Apache共存的实现方法分析
这篇文章主要介绍了Linux服务器下Nginx与Apache共存的实现方法,结合实例形式分析了Linux服务器下Nginx与Apache共存的原理、解决思路与实现方法,需要的朋友可以参考下2019-06-06


最新评论