命令助手机密源
在启动时运行你自己的助手命令来解析凭据——任何带 CLI 的机密库都可用:keepassxc-cli、secret-tool(GNOME Keyring)、pass、gpg、Vaultwarden 的 CLI,或者一个 cat 出 tmpfs 环境变量文件的脚本。助手在 stdout 上打印 KEY=VALUE 行;Hermes 通过与 Bitwarden 和 1Password 相同的编排器应用它们,因此你可以同时启用任意组合的机密源。
工作原理
- 你在
config.yaml中配置一条助手命令(绝不要写在.env里——命令是配置,.env存放值)。 - 启动时,在
.env加载之后,Hermes 通过/bin/sh -c运行一次该助手,并把它的 stdout 解析为一份 dotenv 数据块。 - 解析出的键值流经标准的优先级阶梯:
.env/shell 胜出,除非override_existing: true;在存在冲突的变量上,已映射的源优先于这个批量源;先声明者胜出。
secrets:
command:
enabled: true
command: "cat /run/user/1000/hermes-secrets.env"
# 或任何能输出 KEY=VALUE 行的保险库 CLI:
# command: "pass show hermes/env"
# command: "secret-tool lookup service hermes-env"
配置
| 键 | 默认值 | 作用 |
|---|---|---|
enabled | false | 总开关。 |
command | "" | 通过 /bin/sh -c 运行的助手;必须在 stdout 打印 KEY=VALUE 行。 |
helper_timeout_seconds | 3 | 单次助手运行的硬超时。刻意设得很紧——助手必须快速且非交互(无解锁提示、无触摸/PIN)。 |
override_existing | false | 助手值覆盖 .env/shell 值。默认关闭(不像 Bitwarden/1Password),因为本地助手不是集中轮换权威。 |
安全模型
- 助手命令字符串是你的配置——与你掌控的
.env文件处于同一信任级别。 - 输出硬上限为 1 MiB;失控的助手无法卡住启动(超时即杀死整个进程组)。
- 助手的 stderr 被丢弃——保险库 CLI 的诊断信息可能携带机密材料,因此永远不会进入 Hermes 的输出。失败只记录结构化字段(退出码/信号/errno),绝不记录命令字符串。
- 纯空白值视为"无值"——占位条目永远不会流入 Authorization 请求头。
- 仅 POSIX(需要
/bin/sh)。在 Windows 上该源会自报未配置,启动继续。
失败模式
启动永远不会被阻塞。错误会打印一行说明外加一条 → 修复提示:
| 症状 | 原因 | 修复 |
|---|---|---|
secrets.command.command is empty | 启用了却没配命令 | 在 config.yaml 中设置 secrets.command.command |
helper command failed | 非零退出、超时、派生失败 | 在 shell 中手动运行助手以查看其真实错误(Hermes 有意丢弃它的 stderr) |
helper output was not a KEY=VALUE map | 助手打印了裸值或乱码 | 让助手输出 dotenv 格式的行 |
何时用它、何时用插件
命令源是为没有内置集成的保险库准备的逃生舱。如果你发现自己在用一个长脚本包装复杂的 CLI 操作,不妨考虑做一个正规的机密源插件——插件能获得缓存、来源标签和类型化配置。