1116 字
6 分钟
agent-sudo —— AI Agent 特权命令的批量审批工具

在日常使用 OpenCode 等 AI Agent 平台时,Agent 经常需要执行需要 root 权限的操作:安装依赖包、管理系统服务、修改系统配置文件。这些操作无法由 Agent 直接完成,需要人类介入审批。

Linux 桌面环境的标准方案是 pkexec,它通过 PolicyKit 为每条特权命令弹出独立的确认对话框。这个机制在手动执行单条命令时没有问题,但在 Agent 工作流的场景下存在明显的效率问题:Agent 的一个任务可能需要五条甚至更多的 sudo 命令,而 pkexec 会为每条命令弹一次对话框,每次都需要人类查看、判断、输入密码。重复的打断不仅拖慢了工作进度,也增加了人在多条相似对话框中做出错误判断的风险。

为此我写了 agent-sudo。

7emotions
/
agent-sudo
Waiting for api.github.com...
00K
0K
0K
Waiting...

设计#

agent-sudo 采用 queue + flush 模式。Agent 在需要特权时将命令逐条排入队列,所有命令收集完毕后,一次性提交给人类审批。

# Agent 将需要的特权命令排入队列,每条附带理由
agent-sudo --reason "安装编译工具链" -- apt install -y gcc make cmake
agent-sudo --reason "创建 /opt/app 目录并设权限" -- install -m 0755 -d /opt/app
agent-sudo --reason "启动 nginx 服务" -- systemctl enable --now nginx

# 全部排完后,一次性提交审批
agent-sudo-flush

agent-sudo-flush 会弹出一个 PySide2 原生 Qt5 窗口,集中展示队列中的所有命令。每条命令旁标注了 Agent 添加的 --reason,人类可以在一个窗口中查看全部待审批命令的上下文,勾选需要执行的,取消不需要的,然后输入密码一次执行。

agent-sudo GUI

工作流时序:

Humanagent-sudoAgentHumanagent-sudoAgent写入 queue.json追加 queue.json读取 queue.json[阻塞等待]查看命令、勾选/取消输入 sudo 密码执行 sudo 命令写入 history.json继续工作agent-sudo --reason "..."agent-sudo --reason "..."agent-sudo-flush弹出 PySide2 GUI点击执行退出码

与 pkexec 的对比#

agent-sudopkexec
审批模式所有命令集中在一个窗口每条命令独立弹窗
命令上下文每条命令附带 --reason 说明仅显示命令本身
选择性执行支持,可单独取消不需要的命令逐条只能接受或拒绝
历史记录history.json 记录每次审批详情仅 syslog
超时处理60 秒无操作自动拒绝,有暂停按钮PolicyKit 默认超时机制
配置要求零配置,能运行 sudo 即可依赖 DBus + PolicyKit
密码处理通过 stdin 传递,内存中用完即清零由 PolicyKit agent 管理

sudoers 白名单方案则需要预先用 root 权限编辑 /etc/sudoers 文件,将允许的命令列表写入。Agent 的需求是动态的,每次新增命令类别都需要修改 sudoers,且语法错误可能导致 sudo 不可用。对于 Agent 工作流中频繁变化的权限需求,白名单的维护成本较高。

更多细节#

倒计时自动拒绝。审批窗口弹出后启动 60 秒倒计时,超时无人操作则自动拒绝,Agent 收到退出码 126 后可以判断审批未通过。有暂停按钮允许人在来不及操作时暂停倒计时。

密码安全。密码通过 stdin 传递给 sudo -S,执行完成后使用 ctypes.memset 将内存中的密码清零,不写入磁盘。

LLM 反馈通道。审批窗口底部有一个可折叠的文本输入区。人类可以在拒绝执行时留下说明,Agent 会从 stdout 中读取 LLM_PROMPT: 开头的文本并根据反馈调整后续行为。

审计记录。每次审批的时间、命令列表、执行结果均记录在 ~/.cache/agent-sudo/history.json 中,便于事后追溯。

安装#

git clone https://github.com/7emotions/agent-sudo.git ~/agent-sudo
pip install PySide2
sudo ln -sf ~/agent-sudo/src/main.py /usr/local/bin/agent-sudo
sudo ln -sf ~/agent-sudo/src/main.py /usr/local/bin/agent-sudo-flush

依赖 Python 3.8+、PySide2,需要有图形会话环境($DISPLAY 非空)。完整步骤见 INSTALL.md。

结语#

agent-sudo 解决的是 AI Agent 工作流中一个具体的效率问题:将多条特权命令的审批从多次中断合并为一次集中决策。它不替代 sudo,而是在 Agent 和 root 权限之间增加一层全局视角的审批环节。

项目以 MIT 协议开源,欢迎试用和反馈。

agent-sudo —— AI Agent 特权命令的批量审批工具
https://lorenzofeng.top/posts/agent-sudo/
作者
Lorenzo Feng
发布于
2026-06-23
许可协议
CC BY-NC-SA 4.0