linux 本身不支持 sudo 自动录屏,但可通过包装脚本+sudoers 限制实现近似效果:编写脚本先调用 ffmpeg 录制再执行高危命令,并在 sudoers 中严格限定可运行路径与参数;更推荐 script 或 auditd 等轻量、可靠、可审计的终端记录方式。

Linux 系统本身不支持在 sudo 执行命令时自动触发视频录制,sudoers 文件也不具备调用摄像头或启动录屏进程的能力。但可通过组合系统机制(如 sudoers 的 SETENV、env_check、命令包装脚本和桌面/服务端录屏工具)实现“执行高危命令时自动开始录制”的近似效果。
核心思路:用包装脚本拦截高危命令并触发录制
不能直接在 sudoers 里写“录屏”,但可以:
- 将真实高危命令(如
rm -rf /、userdel、systemctl reboot)替换成自定义包装脚本 - 该脚本先启动录屏(如用
ffmpeg捕获桌面或终端会话),再执行原命令 - 通过
sudoers限制用户只能运行该包装脚本,且禁止绕过(禁用shell、env_reset等)
具体实施步骤
1. 编写录制+执行脚本(例如 /usr/local/bin/sudo-safe-rm)
```bash
#!/bin/bash
# 启动屏幕录制(适配 Wayland/X11,此处以 X11 + ffmpeg 为例)
RECORD_PID=""
if command -v ffmpeg >/dev/null; then
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
RECORD_FILE="/var/log/sudo-records/${USER}_rm_${TIMESTAMP}.mp4"
mkdir -p "/var/log/sudo-records"
# 录制当前用户主显示器(X11)
ffmpeg -y -f x11grab -i "$DISPLAY" -t 300 -c:v libx264 "$RECORD_FILE" &
RECORD_PID=$!
sleep 0.5 # 确保 ffmpeg 启动成功
fi
# 执行实际命令(需校验参数防滥用)
if [[ $# -ge 2 && "$1" == "-rf" ]]; then
echo "[AUDIT] $(date): $USER ran sudo-safe-rm $*" | logger -t sudo-safe
/bin/rm "$@"
else
echo "Usage: sudo-safe-rm -rf
exit 1
fi
# 结束录制(可选:也可用 timeout 或信号控制)
if [[ -n "$RECORD_PID" ]]; then
kill "$RECORD_PID" 2>/dev/null
wait "$RECORD_PID" 2>/dev/null
fi
```
赋予可执行权限:chmod +x /usr/local/bin/sudo-safe-rm
2. 配置 sudoers(使用 visudo)
```
# 禁用环境变量继承,防止绕过
Defaults env_reset
Defaults env_delete+="PATH SHELL HOME USER"
# 允许特定用户仅以限定参数运行包装脚本
alice ALL=(ALL) NOPASSWD: /usr/local/bin/sudo-safe-rm -rf /home/*, /usr/local/bin/sudo-safe-rm -rf /tmp/*
```
⚠️ 注意:路径必须严格限制,避免 /usr/local/bin/sudo-safe-rm -rf / 这类通配失控;建议结合 root_sudo 日志 + auditd 做二次审计。
替代方案:终端会话录制(更可靠、无需摄像头)
对多数运维场景,“录屏”实质是记录操作过程。相比图形录制,以下方式更稳定、轻量、可审计:
- 使用
script命令录制终端会话:script -q -f /var/log/sudo-records/$(date +%s).log - 配合
sudoers的requiretty和noexec提升安全性 - 用
auditd规则监控 execve 系统调用,记录所有 sudo 命令及其参数(比视频更精准、不可篡改)
注意事项与局限
• 图形界面录制依赖显示服务器(X11/Wayland)、用户会话状态,无 GUI 环境(如 SSH 连接无桌面)时失效
• sudoers 不支持条件逻辑或外部命令调用,一切“自动化”必须由包装脚本承担
• 录制文件权限需设为仅 root 可读,防止用户删除或篡改
• 视频录制存在延迟、性能开销和存储压力,生产环境建议优先采用结构化日志(journalctl _SUDO_USER=... + audit.log)










