name: op-cli description: 用于安全读取1Password CLI模式下的秘密信息、发现保险库/项目,以及将凭据管道传输到其他工具。适用于从1Password读取、轮换秘密或将凭据传输到wrangler/kubectl等工具的场景。触发条件包括op CLI、1Password、秘密轮换或凭据管道传输任务。
1Password CLI (op) — 安全处理指南
核心规则:绝不打印秘密信息
切勿使用会打印秘密值的op命令。始终直接管道传输到消费工具,或使用wc -c/脱敏验证而不暴露内容。
# 错误 — 会将秘密打印到stdout(请勿运行)
# op item get ITEM_ID --vault VAULT --fields label=PASSWORD --reveal
# 正确 — 直接管道传输到消费工具
op item get ITEM_ID --vault VAULT --fields label=PASSWORD --reveal | \
wrangler secret put SECRET_NAME --env ENV
# 正确 — 验证值是否存在而不暴露内容
op item get ITEM_ID --vault VAULT --fields label=PASSWORD --reveal 2>/dev/null | wc -c
包含斜杠的项目标题
许多1Password项目使用路径式标题(例如pool-party/testnet-pool-party-public/credentials)。op:// URI格式无法处理这种情况,因为它使用/作为分隔符。
# 错误 — 斜杠分段过多
op read "op://pool-party-testnet/pool-party/testnet-pool-party-public/credentials/PASSWORD"
# 错误:斜杠过多:秘密引用应匹配 op://<保险库>/<项目>[/<部分>]/<字段>
# 可行 — 改用项目ID(避免打印值)
op item get ITEM_ID --vault VAULT --fields label=FIELD --reveal 2>/dev/null | wc -c
发现工作流程
当您不知道项目ID时:
# 1. 列出保险库中的项目以查找标题和ID
op item list --vault VAULT_NAME
# 2. 使用ID(第一列)进行所有后续读取
op item get ITEM_ID --vault VAULT_NAME --fields label=FIELD_NAME --reveal 2>/dev/null | wc -c
从单个项目读取多个字段
# 验证存在哪些字段(安全 — 仅显示标签而非值)
op item get ITEM_ID --vault VAULT_NAME --format json 2>/dev/null | \
python3 -c "import json,sys; [print(f['label']) for s in json.load(sys.stdin).get('fields',[]) for f in [s] if f.get('label')]"
# 将每个字段管道传输到其目标
op item get ITEM_ID --vault VAULT --fields label=USERNAME --reveal | consumer_cmd ...
op item get ITEM_ID --vault VAULT --fields label=PASSWORD --reveal | consumer_cmd ...
常见管道传输模式
Cloudflare Workers (wrangler)
op item get ITEM_ID --vault VAULT --fields label=PASSWORD --reveal | \
npx wrangler secret put POOL_PARTY_PUBLIC_PASSWORD --env testnet
环境变量(子shell)
SECRET="$(op item get ITEM_ID --vault VAULT --fields label=TOKEN --reveal 2>/dev/null)"
# 在同一shell的后续命令中使用$SECRET — 它不会出现在输出中
kubectl
op item get ITEM_ID --vault VAULT --fields label=PASSWORD --reveal | \
kubectl create secret generic my-secret --from-file=password=/dev/stdin
无暴露验证
# 检查值是否非空(字符计数)
op item get ITEM_ID --vault VAULT --fields label=PASSWORD --reveal 2>/dev/null | wc -c
# 比较两个源是否匹配(仅退出代码)
if cmp -s <(op item get ID1 --vault V --fields label=F --reveal 2>/dev/null) \
<(op item get ID2 --vault V --fields label=F --reveal 2>/dev/null); then
echo "匹配"
else
echo "不同"
fi
故障排除
| 错误 | 原因 | 解决方案 |
|---|---|---|
斜杠过多 |
项目标题包含斜杠,op://无法解析 |
使用op item get配合项目ID |
找不到项目 |
保险库错误或标题不匹配 | 运行op item list --vault VAULT进行发现 |
| 空输出 | 缺少--reveal标志 |
添加--reveal并管道传输到消费工具(或` |
未登录 |
会话已过期 | 运行eval "$(op signin)"(避免打印会话令牌) |