关于 one-password
指导使用 1Password CLI 处理凭据任务的 skill,涵盖服务账户访问、需获同意的桌面访问,以及发布密钥管理规则。
主要功能
- 01服务账户访问流程
- 02桌面访问的同意检查
- 03凭据查询与字段读取指引
- 04发布凭据整理规则
- 05共享 tmux 任务流程
适用场景
- 01读取 Molty 保管库中的凭据
- 02经同意处理 Molty 之外的凭据
- 03查找仓库所需的发布密钥
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ steipete/ agent-scripts --skill one-password安装后在 Claude Code 中输入/one-password确认已加载。
附带文件references/cli-examples.mdreferences/get-started.md
详细介绍
1Password CLI
安装(仅使用稳定路径 — 绝不使用 brew)
在 Peter 的所有 Mac 上,op 都位于 ~/bin/op,并有兼容性符号链接 /opt/homebrew/bin/op -> ~/bin/op。不要通过 Homebrew cask 安装或升级:其带版本号的 Caskroom 路径会导致 op 每次升级时都获得新的 macOS TCC 身份,从而再次向 Peter 弹出“App 数据保护”对话框。更新方法:从 https://app-updates.agilebits.com/product_history/CLI2 下载官方签名 pkg,运行 pkgutil --check-signature(AgileBits 2BUA8C4S2C)和 pkgutil --expand-full,然后运行 install -m 755 <payload>/op ~/bin/op。稳定路径可以避免路径/版本身份变化,但无法让 macOS 授权在不同 op 进程间保持有效。
其他事项请遵循官方 CLI 入门步骤。不要猜测安装命令。
参考资料
- 官方文档:https://developer.1password.com/docs/cli/get-started/
- 官方应用集成开关:https://developer.1password.com/docs/cli/app-integration/
- Apple
SystemPolicyAppData:https://developer.apple.com/documentation/xcode/resetting-access-to-protected-resources-in-macos - 已知的重复弹窗问题:https://github.com/1Password/shell-plugins/issues/586
references/get-started.md(安装 + 应用集成 + 登录流程)references/cli-examples.md(实际的op示例,包括安全的项目创建/编辑模式)
访问路径(严格按顺序)
1. 服务账号 — 默认方式,不会弹出提示。 OP_SERVICE_ACCOUNT_TOKEN 由 ~/.profile(Codex 管理的代码块)导出,权限范围为 Molty 保管库(读写)。每条服务账号命令都必须设置 OP_LOAD_DESKTOP_APP_SETTINGS=false 和 OP_BIOMETRIC_UNLOCK_ENABLED=false。前者可阻止读取设置文件;后者是 1Password 官方提供的应用集成覆盖选项。
- 必须使用以下命令形式:
OP_LOAD_DESKTOP_APP_SETTINGS=false OP_BIOMETRIC_UNLOCK_ENABLED=false OP_SERVICE_ACCOUNT_TOKEN="$OP_SERVICE_ACCOUNT_TOKEN" op item get "<item>" --vault Molty ...。 - 必须指定
--vault Molty;即使令牌有效,省略此参数也会失败。 - 此路径上绝不要运行
op signin,也绝不要使用--account。这两种方式都会通过桌面应用进行操作,并向 Peter 弹出授权提示。--account+ 令牌 = 交互式路径,始终是错误做法。 - 旧别名
MOLTY_OP_SERVICE_ACCOUNT_TOKEN仅作备用;可能已过期。 - 如果令牌缺失/过期或读取项目失败:报告确切错误并询问。不要悄悄回退到桌面应用。
2. 桌面应用 — 仅在明确同意后使用。 用于确实不在 Molty 中的项目(个人 Private 保管库、OpenClaw-Core)。不自动回退。
- 先暂停并在聊天中询问:项目名称 + 需要它的原因。等待肯定答复。
- 如果主机不是主设备、是虚拟机或无头主机,请将此流程转到匹配的个人或工作托管环境中的当前实体工作站;参见“远程路由 — 仅限桌面路径”。
- 获得同意后:在共享的
op-work会话中使用一个任务窗口(见下文)。在该窗口中,先运行unset OP_SERVICE_ACCOUNT_TOKEN MOLTY_OP_SERVICE_ACCOUNT_TOKEN;已导出的服务令牌会覆盖--account my.1password.com,并悄悄将读取范围限制在 Molty。然后运行一次op signin --account my.1password.com,并尽可能将整个任务的所有交互式读取集中在同一个窗口中,通过一次op run/op inject调用完成。复用 TTY 可以减少 1Password 授权提示,但无法让 macOS“App 数据”授权在新的op进程间保持有效。 - 不要预先发送姓名牌/
sag提醒。只有在 Peter 已在聊天中批准解锁,且 1Password 提示随后一直无人响应时,才发出声音提醒(sag)。
已知的 Molty 条目(跳过发现)
标题完全匹配;直接读取服务账户。无需枚举。
| 用途 | 条目标题 | 字段 |
|---|---|---|
| OpenAI(OpenClaw/i18n 任务) | AI API Key - OpenAI - OPENAI_API_KEY - OpenClaw | OPENAI_API_KEY |
| OpenAI(可用访问权限) | AI API Key - OpenAI - OPENAI_API_KEY - Serviceable Access | OPENAI_API_KEY |
| Anthropic(实时测试) | AI API Key - Anthropic - ANTHROPIC_API_KEY - OpenClaw Live Tests | ANTHROPIC_API_KEY |
| Anthropic(clawdbot) | AI API Key - Anthropic - ANTHROPIC_API_KEY - Clawdbot | ANTHROPIC_API_KEY |
| Gemini | AI API Key - Google Gemini - GEMINI_API_KEY - steipete-m5 | GEMINI_API_KEY |
| App Store Connect 发布 | API Key - App Store Connect - Personal - Release | private_key_p8、key_id、issuer_id |
| npm 发布自动化 | npm Registry - steipete - Release Automation | 参见 $npm |
| Cloudflare(OpenClaw 服务) | OpenClaw Services Cloudflare API Token | credential |
| Sparkle 签名 | Nameplate Sparkle EdDSA | private key |
| Octopool | Octopool Proxy Secret、Octopool Admin Token (OpenClaw account) | credential |
| Crabyard 部署 | Cloudflare OpenClaw Crabyard Deploy Token | credential |
| Hetzner(crabyard) | API Key - Hetzner Cloud - OpenClaw - crabyard-ssh-gateway | credential |
| Anthropic(Peekaboo) | Anthropic API Key - Peekaboo Live Test | credential |
| ClickClack 部署 | Cloudflare ClickClack deploy token、Cloudflare ClickClack R2 uploads | credential |
| Barnacle | GitHub Token Barnacle | credential |
| macOS Developer ID 签名(OpenClaw Foundation) | Release - macOS Developer ID p12 - OpenClaw Foundation | p12_base64、p12_password |
| macOS Developer ID 签名(个人) | Release - macOS Developer ID p12 - Peter Steinberger | 附加的 DeveloperID-p12 文件、certificate_password |
| 发布标签 SSH 签名密钥 | Release - Git tag SSH signing key - all repos | private_key、public_key(指纹 SHA256:WmI9lVtd…) |
| Homebrew tap 分发令牌 | Release - Homebrew tap dispatch token - openclaw/homebrew-tap | token |
| Apple 公证(Apple ID 备用方案) | Release - Apple ID app-specific password - notarization | apple_id、team_id、app_specific_password |
ClickClack/Barnacle 的 Molty 条目是 Agent 副本;规范条目位于共享的 OpenClaw 保管库中——轮换时需同时更新两处。
发布凭据:用一个标签找到全部凭据
每项签名/公证/tap 凭据都标记为 release-credential,并采用
Release - <what> - <scope> 命名(于 2026-08-09 统一)。不要靠猜标题来查找
——请列出它们:
op item list --vault Molty --tags release-credential
从 Release - 00 INDEX (read me first) 开始:其备注将每个 GitHub
Actions 密钥名称映射到确切的条目和字段,并记录修复步骤。
添加或轮换发布凭据时,请及时更新该索引。
发布凭据:GitHub 密钥是每个仓库独立设置的,不是组织级别的
已于 2026-08-09 验证:openclaw 组织有 21 个组织级密钥,没有一个是发布/签名密钥。MACOS_SIGNING_P12、MACOS_SIGNING_P12_PASSWORD、ASC_KEY_ID、ASC_ISSUER_ID、ASC_PRIVATE_KEY_P8 和 HOMEBREW_TAP_TOKEN 都是按仓库设置的。因此,发布在签名或 Homebrew 交接环节失败时,通常是该仓库缺少密钥或密钥名称不正确,而不是组织密钥出了问题。
已知陷阱:openclaw/gogcli 沿用了旧名称(MACOS_SIGNING_CERT_BASE64、MACOS_SIGNING_CERT_PASSWORD、MACOS_CODESIGN_IDENTITY),而共享的 openclaw/release-workflows 可复用工作流读取的是 MACOS_SIGNING_P12* / ASC_* 这些名称,因此签名器导入时悄然收到了空值。排查其他问题前,先将故障仓库的密钥名称与正常仓库(openclaw/wacrawl)进行比较。
所有这些密钥的值都存储在 Molty 中(见上表),因此可以通过非交互方式修复仓库:读取字段但不打印,然后用 printf '%s' "$value" | gh secret set <NAME> --repo <r> 将其传入。完全省略 --body:只有在没有该标志时,GitHub CLI 才会从标准输入读取内容。
通过下文“精确读取字段”中的 JSON + 精确标签方法读取这些字段,不要使用 --fields label=<f>。2026-08-09 在 Foundation p12 条目上实测:--fields label=p12_base64 返回了 65 个字符,而正确值是 4432 个字符。包含多个隐藏字段的条目会悄然解析出错误的字段,导致截断的密钥被写入 CI。
以下内容按设计不存储在 Molty 中(桌面操作流程,须先征得同意):OpenClaw Developer ID Release Keychain(OpenClaw-Core 保管库)、npm 交互式登录 + OTP(Private/Npmjs)、个人 SSH/签名密钥。Twilio 没有在任何地方存储 API 凭据,只有控制台登录信息(Private);创建 API 凭据需要登录控制台。
远程路由——仅限桌面操作流程
仅适用于路径 2(交互式/桌面)流程;路径 1 服务账户读取始终在本机执行,不进行路由。
- 首先识别当前主机(
hostname; id -un),然后加载与该环境匹配的远程 Mac 技能。个人和工作托管的 Mac 拓扑必须分开处理;切勿根据过时的 IP 地址或笼统的“Mac Studio”名称推断身份。 - 如果当前主机是 Peter 正在使用的实体工作站,且 1Password GUI 会话可用,则将整个已获同意的桌面操作流程保留在本机。在个人环境中,默认使用的工作站是
steipete-studio-sf;只有 Peter 表示正在使用steipete-mbp,或实时上下文确认它是当前的审批界面时,才使用该设备。在工作托管环境中,默认使用经验证的 Studio;只有 Peter 指明对应的 MacBook 是当前审批界面,或实时上下文确认这一点时,才使用该设备。 - 如果当前主机是 VM、无头主机或其他非当前工作站,请检查对应拓扑技能中记录的 Tailscale 命令,并仅从同一环境中选择一台当前可用的 Studio 或 MacBook。将整个交互式流程路由到该工作站自己的共享
op-worktmux 会话之前,先通过ssh -o ConnectTimeout=5 -o RequestTTY=no -o RemoteCommand=none <workstation-alias> 'hostname; id -un'验证配置的 SSH 别名。 - 同意规则不变:仍须先在聊天中询问(说明条目及原因)。路由只改变提示出现的位置,不会改变是否需要询问。
- 只有所需字段的值会通过 SSH 通道传输;两端均适用同样的“不打印、仅检查格式”规则。任务结束时关闭远程任务窗口。
- 如果所选工作站处于离线状态或 SSH 超时,只有在 Peter 或实时上下文确认另一台同环境的实体工作站是当前审批界面时,才可改用该设备。本机回退操作需要可用的 GUI 会话,并且必须明确验证当前同环境主机是 Peter 正在使用的工作站;否则,包括在任何 VM/无头主机上,都应报告已尝试的操作并停止。
工作流
- 检查操作系统和 shell。
- 在 tmux 中确认 CLI 可用:
op --version。 - 必须:使用共享的
op-work会话;在其中为整个密钥任务恰好打开一个任务窗口;任务完成后关闭该窗口。 - 已知/预期的 Molty 条目 → 直接通过服务账户读取(路径 1)。如果不确定令牌是否有效,请使用
OP_LOAD_DESKTOP_APP_SETTINGS=false OP_BIOMETRIC_UNLOCK_ENABLED=false OP_SERVICE_ACCOUNT_TOKEN="$OP_SERVICE_ACCOUNT_TOKEN" op whoami </dev/null >/dev/null 2>&1; echo op_rc:$?验证。 - 条目未知 → 查看上方的表格 → 在 Molty 中搜索限定于保险库的元数据(使用服务账户,安全)→ 只有之后才请求桌面端授权(路径 2)。
- 如果命令失败,通过
tmux send-keys在同一窗口中重试;不要仅为重试而打开第二个窗口或会话。 - 在启动个人交互式流程前,在任务窗口中取消设置
OP_SERVICE_ACCOUNT_TOKEN和MOLTY_OP_SERVICE_ACCOUNT_TOKEN。然后默认使用--account my.1password.com;除非明确要求,否则绝不使用my.1password.eu/Titan。
共享的 Op Tmux 会话 — 一个会话,每个任务一个窗口
此机器上的所有 op 操作——每项技能、每个 Agent、每个任务——都共享一个 tmux 服务器(clawdbot-op.sock)和一个会话(op-work)。处理密钥时,绝不要创建其他 socket 名称、tmux 服务器或会话:每个额外会话都会向 Peter 触发警报,并在其 shell 环境中保留密钥,最终变成僵尸会话。同级技能($npm、$release-mac-app、临时流程)都使用同一会话,仅窗口名称不同。
每个任务:在 op-work 中创建一个以任务命名的窗口;按窗口 ID 指定目标;任务结束时关闭该窗口。
SOCKET_DIR="${CLAWDBOT_TMUX_SOCKET_DIR:-${TMPDIR:-/tmp}/clawdbot-tmux-sockets}"
mkdir -p "$SOCKET_DIR"
SOCKET="$SOCKET_DIR/clawdbot-op.sock"
SESSION="op-work"
# 'shell' is a permanent keeper window: never send work to it, never kill it.
tmux -S "$SOCKET" has-session -t "$SESSION" 2>/dev/null ||
tmux -S "$SOCKET" new -d -s "$SESSION" -n shell
WIN="$(tmux -S "$SOCKET" new-window -d -t "$SESSION" -n "<task-slug>" -P -F '#{window_id}')"
tmux -S "$SOCKET" send-keys -t "$WIN" -- 'OP_LOAD_DESKTOP_APP_SETTINGS=false OP_BIOMETRIC_UNLOCK_ENABLED=false OP_SERVICE_ACCOUNT_TOKEN="$OP_SERVICE_ACCOUNT_TOKEN" op whoami </dev/null >/dev/null 2>&1; echo op_rc:$?' Enter
tmux -S "$SOCKET" capture-pane -p -J -t "$WIN" -S -200
服务账户的 op 有三项必需的防护措施:通过 OP_LOAD_DESKTOP_APP_SETTINGS=false 跳过加载桌面应用设置,通过 OP_BIOMETRIC_UNLOCK_ENABLED=false 强制关闭应用集成,并通过重定向或捕获输出,让标准输入/输出不经过窗格 TTY。仅覆盖生物识别设置不足以应对 op 2.35:其强制策略启动流程仍会读取 1Password 应用的群组容器设置。随后,macOS 会弹出“应用数据保护”对话框(“op 想要访问其他应用中的数据”),并阻塞在 open(),直至用户作出回应。只有经过授权的桌面流程(路径 2)才可以省略这些覆盖设置,并直接在 TTY 上运行 op。签名版 2.35 二进制文件识别 OP_LOAD_DESKTOP_APP_SETTINGS,但公开的环境变量文档中没有记录此变量;更新 op 后,请重新进行无需提示的 whoami 验证,并提供 TCC 日志证明。
macOS 应用数据对话框反复出现
在 macOS 26 和 op 2.35 上观察到:TCC 将 SystemPolicyAppData 批准记录为会话/PID 范围(auth_value=5,并包含批准该请求的 PID)。后续的 op PID 可能会再次提示,即使已经点击“允许”。每个可执行文件路径(~/bin/op、Homebrew Caskroom 中的版本、临时副本)也会被 TCC 视为独立客户端。使用稳定路径可以减少身份数量,但无法解决按 PID 限定的批准问题。
2026-07-16 的实时验证:仅设置 OP_BIOMETRIC_UNLOCK_ENABLED=false 时,使用服务令牌运行 op whoami 仍会弹出提示并卡住;再添加 OP_LOAD_DESKTOP_APP_SETTINGS=false 后则成功返回,且没有新增 SystemPolicyAppData 提示。
反复出现的对话框通常意味着有并发或重试中的 op 命令,或存在过期的 op daemon 进程。停止重试循环;检查 pgrep -x op,并检查共享 socket 的窗格,但不要输出进程参数。使用服务账户执行任务时,重新运行并添加所需的覆盖设置。执行桌面任务时,只使用一个已同意授权的任务窗口,并尽量减少新启动的 op 进程。不要不断点击“允许”并期待永久授权。
- 对该任务的每条命令、重试和后续操作,都复用
$WIN。如果引号、条目名称或命令有误,就在同一个窗口中发送更正后的命令,绝不要新开窗口或会话。 - 任务结束时(成功或失败):
tmux -S "$SOCKET" kill-window -t "$WIN"— 导出的密钥会随窗口的 shell 一起销毁。保留窗口会让op-work继续运行,以供下一个任务使用。 - 引导过程中不要运行
op signin。登录仅用于已同意授权的桌面流程(路径 2),并且必须在任务窗口内进行。 - 如果崩溃的 Agent 留下了过期任务窗口,且其窗格显示空闲提示符,可以将其关闭;绝不要关闭正在运行命令的窗口,也绝不要关闭
shell。
特定服务的工作流
- 将特定服务的身份验证详情保存在对应的技能中。
- 对于 npm registry/package 相关工作,使用
$npm;其中说明了 Molty 服务账户条目、非交互式身份验证包装器和包预留助手。 - 本技能仅负责通用的 1Password 规则:只能通过 tmux 使用
op、定向读取、使用带有每任务窗口的共享op-work会话、不进行宽泛枚举、不输出机密。
已知可用的机密写入模式
新机密默认通过服务账户写入 Molty 保管库(不会弹出提示)。只有在用户明确要求时才写入个人账户。在共享的 op-work 会话中使用你的任务窗口(见上文引导);将精确的机密任务写入临时脚本,再发送到该窗口;重试时不要新建第二个窗口或会话。
cat > /tmp/op-store-secret.sh <<'SCRIPT'
#!/usr/bin/env bash
set -euo pipefail
set +x
export OP_LOAD_DESKTOP_APP_SETTINGS=false
export OP_BIOMETRIC_UNLOCK_ENABLED=false
exec </dev/null 2>/dev/null
VAULT="Molty"
ITEM_TITLE="Service API Tokens"
FIELD_NAME="api_token"
EXPECTED_PREFIX=""
NOTES="Created via tmux-safe op workflow"
TOKEN="$(pbpaste)"
if [ -n "$EXPECTED_PREFIX" ]; then
case "$TOKEN" in "$EXPECTED_PREFIX"*) ;; *) echo "clipboard value does not match expected prefix" >&2; exit 2;; esac
fi
OP_SERVICE_ACCOUNT_TOKEN="$OP_SERVICE_ACCOUNT_TOKEN" op item create --vault "$VAULT" --category "API Credential" --title "$ITEM_TITLE" "$FIELD_NAME[password]=$TOKEN" "notesPlain=$NOTES" >/dev/null
OP_SERVICE_ACCOUNT_TOKEN="$OP_SERVICE_ACCOUNT_TOKEN" op item get "$ITEM_TITLE" --vault "$VAULT" --fields "label=$FIELD_NAME" >/dev/null
echo "stored and verified secret field without printing it"
SCRIPT
chmod 700 /tmp/op-store-secret.sh
tmux -S "$SOCKET" send-keys -t "$WIN" -- "bash /tmp/op-store-secret.sh; rm -f /tmp/op-store-secret.sh" C-m
在此 CLI 构建版本中,op 类别字符串区分大小写且供人阅读;应使用 "API Credential",而不是 api_credential。
精确读取字段
对于已知条目,在实际使用前验证字段的形态:长度、预期前缀、换行符数量,绝不要检查值。op --field NAME 和 --fields label=NAME 在条目中存在重复或旧版凭据字段时,可能返回错误的隐藏字段。如果形态不正确,请以 JSON 形式读取已知条目,并提取准确的标签。
cat > /tmp/op-read-field.sh <<'SCRIPT'
#!/usr/bin/env bash
set -euo pipefail
set +x
ITEM_TITLE="Known API Credential Item"
FIELD_LABEL="api_token"
VAULT="Molty"
value="$(
OP_LOAD_DESKTOP_APP_SETTINGS=false \
OP_BIOMETRIC_UNLOCK_ENABLED=false \
OP_SERVICE_ACCOUNT_TOKEN="$OP_SERVICE_ACCOUNT_TOKEN" \
op item get "$ITEM_TITLE" --vault "$VAULT" --format json </dev/null |
FIELD_LABEL="$FIELD_LABEL" node -e 'let s=""; process.stdin.on("data",d=>s+=d); process.stdin.on("end",()=>{const item=JSON.parse(s); const f=(item.fields||[]).find(x=>x.label===process.env.FIELD_LABEL); if(!f?.value) process.exit(2); process.stdout.write(f.value);})'
)"
echo "field_len:${#value}"
case "$value" in sk-*) echo "field_prefix:sk" ;; *) echo "field_prefix:other" ;; esac
echo "field_has_newline:$(printf %s "$value" | wc -l | tr -d ' ')"
SCRIPT
chmod 700 /tmp/op-read-field.sh
tmux -S "$SOCKET" send-keys -t "$WIN" -- "bash /tmp/op-read-field.sh; rm -f /tmp/op-read-field.sh" C-m
将 JSON 提取操作限定在已知条目和保管库内。不要枚举保管库/条目来寻找候选项。
明确的条目搜索
仅当用户明确要求搜索、提供了截图/列表,或精确标题猜测失败时,才使用此方法。限定在 Molty 保管库(服务账户)内,并且只查看元数据;输出候选标题/ID/类别/保管库名称,绝不输出字段或值。优先使用截图中的可见原文:保管库名称、条目标题和字段标签。
cat > /tmp/op-find-item.sh <<'SCRIPT'
#!/usr/bin/env bash
set -euo pipefail
set +x
VAULT="Molty"
QUERY="minimax"
OP_LOAD_DESKTOP_APP_SETTINGS=false \
OP_BIOMETRIC_UNLOCK_ENABLED=false \
OP_SERVICE_ACCOUNT_TOKEN="$OP_SERVICE_ACCOUNT_TOKEN" \
op item list --vault "$VAULT" --format json </dev/null |
QUERY="$QUERY" VAULT="$VAULT" node -e '
let s=""; process.stdin.on("data",d=>s+=d); process.stdin.on("end",()=>{
const q=process.env.QUERY.toLowerCase();
const vault=process.env.VAULT;
const items=JSON.parse(s).filter(x => [
x.title, x.id, x.category, ...(x.tags || [])
].filter(Boolean).join("\n").toLowerCase().includes(q));
for (const item of items.slice(0, 10)) {
console.log(`title:${item.title} id:${item.id} category:${item.category || ""} vault:${vault}`);
}
console.log(`matches:${items.length}`);
})'
SCRIPT
chmod 700 /tmp/op-find-item.sh
tmux -S "$SOCKET" send-keys -t "$WIN" -- "bash /tmp/op-find-item.sh; rm -f /tmp/op-find-item.sh" C-m
选择候选项后,切回精确条目/字段 JSON 提取,并且只验证形态。如果没有匹配的 Molty 条目 → 请求桌面授权(路径 2),绝不要悄悄读取个人保管库。
脱敏调试
仅用于交互式流程调试(已同意授权的桌面路径)。整个流程都必须在同一个任务窗口内进行。检查状态和输出长度,绝不检查机密值。
cat > /tmp/op-debug.sh <<'SCRIPT'
#!/usr/bin/env bash
set -euo pipefail
set +x
SIGNIN_OUTPUT="$(op signin --account my.1password.com 2>&1 || true)"
echo "signin output bytes: ${#SIGNIN_OUTPUT}"
op account list 2>&1 | sed -E "s/(xox[baprs]-)[A-Za-z0-9-]+/\\1REDACTED/g; s/(xapp-)[A-Za-z0-9-]+/\\1REDACTED/g"
SCRIPT
chmod 700 /tmp/op-debug.sh
tmux -S "$SOCKET" send-keys -t "$WIN" -- "bash /tmp/op-debug.sh; rm -f /tmp/op-debug.sh" C-m
安全准则
- 切勿将密钥粘贴到日志、聊天或代码中。
- Path-1
op命令必须始终设置OP_LOAD_DESKTOP_APP_SETTINGS=false和OP_BIOMETRIC_UNLOCK_ENABLED=false,明确传入服务令牌,并确保标准输入和包含密钥的标准输出不连接到窗格 TTY。 - 每次运行
op都可能启动后台op daemon(在 2.35 中,缓存标志无法阻止此情况)。过时的守护进程可能会再次触发对话框。仅当没有op任务在运行时,pkill -f 'op daemon'才是安全的;切勿大范围终止正在运行的op命令。 - App Data 的 Allow/Don't Allow 选择可能仅对特定 PID 生效,并在下一个
op进程中再次出现。请停止源命令并修正其调用方式,而不是批准反复弹出的提示。 - 切勿在 rc 文件中不加防护地运行
eval "$(op completion zsh)";它会在每次启动 shell 时运行op,是已知的对话框骚扰来源。 - 优先使用
op run/op inject,而不是将密钥写入磁盘。 - 仅在聊天中明确征得同意后,才使用桌面应用路径;随后由 1Password 解锁提示完成实际授权——提示出现时无需再通过聊天往返确认。
- 如需在不集成应用的情况下登录,请使用
op account add。 - 如果在已征得同意的交互流程中,命令返回“account is not signed in”,请在 tmux 中重新运行
op signin,并由 Peter 在应用中授权。 - 仅当已征得同意的解锁提示尚未得到响应时,才使用
sag;切勿提前触发。 - 切勿在 tmux 外运行
op;如果无法使用 tmux,请停止并询问。