关于 1password
用于遵循 1Password CLI 设置与安全操作流程的技能。它强调读取机密前先验证访问权限、在 tmux 中运行命令,并避免暴露机密值。
主要功能
- 01遵循官方设置指南
- 02验证 CLI 与账户访问
- 03在 tmux 中运行 `op` 命令
- 04显式选择账户
- 05脱敏处理机密
适用场景
- 01设置 1Password CLI 访问
- 02读取机密前验证登录状态
- 03安全存储或编辑凭据
- 04在不泄露机密的情况下排查 CLI 状态
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ steipete/ agent-scripts --skill 1password安装后在 Claude Code 中输入/1password确认已加载。
附带文件references/cli-examples.mdreferences/get-started.md
详细介绍
1Password CLI
请遵循官方 CLI 入门步骤。不要猜测安装命令。
参考资料
- 官方文档:https://developer.1password.com/docs/cli/get-started/
references/get-started.md(安装 + 应用集成 + 登录流程)references/cli-examples.md(真实的op示例,包括安全的条目创建/编辑模式)
工作流
- 检查操作系统和 shell。
- 在 tmux 内确认 CLI 已安装:
op --version。 - 确认已启用桌面应用集成(按入门指南操作),且应用已解锁。
- 必须:为所有
op命令新建 tmux 会话(不得在 tmux 外直接调用op)。 - 在 tmux 内登录/授权:
op signin(预期会出现应用提示)。 - 在 tmux 内验证访问权限:
op whoami(读取任何机密前必须成功)。 - 如果有多个账户:使用
--account或OP_ACCOUNT。
Peter 账户默认设置
- Peter 个人/工作机密的默认账户是
my.1password.com(“Peter Steinberger's Clan”)。 - 除非 Peter 明确要求,否则不要擅自使用
my.1password.eu/ Titan。 - 存储或读取 Peter 的机密时,每条
op命令都传入--account my.1password.com。不要依赖当前选定的账户。 op account list仅显示元数据,但仍必须在 tmux 内运行。账户路由不明确时,用它确认账户名称。op signin --account my.1password.com可能以状态码 0 返回,但没有有用输出,也可能无法让后续 shell 完成登录。建议在同一个 tmux shell 中完成登录、创建/编辑/获取和验证。
必需的 tmux 会话(T-Max)
shell 工具每条命令都会使用新的 TTY。为避免重复提示和失败,始终在专用 tmux 会话中运行 op,并使用新的 socket/会话名称。
示例(socket 约定请参阅 tmux 技能,不要重复使用旧会话名称):
SOCKET_DIR="${CLAWDBOT_TMUX_SOCKET_DIR:-${TMPDIR:-/tmp}/clawdbot-tmux-sockets}"
mkdir -p "$SOCKET_DIR"
SOCKET="$SOCKET_DIR/clawdbot-op.sock"
SESSION="op-auth-$(date +%Y%m%d-%H%M%S)"
tmux -S "$SOCKET" new -d -s "$SESSION" -n shell
tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- "op signin --account my.1password.com" Enter
tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- "op whoami" Enter
tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- "op vault list" Enter
tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200
tmux -S "$SOCKET" kill-session -t "$SESSION"
已验证可用的机密写入模式
使用新的 tmux 会话,从剪贴板读取机密但不打印出来,可选择验证预期的令牌前缀,并明确写入 Peter 的账户。此 CLI 版本中的 op 类别字符串区分大小写且需使用人类可读形式;请使用 "API Credential",而不是 api_credential。
tmux new-session -d -s op-store-secret 'bash -lc '\''set -euo pipefail
set +x
ACCOUNT="my.1password.com"
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 item create --account "$ACCOUNT" --category "API Credential" --title "$ITEM_TITLE" "$FIELD_NAME[password]=$TOKEN" "notesPlain=$NOTES" >/dev/null
op item get "$ITEM_TITLE" --account "$ACCOUNT" --fields "label=$FIELD_NAME" >/dev/null
echo "stored and verified secret field without printing it"
sleep 30
'\'''
在同一条目中添加第二个机密:
tmux new-session -d -s op-edit-secret 'bash -lc '\''set -euo pipefail
set +x
ACCOUNT="my.1password.com"
ITEM_TITLE="Service API Tokens"
FIELD_NAME="app_token"
EXPECTED_PREFIX=""
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 item edit "$ITEM_TITLE" --account "$ACCOUNT" "$FIELD_NAME[password]=$TOKEN" >/dev/null
op item get "$ITEM_TITLE" --account "$ACCOUNT" --fields "label=$FIELD_NAME" >/dev/null
echo "stored and verified secret field without printing it"
sleep 30
'\'''
脱敏调试
整个管道都应在 tmux 内运行。检查状态和输出长度,绝不查看机密值。
tmux new-session -d -s op-debug 'bash -lc '\''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"
sleep 30
'\'''
安全守则
- 绝不要将机密粘贴到日志、聊天或代码中。
- 优先使用
op run/op inject,而不是将机密写入磁盘。 - 如果需要在未启用应用集成的情况下登录,请使用
op account add。 - 如果命令返回“account is not signed in”,请在 tmux 内重新运行
op signin,并在应用中授权。 - 不要在 tmux 外运行
op;如果无法使用 tmux,请停止并询问。
评论
支持 Markdown