OpenClaw 1Password 技能实战:op CLI 的 sign-in、read、run 与 inject 命令详解
2026/9/7 18:34:54 网站建设 项目流程

OpenClaw 1Password 技能实战:op CLI 的 sign-in、read、run 与 inject 命令详解

【免费下载链接】openclawThe AI that really does things. Any OS. Any Platform. The lobster way. 🦞项目地址: https://gitcode.com/GitHub_Trending/cl/openclaw

OpenClaw 仓库内置的1password技能(skills/1password/)把 1Password 官方opCLI 封装成 Agent 可直接调用的密钥读取与注入能力。本文以该技能自带的命令速查文档 skills/1password/references/cli-examples.md 为主体,逐组讲解 sign-in、read、run、inject 与账户管理五类核心命令的真实用法,并结合技能定义文件补充认证模式选择与调用守卫规则,帮助你让 OpenClaw 在不把密钥落到磁盘、不进入对话上下文的前提下安全消费 1Password 中的凭据。

op CLI 在 OpenClaw 中的定位

在 OpenClaw 中,1password是一个声明式技能:其元数据 skills/1password/SKILL.md 声明了运行前置条件requires.bins: ["op"],并提供 Homebrew 安装项(1password-cliformula,产出op可执行文件)。技能加载后,Agent 会按 SKILL.md 中的工作流执行:

  1. 检查操作系统与 shell 环境;
  2. op --version验证 CLI 存在;
  3. 探测用户配置的认证模式(服务账户 / 桌面应用集成 / 独立 sign-in);
  4. 按对应模式运行op命令(即本文主体);
  5. 在执行任何密钥读取前先跑op whoami验证访问;
  6. 多账户场景下用--account或环境变量OP_ACCOUNT指定目标账户。

skills/1password/references/cli-examples.md 正是第 4、5 步所用的命令样例库,内容按op help输出组织为 Sign in、Read、Run、Inject、Whoami / accounts 五个部分,下文逐节展开。

Sign in:会话建立

原文档给出的基础命令:

op signin op signin --account <shorthand|signin-address|account-id|user-id>

op signin用于在没有桌面应用集成、也没有服务账户令牌时的交互式登录。--account参数接受四种定位方式之一:账户 shorthand(如my.1password.com)、sign-in address、账户 ID 或用户 ID,用于在登录了多个 1Password 账户的机器上明确选择目标。

需要注意:在桌面应用集成或OP_SERVICE_ACCOUNT_TOKEN服务账户模式下不需要执行op signin。技能文档明确提示独立 sign-in 会“每个会话都提示账户密码”,因此只在既无服务账户也无应用集成的主机上才走到这条路。POSIX shell 下,op signin会打印一段eval形式的 export,用于在当前 shell 中设置OP_SESSION_*会话令牌;多账户场景下同样可用op account add先把账户加入 CLI 再登录(见 skills/1password/references/get-started.md 中“对非集成认证使用op account add”的说明)。

Read:读取条目密钥

这是 Agent 消费凭据最常用的命令组,原文档示例覆盖了四种典型形态:

op read op://app-prod/db/password op read "op://app-prod/db/one-time password?attribute=otp" op read "op://app-prod/ssh key/private key?ssh-format=openssh" op read --out-file ./key.pem op://app-prod/server/ssh/key.pem

逐条说明:

  • 标准 item URIop://<vault>/<item>/<field>三段式定位保险库、条目与字段,op://app-prod/db/password即读取app-prod库中db条目的password字段。
  • OTP 属性:一次性口令条目通过查询参数?attribute=otp取当前 TOTP 码,而非静态密码字段。注意字段名含空格时用引号包住整个 URI。
  • SSH 私钥格式化?ssh-format=openssh让 CLI 把存储的私钥重新编码为 OpenSSH 兼容格式后输出,供sshscp等工具直接使用。
  • --out-file落盘:把密钥直接写入指定文件(如./key.pem)而不是打印到 stdout,减少密钥经过终端输出通道的机会,适合需要以文件形式交付的证书、私钥场景。

URI 中任何字段名含空格或特殊字符时都应加引号,这与原文档示例中"op://app-prod/db/one-time password?attribute=otp"的写法一致。

Run:把密钥注入命令而不暴露它

原文档给出了完整的“引用式注入”用法:

export DB_PASSWORD="op://app-prod/db/password" op run --no-masking -- printenv DB_PASSWORD op run --env-file="./.env" -- printenv DB_PASSWORD

其工作原理是:环境变量里存的不是明文而是op://URI 引用,随后由op run拉起目标命令并在运行时把引用解析为真实值。这样密钥只存在于子进程环境里,stdout 中看到的是引用而非明文。

  • --no-masking:默认情况下op run会对输出中被判定为密钥的值做遮蔽处理;加该参数可让真实值原样输出(原文档用它配合printenv演示)。生产使用中应仅在确认需要时才关闭 masking。
  • --env-file:直接从文件(如./.env)中批量读取形如VAR=op://...的引用定义,免去逐条 export,适合把整套环境配置集中在一个 env 文件中。
  • --之后的部分是真正要执行的命令,这是op run的固定分隔语法。

技能守卫规则(见 skills/1password/SKILL.md 的 Guardrails 一节)明确要求:优先使用op run/op inject,而不是把密钥写到磁盘上,且绝不允许把密钥粘贴进日志、聊天或代码。

Inject:模板占位符批量替换

原文档示例:

echo "db_password: {{ op://app-prod/db/password }}" | op inject op inject -i config.yml.tpl -o config.yml

op inject扫描标准输入或模板文件,把{{ op://... }}占位符替换为对应条目的真实值:

  • 管道用法适合临时生成一份带凭据的 YAML/JSON 交给下游工具;
  • -i/-o用法适合维护一份不含明文的配置模板config.yml.tpl,每次部署时注入生成config.yml,使仓库与磁盘上的持久文件都不含密钥。

配合--out-file(read)与--env-file(run),三条路径分别覆盖了“文件交付”“命令注入”“模板注入”三类常见密钥消费场景。

Whoami / accounts:会话与多账户管理

op whoami op account list
  • op whoami:验证当前 CLI 会话的认证状态,是 OpenClaw 工作流中任何密钥读取前的强制前置检查;
  • op account list:列出本机已配置的账户,配合--account <shorthand|signin-address|account-id|user-id>OP_ACCOUNT环境变量在多账户主机上切换目标。

命令背后的认证模式与调用环境

命令本身很简单,但能否跑通取决于认证模式与进程环境,这也是技能文档比通用 CLI 手册多出的部分:

  • 服务账户(headless / CI / 网关首选):设置OP_SERVICE_ACCOUNT_TOKEN(如export OP_SERVICE_ACCOUNT_TOKEN="ops_...")后直接执行op vault listop read ...即可,无需 tmux、无需 signin 步骤;该模式不走桌面 IPC 通道,在 tmux 内外行为一致。
  • 桌面应用集成(macOS / Windows / Linux 桌面):CLI 通过每用户 IPC 通道与桌面应用通信,传输方式按平台不同——macOS 走 XPC(经 1Password Browser Helper)、Linux 走 Unix domain socket、Windows 走命名管道。因此必须从当前执行环境直接运行op,不要包进 tmux 子 shell:tmux 运行在不同环境上下文里,可能够不到 IPC 通道,产生1Password CLI couldn't connect to the 1Password desktop app报错。此时正确做法是确认桌面应用已运行且已解锁后重试直连,而不是切换到 tmux。macOS 上可参考集成组容器路径~/Library/Group Containers/2BUA8C4S2C.com.1password/t/辅助识别该故障形态。
  • 独立交互式 sign-in:唯一值得借助 tmux 的模式——op signin输出的OP_SESSION_*export 只存在于当前 shell,网关按命令分开的 shell 会在调用之间丢失该状态,用一个持久 tmux pane 配合eval "$(op signin ...)"可让会话令牌保持有效。tmux 示例中特意启动/bin/sh,保证即使用户默认 shell 是 fish,POSIX 形式的eval也依然有效;Windows 上则应改用桌面集成或服务账户认证。

环境层面的系统要求(来自 skills/1password/references/get-started.md):op支持 macOS、Windows、Linux;macOS/Linux shell 覆盖 bash、zsh、sh、fish,Windows 为 PowerShell;桌面应用集成需要 macOS Big Sur 11.0 及以上,Linux 集成还需要 PolKit 与认证代理;开启集成的路径为应用内 Settings > Developer > Integrate with 1Password CLI(Windows 先开启 Windows Hello,Linux 先在 Security 中启用系统认证解锁)。

故障排查速查

技能文档给出的 “account is not signed in” 三分支处置,与命令组一一对应:

认证模式处置
服务账户重新 exportOP_SERVICE_ACCOUNT_TOKEN
桌面应用集成确认应用正在运行且 CLI 集成已启用,直接重试
独立 sign-in在同一个 tmux 会话内重新执行op signin并完成授权

小结

skills/1password/references/cli-examples.md 用五组命令覆盖了opCLI 的完整密钥消费链路:op signin [--account ...]建立会话,op read op://...(含?attribute=otp?ssh-format=openssh--out-file变体)读取条目,op run--no-masking/--env-fileop://引用注入命令环境,op inject{{ op://... }}模板替换,op whoami/op account list校验会话并管理多账户。在 OpenClaw 中使用时,先按 skills/1password/SKILL.md 的工作流探测认证模式、以op whoami验证访问,并遵守“密钥不落盘、不进日志、优先 run/inject”的守卫规则,即可让 Agent 在任意平台安全地读取与注入 1Password 密钥。

【免费下载链接】openclawThe AI that really does things. Any OS. Any Platform. The lobster way. 🦞项目地址: https://gitcode.com/GitHub_Trending/cl/openclaw

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询