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 [选项] 命令
  • 核心功能:临时提升权限执行单个命令

二、详细对比表

特性susudo
主要用途切换用户身份,常用来切换到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:~#

九、总结建议

情况推荐使用示例命令理由
日常管理sudosudo apt update安全、可审计、无需共享root密码
长时间root操作sudo -isudo -i有完整的root环境,操作完成后自动退出
服务账户操作sudo -u serviceusersudo -u postgres psql更安全,无需知道服务账户密码
自动化脚本配置免密码sudosudo -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

实践建议:

  1. 为新用户配置sudo权限而非共享root密码
  2. 定期审计sudo日志:sudo grep COMMAND /var/log/auth.log
  3. 使用sudo -l检查自己的权限
  4. 配置完成后用visudo -c验证语法
  5. 始终遵循最小权限原则

通过以上详细的命令示例和结果展示,您可以清楚地了解su和sudo在实际工作中的使用方式和区别,从而更安全高效地管理系统。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决Linux中nohup.out日志过大问题

    解决Linux中nohup.out日志过大问题

    这篇文章主要介绍了解决Linux中nohup.out日志过大问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 【专家教程】xmrig挖矿病毒清除攻略,保护你的服务器免受侵害!

    【专家教程】xmrig挖矿病毒清除攻略,保护你的服务器免受侵害!

    面对日益猖獗的XMRig挖矿病毒,是时候采取行动了!这份攻略将带你一步步清除这个隐蔽的威胁,让你的设备再次安全起来,快来看看我们的秘诀,让病毒无处遁形!
    2024-02-02
  • Linux服务器下Nginx与Apache共存的实现方法分析

    Linux服务器下Nginx与Apache共存的实现方法分析

    这篇文章主要介绍了Linux服务器下Nginx与Apache共存的实现方法,结合实例形式分析了Linux服务器下Nginx与Apache共存的原理、解决思路与实现方法,需要的朋友可以参考下
    2019-06-06
  • Linux系统配置NAT网络模式的详细步骤(附图文)

    Linux系统配置NAT网络模式的详细步骤(附图文)

    本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,特别提到阿里DNS服务的使用和Linux系统中网卡文件的编辑,需要的朋友可以参考下
    2025-04-04
  • 使用FileZilla从Linux系统下载文件的方法

    使用FileZilla从Linux系统下载文件的方法

    最近做项目,遇到这样的需求,要求将Linux系统的的某个文件夹下载到我Windows系统某个文件夹里,怎么实现这个功能呢?下面脚本之家小编给大家带来了使用FileZilla从Linux系统下载文件的方法,感兴趣的朋友一起看看吧
    2018-07-07
  • Linux持续集成自动化安装Maven的方法

    Linux持续集成自动化安装Maven的方法

    今天小编就为大家分享一篇关于Linux持续集成自动化安装Maven的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Ubuntu 14.04设置开机启动脚本的方法

    Ubuntu 14.04设置开机启动脚本的方法

    这篇文章主要给大家介绍了Ubuntu 14.04设置开机启动脚本的方法,文中通过代码介绍的很详细,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友们下面来跟着小编一起学习学习吧。
    2016-12-12
  • linux下dhcp服务配置教程

    linux下dhcp服务配置教程

    这篇文章主要为大家详细介绍了linux下dhcp服务的配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • VMware虚拟机中安装CentOS 7实践

    VMware虚拟机中安装CentOS 7实践

    本文介绍了如何在VMware Workstation上安装CentOS7,首先创建虚拟机,选择CentOS作为操作系统,配置虚拟硬盘和内存等硬件参数,然后加载CentOS镜像,选择简体中文语言安装,并进行分区设置和软件选择,最后设置网络和主机名,完成安装并设置root密码和常用账号
    2026-03-03
  • centos 6.X升级ffmpeg包步骤详解

    centos 6.X升级ffmpeg包步骤详解

    众所周知FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。之前公司已经安装了ffmpeg包,但因为时间较久,所以最近打算升级下,所以这篇文章就记录了在centos 6.X升级ffmpeg包的详细步骤,下面来一起看看吧。
    2016-11-11

最新评论