gsudo v1.1 尝试做了一个“信任窗口“功能:用户勾选“信任 5 分钟“后自动放行。但发布前撤掉了。这里记下为什么撤销,以及正确的方向是什么。

背景

pi 等 coding agent 执行系统包安装、服务重启等操作时,需要提权。但 agent 没有用户密码,sudo 的 askpass 机制在非交互环境下也无法工作。gsudo 通过弹出 GUI 窗口让用户点击确认,解决了“agent 需要 sudo 但没有密码“的问题。

问题

gsudo 不检查 sudo 的凭证缓存状态。agent 每调一次 gsudo → gsudo 每次弹窗 → 每次都要用户重新输密码,哪怕一秒钟前刚刚输过、sudo 缓存还有效。

安装 5 个包,5 条 apt install →
  agent 调了 5 次 gsudo →
    用户弹了 5 次密码框,输了 5 遍密码

用户期望的是:第一次输密码 → sudo 缓存有效期内 → 后续调用只弹确认按钮(不输密码)。但 gsudo 没有利用 sudo 缓存状态,每次都当全新的提权请求处理。

尝试:信任窗口

gsudo v1.1 实现了一个“信任窗口“功能:用户在 GUI 勾选“信任此实例 5 分钟“后,同实例后续调用自动放行,跳过确认弹窗。

已撤销。v1.1 正式发布中不包含此功能。

为什么撤销

用时间偷换意图。

信任窗口试图回答的问题是:“用户信任这个 agent 继续提权吗?”

但实现方式用的是:“用户 5 分钟前点过信任,所以现在还信任”。

场景 A:agent 连续调 10 条命令,2 分钟完事 → 还剩 3 分钟信任空挂在那边
场景 B:一次性复杂任务跑 8 分钟 → 5 分钟弹窗弹回来,打断用户

固定时长的信任窗口和实际任务节奏完全脱节。“信任“绑定到的是意图(这次任务我信你),不是倒计时。

正确方向

问题的根源是 gsudo 没有利用 sudo 已有的凭证缓存。sudo 自己有 timestamp_timeout(默认 15 分钟),在这个窗口内 sudo cmd 不需要密码。修复应该让 gsudo 在每次被调用时先尝试免密执行:

gsudo 被调用
  → 检查 sudo timestamp 是否有效
    → 有效 → 弹简化确认(只需点"确认",不用输密码)
    → 过期 → 弹完整密码框

更深层的问题——弹窗频率——正确方向在 agent 层:

v1.0  逐条确认              ← 每调 gsudo 弹一次
v2.x  会话级信任            ← agent 启动时一句"本次会话允许提权"
v3.x  任务级信任            ← agent 声明任务类型

gsudo 本身不需要变——它只是一个“让用户点确认“的 GUI 桥。真正的改法在 agent 层。