Linux sudo命令

参考资料

  1. rootアカウントのセキュリティ
  2. sudoの高度な設定:コマンド単位許可・NOPASSWD・セキュリティ運用術

目录

  • [一. 简介](#一. 简介)
    • [1.1 使用`sudo`的好处](#1.1 使用sudo的好处)
    • [1.2 `sudo`的密码缓存机制](#1.2 sudo的密码缓存机制)
  • [二. 切换为root用户的方法](#二. 切换为root用户的方法)
    • [2.1 `sudo -i`](#2.1 sudo -i)
    • [2.2 `sudo -s`](#2.2 sudo -s)
    • [2.3 `su -`](#2.3 su -)
  • [三. 配置项](#三. 配置项)
    • [3.1 `-l` 查看当前 `sudo` 权限](#3.1 -l 查看当前 sudo 权限)
    • [3.2 `-k` 清除密码缓存](#3.2 -k 清除密码缓存)
  • [四. 配置文件](#四. 配置文件)
    • [4.1 `visudo` 命令编辑配置文件](#4.1 visudo 命令编辑配置文件)
    • [4.2 禁止当前用户通过 sudo `-i` 或 `-s` 切换为root](#4.2 禁止当前用户通过 sudo -i-s 切换为root)
    • [4.3 禁止执行的命令 + 只允许执行的命令](#4.3 禁止执行的命令 + 只允许执行的命令)
  • [五. 日志](#五. 日志)
    • [5.1 基础日志](#5.1 基础日志)
    • [5.2 审计日志](#5.2 审计日志)
      • [5.2.1 配置](#5.2.1 配置)
      • [5.2.2 日志查看](#5.2.2 日志查看)

一. 简介

sudosuperuser do(以超级用户身份执行),让普通用户,临时以 root 权限执行某个命令。

而不是直接切换成root用户,或者给普通用户永久root权限。

  • 并不是所有的用户都可以使用sudo命令,必须由管理员配置相应的权限。
  • 当使用sudo命令时,若提示输入密码,输入的是当前用户的密码,并非root用户的密码。

1.1 使用sudo的好处

  • 如果直接切换为root用户的话,所有命令都是最高权限,误操作风险极高,不好审计。
  • 使用sudo的话,可只提权一次,可只提权一个命令。
  • 有日志显示,并且可精确地控制权限。

1.2 sudo的密码缓存机制

当我们使用sudo命令输入过一次密码之后,sudo会将输入的密码缓存,5分钟内再次使用sudo命令时,无需输入密码。

如果想要修改缓存时间的话,在 /etc/sudoers.d/下的文件中加入下面的配置即可。

bash 复制代码
Defaults timestamp_timeout=5

二. 切换为root用户的方法

login shell 的意义:

  • PATH 完整
  • root 的环境变量生效
  • 行为最接近真正登录
命令 推荐度 核心一句话 login shell
sudo -i ⭐⭐⭐⭐⭐ 最推荐,模拟一次 真正的 root 登录 ✅ 是
sudo -s ⭐⭐⭐⭐ 只是"拿到 root 壳",环境不完整 ❌ 否
su - ⭐⭐ 用 root 密码登录,现代系统不推荐 ✅ 是
项目 HOME PATH profile
sudo -i /root root 标准 加载
sudo -s 当前用户 继承用户 不加载
su - /root root 标准 加载

2.1 sudo -i

  • 最推荐的方式,sudo 认证 → 模拟 root 的登录 shell
  • 使用 sudo 的权限模型,不需要 root 密码
  • 加载完整 root 登录环境
    • /etc/profile
    • ~/.bash_profile~/.profile

2.2 sudo -s

  • 用 root 身份启动一个 shell(默认是 /bin/sh)
  • 不读取 root 的登录环境,PATH 是普通用户的PATH
  • 不执行/etc/profile

2.3 su -

  • 类似真正 root 登录,需要使用root的密码
  • 加载完整 root 登录环境
    • /etc/profile
    • ~/.bash_profile~/.profile

三. 配置项

3.1 -l 查看当前 sudo 权限

bash 复制代码
apluser@FengYeHong-HP:~$ sudo -l
Matching Defaults entries for apluser on FengYeHong-HP:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User apluser may run the following commands on FengYeHong-HP:
    (ALL : ALL) ALL

3.2 -k 清除密码缓存

⏹sudo命令,默认会缓存密码5分钟,通过sudo -k可以清除缓存

  • 常用于测试权限或安全演示
bash 复制代码
# 首次使用sudo命令的时候,需要输入密码
apluser@ubuntu24-01:~$ sudo which
[sudo] password for apluser:
apluser@ubuntu24-01:~$
# 再次使用sudo命令时, 无需输入密码
apluser@ubuntu24-01:~$ sudo which
apluser@ubuntu24-01:~$
# 使用 -k 清除密码缓存
apluser@ubuntu24-01:~$ sudo -k
apluser@ubuntu24-01:~$
# 再次使用sudo命令的时候,需要输入密码
apluser@ubuntu24-01:~$ sudo which
[sudo] password for apluser:
apluser@ubuntu24-01:~$

四. 配置文件

⏹系统sudo的配置文件存储在/etc/sudoers

  • 该文件只有root用户才有权修改
  • 如果误修改,可能会导致用不了sudo,一般不直接修改/etc/sudoers文件
  • 一般的做法是在/etc/sudoers.d/目录下新建配置文件,新的配置文件中的内容会被 sudo 读取并合并到主配置中。这种方法优点如下:
    • 不会动到系统默认的 /etc/sudoers(降低误操作风险)
    • 以后要撤销权限,直接删掉这个文件就行
    • 方便运维脚本批量管理不同用户的 sudo 配置

4.1 visudo 命令编辑配置文件

sudo visudo是专门用来安全的编辑/etc/sudoers/etc/sudoers.d/ 的命令,具体作用如下:

  • ✅语法校验
    • 保存并退出时,visudo 会检查 sudoers 语法
    • 有错误 → 拒绝保存
  • ✅文件锁
    • 自动加锁
    • 防止并发编辑导致文件损坏
  • ✅正确的权限保存文件
    • sudoers 文件要求: -r--r----- root root
    • visudo 会自动保证权限正确
bash 复制代码
sudo visudo -f /etc/sudoers.d/配置文件名称

⏹当存在多个配置文件的时候,会按照顺序依次加载,推荐按照功能设置不同的配置文件,更好管理。

bash 复制代码
apluser@FengYeHong-HP:~$ sudo tree /etc/sudoers.d/
/etc/sudoers.d/
├── 00-base
├── 10-admins
├── 20-no-password
├── 30-io-logging
└── 99-custom

4.2 禁止当前用户通过 sudo -i-s 切换为root

  • 让普通用户随意切换为root是很危险的
  • 可以在配置文件中禁止指定用户通过sudo命令切换为root
    • sudo是通过/usr/bin/sh/usr/bin/bash切换为root
    • 只需要在配置文件中禁用这两个命令即可
    • 需要注意的是,禁用之后,普通的bash xxx.shsh xxx.sh还是可以执行的
bash 复制代码
apluser@FengYeHong-HP:~$ ls -l /etc/sudoers.d/
total 8
-r--r----- 1 root root  194 Dec 20 10:15 01-config
-r--r----- 1 root root 1096 Feb  8  2022 README
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ sudo cat /etc/sudoers.d/01-config
[sudo] password for apluser:
# ---------------------------
# 禁止的命令
# ---------------------------
Cmnd_Alias FORBIDDEN = \
    /usr/bin/sh, \
    /usr/bin/bash

# 禁止指定的命令
apluser ALL=(ALL) !FORBIDDEN
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ sudo -i
Sorry, user apluser is not allowed to execute '/bin/bash' as root on FengYeHong-HP.localdomain.
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ sudo -s
Sorry, user apluser is not allowed to execute '/bin/bash' as root on FengYeHong-HP.localdomain.

4.3 禁止执行的命令 + 只允许执行的命令

⏹我们通过配置文件对普通用户使用sudo命令进行更加精细的配置

  • 只能使用指定的命令,但是需要输入密码
  • 无法sudo -ssudo -i切换为root
bash 复制代码
apluser@FengYeHong-HP:~$ sudo cat /etc/sudoers.d/01-config
# ---------------------------
# 禁止的命令
# ---------------------------
Cmnd_Alias FORBIDDEN = \
    /usr/bin/sh, \
    /usr/bin/bash, \
    /bin/rm, \
    /usr/bin/vi, \
    /usr/bin/vim, \
    /usr/bin/nano, \
    /usr/sbin/visudo, \
    /usr/bin/cp

# ---------------------------
# 允许的命令
# ---------------------------
Cmnd_Alias ALLOW = \
    /usr/bin/grep, \
    /usr/bin/ls, \
    /usr/bin/cat

# 只允许指定的命令
apluser ALL=(ALL) ALLOW

# 禁止指定的命令
apluser ALL=(ALL) !FORBIDDEN
  • 可以无密码指定指定的命令,其他命令都执行不了
  • 无法sudo -ssudo -i切换为root
bash 复制代码
apluser@FengYeHong-HP:~$ sudo cat /etc/sudoers.d/01-config
# ---------------------------
# 允许的命令
# ---------------------------
Cmnd_Alias ALLOW = \
    /usr/bin/grep, \
    /usr/bin/ls, \
    /usr/bin/cat

# 禁止通过sudo使用所有命令
apluser ALL=(ALL) !ALL

# 但是只允许执行无密码执行特定的命令
apluser ALL=(ALL) NOPASSWD:ALLOW
  • 可以无密码执行指定的命令
  • 可以用密码执行没有被禁止的命令
  • 无法sudo -ssudo -i切换为root
bash 复制代码
apluser@FengYeHong-HP:~$ sudo cat /etc/sudoers.d/01-config
# ---------------------------
# 禁止的命令
# ---------------------------
Cmnd_Alias FORBIDDEN = \
    /usr/bin/sh, \
    /usr/bin/bash, \
    /bin/rm, \
    /usr/bin/vi, \
    /usr/bin/vim, \
    /usr/bin/nano, \
    /usr/sbin/visudo, \
    /usr/bin/cp

# ---------------------------
# 允许的命令
# ---------------------------
Cmnd_Alias ALLOW = \
    /usr/bin/grep, \
    /usr/bin/ls, \
    /usr/bin/cat

# 但是只允许执行无密码执行特定的命令
apluser ALL=(ALL) NOPASSWD:ALLOW

# 禁止指定的命令
apluser ALL=(ALL) !FORBIDDEN

五. 日志

5.1 基础日志

⏹如果当前Linux系统是UbuntuDebian的话,sudo相关的日志一般保存在下面的路径中

bash 复制代码
apluser@FengYeHong-HP:~$ ls -l /var/log/auth.log
-rw-r----- 1 syslog adm 7652 Aug 23 18:34 /var/log/auth.log
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ tail /var/log/auth.log
Aug 23 18:32:57 FengYeHong-HP systemd: pam_unix(systemd-user:session): session opened for user root(uid=0) by (uid=0)
Aug 23 18:32:57 FengYeHong-HP systemd-logind[252]: New session c1 of user root.
Aug 23 18:33:01 FengYeHong-HP CRON[759]: pam_unix(cron:session): session opened for user apluser(uid=1000) by (uid=0)
Aug 23 18:33:01 FengYeHong-HP CRON[759]: pam_unix(cron:session): session closed for user apluser
Aug 23 18:34:01 FengYeHong-HP CRON[1012]: pam_unix(cron:session): session opened for user apluser(uid=1000) by (uid=0)
Aug 23 18:34:01 FengYeHong-HP CRON[1012]: pam_unix(cron:session): session closed for user apluser
Aug 23 18:34:37 FengYeHong-HP su: pam_unix(su-l:session): session closed for user root
Aug 23 18:34:37 FengYeHong-HP systemd-logind[252]: Session c1 logged out. Waiting for processes to exit.
Aug 23 18:34:37 FengYeHong-HP systemd-logind[252]: Removed session c1.
Aug 23 18:34:47 FengYeHong-HP systemd: pam_unix(systemd-user:session): session closed for user root
apluser@FengYeHong-HP:~$

⏹现代的Linux系统都会使用 journald,sudo 记录一定会进入 journal,可通过下面的命令进行查看。

bash 复制代码
apluser@FengYeHong-HP:~$ journalctl | grep sudo | tail
Aug 15 08:59:47 FengYeHong-HP sudo[29625]: pam_unix(sudo:session): session closed for user root
Aug 15 09:23:47 FengYeHong-HP sudo[35322]:  apluser : TTY=pts/0 ; PWD=/home/apluser/work/0815 ; USER=root ; COMMAND=/usr/sbin/service cron restart
Aug 15 09:23:47 FengYeHong-HP sudo[35322]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1000)
Aug 15 09:23:47 FengYeHong-HP sudo[35322]: pam_unix(sudo:session): session closed for user root
Aug 15 14:50:19 FengYeHong-HP sudo[44167]:  apluser : TTY=pts/0 ; PWD=/home/apluser/work/0815 ; USER=root ; COMMAND=/usr/bin/rm -i /var/log/cron.log
Aug 15 14:50:19 FengYeHong-HP sudo[44167]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1000)
Aug 15 14:50:21 FengYeHong-HP sudo[44167]: pam_unix(sudo:session): session closed for user root
Aug 15 15:06:09 FengYeHong-HP sudo[48285]:  apluser : TTY=pts/0 ; PWD=/home/apluser/work/0815 ; USER=root ; COMMAND=/usr/bin/systemctl restart cron
Aug 15 15:06:09 FengYeHong-HP sudo[48285]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1000)
Aug 15 15:06:09 FengYeHong-HP sudo[48285]: pam_unix(sudo:session): session closed for user root

5.2 审计日志

在测试阶段的话,可以使用find /var/log/sudo-io -mindepth 3 -type d -mtime +3 -exec rm -rf {} +删除3天之前的文件夹

5.2.1 配置

⏹可根据需求开启,sudo命令的 I/O 审计(输入 / 输出录制)功能,记录用户使用sudo命令切换为root之后进行的操作。

  • 创建保存I/O 审计日志的文件夹
bash 复制代码
sudo mkdir -p /var/log/sudo-io
sudo chown root:root /var/log/sudo-io
sudo chmod 700 /var/log/sudo-io
  • 创建sudo的I/O 审计配置文件
bash 复制代码
apluser@FengYeHong-HP:~$ sudo cat /etc/sudoers.d/30-io-logging
# ===============================
# sudo I/O logging
# ===============================

# 开启 sudo 输入 / 输出录制
Defaults log_output
# sudo I/O 日志的 根目录, 强烈建议设置单独目录,方便日志轮转和限制权限
Defaults iolog_dir="/var/log/sudo-io"
# 设置IO日志的格式, 按 用户 / 日期 / 时间 分类, 适合审计和清理
Defaults iolog_file="%{user}/%Y%m%d/%H%M%S"
# 实时写盘,防止系统崩溃导致 sudo 录像丢失
Defaults iolog_flush
# 不截断输出, 防止长命令 / 长输出被切断
Defaults loglinelen=0

🔹 配置文件创建完成之后,就会立即生效,配置文件会按照字典顺序进行加载。

bash 复制代码
/etc/sudoers
/etc/sudoers.d/*

5.2.2 日志查看

  • 列出最近的 sudo I/O 记录,并只看最后 3 条
  • 可根据TSID来回放查看用户当时的操作
bash 复制代码
apluser@FengYeHong-HP:~$ sudo sudoreplay -d /var/log/sudo-io -l | tail -n 3
Dec 20 13:31:11 2025 : apluser : HOST=FengYeHong-HP ; TTY=/dev/pts/0 ; CWD=/home/apluser ; USER=root ; TSID=apluser/20251220/133111 ; COMMAND=/usr/bin/sudoreplay -d /var/log/sudo-io -l
Dec 20 13:31:21 2025 : apluser : HOST=FengYeHong-HP ; TTY=/dev/pts/0 ; CWD=/home/apluser ; USER=root ; TSID=apluser/20251220/133121 ; COMMAND=/usr/bin/sudoreplay -d /var/log/sudo-io -l
Dec 20 13:31:25 2025 : apluser : HOST=FengYeHong-HP ; TTY=/dev/pts/0 ; CWD=/home/apluser ; USER=root ; TSID=apluser/20251220/133125 ; COMMAND=/usr/bin/sudoreplay -d /var/log/sudo-io -l

⏹文件结构

文件 是否纯文本 说明
stdin 键盘输入流(含控制字符)
stdout 程序输出流
stderr 错误输出
timing 时间轴(二进制)
log 半文本 元数据(可读但不完整)
bash 复制代码
apluser@FengYeHong-HP:~$ sudo ls -l /var/log/sudo-io/apluser/20251220 | tail -n 3
drwx------ 2 root root 4096 Dec 20 13:32 133205
drwx------ 2 root root 4096 Dec 20 13:32 133210
drwx------ 2 root root 4096 Dec 20 13:33 133310
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ sudo ls -l /var/log/sudo-io/apluser/20251220/133205
total 24
-rw------- 1 root root   98 Dec 20 13:32 log
-rw------- 1 root root 2400 Dec 20 13:32 log.json
-rw------- 1 root root   25 Dec 20 13:32 stderr
-rw------- 1 root root   25 Dec 20 13:32 stdout
-r-------- 1 root root   43 Dec 20 13:32 timing
-rw------- 1 root root   78 Dec 20 13:32 ttyout

⏹通过sudo sudoreplay进行日志回放,可将当时用户输入的命令和屏幕上输出的内容保存显示到屏幕上

bash 复制代码
apluser@FengYeHong-HP:~$ sudo sudoreplay /var/log/sudo-io/apluser/20251220/133615
Replaying sudo session: /usr/bin/ls -l /

total 2752
drwxr-xr-x   3 root root    4096 Jun  7  2025 Docker
lrwxrwxrwx   1 root root       7 Oct 26  2022 bin -> usr/bin
drwxr-xr-x   2 root root    4096 Apr 18  2022 boot
drwxr-xr-x   8 root root    3160 Dec 20 08:58 dev
drwxr-xr-x  74 root root    4096 Dec 20 13:15 etc
drwxr-xr-x   3 root root    4096 May 25  2025 home
-rwxrwxrwx   1 root root 2724464 Apr 24  2025 init
lrwxrwxrwx   1 root root       7 Oct 26  2022 lib -> usr/lib
lrwxrwxrwx   1 root root       9 Oct 26  2022 lib32 -> usr/lib32
lrwxrwxrwx   1 root root       9 Oct 26  2022 lib64 -> usr/lib64
lrwxrwxrwx   1 root root      10 Oct 26  2022 libx32 -> usr/libx32
drwx------   2 root root   16384 Apr 11  2019 lost+found
drwxr-xr-x   2 root root    4096 Oct 26  2022 media
drwxr-xr-x   8 root root    4096 May 25  2025 mnt
drwxr-xr-x   2 root root    4096 Oct 26  2022 opt
dr-xr-xr-x 198 root root       0 Dec 20 08:58 proc
drwx------   7 root root    4096 Dec 20 10:31 root
drwxr-xr-x   8 root root     180 Dec 20 09:38 run
lrwxrwxrwx   1 root root       8 Oct 26  2022 sbin -> usr/sbin
drwxr-xr-x   9 root root    4096 Aug 15 08:04 snap
drwxr-xr-x   2 root root    4096 Oct 26  2022 srv
dr-xr-xr-x  13 root root       0 Dec 20 08:57 sys
drwxrwxrwt   6 root root    4096 Aug 23 18:32 tmp
drwxr-xr-x  14 root root    4096 Oct 26  2022 usr
drwxr-xr-x  13 root root    4096 Oct 26  2022 var
drwx------   2 root root    4096 Jun  1  2025 wslDlkkam
drwx------   2 root root    4096 Jun  1  2025 wslLGBDdm
drwx------   2 root root    4096 Jun  1  2025 wslhKEkcm
drwx------   2 root root    4096 Jun  1  2025 wsllPAenj
drwx------   2 root root    4096 Jun  1  2025 wslpdJOcm
相关推荐
JiMoKuangXiangQu2 小时前
Linux 内存管理:页表管理简析
linux·mmu·内存管理·页表管理
WG_172 小时前
Linux:缓冲区_glibc封装
linux·运维·服务器
番知了2 小时前
Ubuntu 22.04 常用命令清单
linux·运维·ubuntu
旺仔Sec2 小时前
2026年河北省职业院校技能大赛“网络系统管理”(高职组)网络构建样题
运维·服务器·网络
FF-Studio2 小时前
Ubuntu 24.04 磁盘爆满“灵异“事件:Btrfs, Snapper 与删不掉的空间
linux·运维·人工智能·ubuntu
爱尔兰极光2 小时前
计算机网络--网络层
运维·服务器·计算机网络
Neolnfra2 小时前
Xshell SSH 连接故障排查
运维·服务器·网络·ssh·xshell·运程连接
极地星光2 小时前
Ubuntu 16.10 启动时 networking.service 缓慢问题
linux·ubuntu
Roadinforest2 小时前
如何使用 keyd 定制 Caps Lock:拯救你坏掉的 Left Control 键(Linux-Ubuntu)
linux·ubuntu