命令助手机密源

在启动时运行你自己的助手命令来解析凭据——任何带 CLI 的机密库都可用:keepassxc-cli、secret-tool(GNOME Keyring)、pass、gpg、Vaultwarden 的 CLI,或者一个 cat 出 tmpfs 环境变量文件的脚本。助手在 stdout 上打印 KEY=VALUE 行;Hermes 通过与 Bitwarden 和 1Password 相同的编排器应用它们,因此你可以同时启用任意组合的机密源。

工作原理

  1. 你在 config.yaml 中配置一条助手命令(绝不要写在 .env 里——命令是配置,.env 存放值)。
  2. 启动时,在 .env 加载之后,Hermes 通过 /bin/sh -c 运行一次该助手,并把它的 stdout 解析为一份 dotenv 数据块。
  3. 解析出的键值流经标准的优先级阶梯:.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"

配置

键默认值作用
enabledfalse总开关。
command""通过 /bin/sh -c 运行的助手;必须在 stdout 打印 KEY=VALUE 行。
helper_timeout_seconds3单次助手运行的硬超时。刻意设得很紧——助手必须快速且非交互(无解锁提示、无触摸/PIN)。
override_existingfalse助手值覆盖 .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 操作,不妨考虑做一个正规的机密源插件——插件能获得缓存、来源标签和类型化配置。