hermes approvals test:运行危险命令之前,先问问审批系统


你要往一个无人值守的脚本里加一条清理命令,但有个问题看代码看不出来:*Hermes 会让它通过吗?*靠猜的话,要么运行到一半弹出审批框却没人应答,要么你本以为会被拦截的命令悄悄执行了。v0.21.0 为此给出了顺理成章的工具:hermes approvals test 把任意命令对着真实审批守卫做一次预演——硬性黑名单、你的 approvals.deny 规则、危险模式检测、白名单,甚至 yolo/off 旁路——打印出裁决结果,不执行任何东西、不询问任何人、也不落盘任何东西。

三个退出码就是答案

hermes approvals test -- rm -rf /tmp/x

-- 很关键:它终止参数解析,命令自己的旗标(比如 -rf)不会被 hermes approvals 吞掉。输出会告诉你裁决、命中的规则,以及标准化后的命令轨迹——和真实门禁用的同一套标准化逻辑。脚本直接用退出码拿答案:

  • 0 — 放行
  • 2 — 需要询问(会弹审批)
  • 3 — 拒绝(硬性黑名单或你自己的 deny 规则)

于是你可以把它接进预检流程:部署脚本在某个步骤会被拦截时拒绝继续;cron 任务在运行一个反正会被门禁拦下的命令之前就响亮地失败;或者做一次审计,扫描脚本里任何会在无人值守场景下弹窗的命令。

它到底评估什么

预演走的是和真实命令完全相同的决策链,包括:

  • 硬性黑名单(无条件拒绝的命令),
  • 你的 approvals.deny fnmatch glob 列表(schema 见智能审批配置指南),
  • 危险模式检测(递归删除、sudo、磁盘写入、凭证修改……),
  • 命令白名单(你已经放行的命令),
  • 以及你开启时的 yolo/off 旁路(详见yolo 七种模式)。

两个旗标微调检查:--env-type 指定按哪种终端后端评估(默认 local;docker 这类隔离容器后端会跳过守卫,所以在容器里没事的命令在本地可能弹窗——写脚本前值得先知道),--json 输出机器可读结果。

彩蛋命令:hermes approvals suggest

hermes approvals test 回答“会怎样?”,它的兄弟 hermes approvals suggest 回答“该放行什么?”。它会从会话数据库里挖掘你过去的审批决定,给反复出现的模式排序,并提出 command_allowlist 候选条目——不应用就不写入任何东西:

hermes approvals suggest                  # 先看编号提案
hermes approvals suggest --apply 1,3,7    # 把选中的并进 config.yaml

可选参数:--days(回溯天数,默认 90)、--min-count(模式最少出现次数,默认 2)、--limit--db(指定会话数据库)、--json。破坏性类别(递归删除、sudo、磁盘写入、凭证修改……)永远不会被建议——工具不会建议放行它存在的意义就是要拦的东西。它与 cron 场景的无人值守审批正好互补。

什么时候会用上它

三个典型时刻。写自动化之前:把每个有风险的步骤预演一遍,要么有意放行,要么提前处理弹窗路径。审计:对可疑命令跑 hermes approvals test -- <cmd>,能精确告诉你哪条规则拦截了它——不用试跑。理解系统:标准化轨迹展示了 Hermes 眼里你的命令长什么样,这是搞懂“我以为人畜无害的 shell 一行流为什么触发门禁”最快的途径。v0.21.0 还整体加固了审批面(Windows 破坏性命令现在也会触发、受保护指令文件一律要求审批)——完整图景见 /zh/releases/v0-21-0/