给当前会话提供私密凭据¶
使用私密凭据入口提供数据库密码、仓库 Token 或 SSH 私钥。凭据供当前会话的普通 shell 命令使用,不会作为聊天消息提交给模型。
obscli¶
聊天中输入 /credentials,菜单只提供 Write 和 Delete。当前会话自动绑定一个 Agent,不用复制 UUID。选择 Write 后,在同一个私密表单填写 Key 和 Value,Tab 切换字段,Enter 提交;默认文本输入,Value 始终隐藏。已有名称也使用 Write,提交前确认覆盖,不另设替换操作。
等待服务响应时,可按 Ctrl+C 或连续两次 Esc 取消等待;期间输入和粘贴的内容会被丢弃,不进入聊天草稿、日志或缓存。取消已发送的写请求不代表撤销服务端操作,请核实结果后再重试。
文件同样使用这个表单:Ctrl+T 切换为 file(切换类型会清空 Value),在 Value 输入 @ 路径。支持绝对路径、~/ 和相对路径,方向键选择、Tab 补全、Shift+Tab 返回 Key;只匹配当前目录前缀,包含隐藏文件,不递归搜索。选中文件后显示路径和大小,确认才上传;obscli 不支持粘贴文本作为文件。
界面不显示凭据列表或刷新。查询时在普通聊天中说“列出当前会话的凭据名称和类型”,Agent 不会返回值。Delete 输入准确名称后确认;失败保留输入供手动重试,也可选择 Edit key and value 重新填写,取消、关闭或成功后清空。交互 TUI 的内置菜单、提示和错误统一使用英文,用户输入与模型回复保持原文。
以下独立子命令保留用于自动化和兼容。名称和 ID 是示例,秘密值不写在命令行中。
# 提示输入变量名和秘密值;秘密值隐藏输入。
obscli session credential put --workspace-uuid WS --session-uuid SESSION --agent-uuid AGENT
# 提前指定变量名,随后隐藏输入 Token。
obscli session credential put --workspace-uuid WS --session-uuid SESSION --agent-uuid AGENT --name GITRG_TOKEN
# 文件在 Agent 上以私有权限保存,变量值为 Agent 本地文件路径。
obscli session credential put --workspace-uuid WS --session-uuid SESSION --agent-uuid AGENT --name SSH_KEY_FILE --file ./id_ed25519
# 只列举名称和类型,不能取回值。
obscli session credential list --workspace-uuid WS --session-uuid SESSION --agent-uuid AGENT
obscli session credential delete --workspace-uuid WS --session-uuid SESSION --agent-uuid AGENT --name GITRG_TOKEN
自动化输入可使用 --stdin 从安全输入源读取文本;字节原样保留,包括末尾换行。不要用含秘密字面量的命令或参数提供值,否则可能进入本机 shell 历史。
一次性任务导入¶
obscli run --import-credential /secure/credentials.json 在发送任务前导入凭据。JSON 示例:
{
"kv": {"DB_PASSWORD": "your-password", "GITRG_TOKEN": "your-token"},
"files": {"SSH_KEY_FILE": "./id_ed25519"}
}
obscli run --agent-uuid "$AGENT" \
--import-credential /secure/credentials.json \
--prompt '使用 DB_PASSWORD 和 SSH_KEY_FILE 执行任务'
仅支持 JSON,kv 与 files 均可省略一个。相对文件路径以 JSON 所在目录为基准;不展开 $VARIABLE、~ 或执行 shell。名称不能重复(包括跨 kv/files),值必须是非空字符串,文件必须是可读普通文件。JSON 文件最大 8 MiB,最多 64 个名称,单项最大 256 KiB,解码后的凭据累计最大 8 MiB。
客户端先检查全部输入,再创建空会话、上传并等待每项确认;全部确认后才发送 prompt。任一上传失败或未确认都不启动任务,不自动重试,并尝试关闭会话清理已接收的凭据;关闭失败会明确报告。原 JSON 和本地文件由用户管理,客户端不会删除,建议以 0600 权限保存。命令行只包含导入文件路径,正文不进入聊天、模型或应用日志。
上传不会自动触发任务。接收成功后,在普通聊天中说明用途并要求继续。例如:“使用 DB_PASSWORD 连接生产 PostgreSQL,用户名 readonly”。LLM 下一次正常调用会得到变量名称及类型,并沿用现有 shell 语法:
PGPASSWORD="$DB_PASSWORD" psql -h db.example.com -U readonly
git-rg --auth env -F 'timeout' github:OWNER/REPO
ssh -i "$SSH_KEY_FILE" deploy@host
有效期与权限¶
- 同名提交替换旧值;后续命令使用新值,已运行命令可能仍持有旧值。
- 当前会话中有发消息权限的用户均可管理凭据。当前按单会话单 Agent 自动绑定,其他会话不继承。
- 文本只存在 Agent 内存。文件目录权限 0700、文件权限 0600,归 Agent 运行账号所有;第一版文件存储要求 Unix 权限语义,Windows Agent 拒绝文件凭据,Windows 客户端仍可上传给 Unix Agent。
- 会话关闭或 Agent 重启后凭据失效。异常退出遗留文件在下次启动清理,不恢复。
- Agent 与 Beak 连接断开时同样撤销凭据;重连后需重新提交,避免漏掉断线期间的关闭事件。重新打开会话不会恢复旧值。
- 每会话最多 64 个名称;单项最多 256 KiB。为限制保留旧值脱敏的内存,每会话累计提交最多 8 MiB、2048 个不同脱敏片段(包括文件行),删除不会重置计数。
- Agent 离线时立即失败,不排队。确认超时表示结果未确认;查询清单或同名重新提交,不要把超时当成确定未保存。
- 第一版携带凭据的命令返回时清理同一进程组内的后台子进程,不用于启动长期后台服务。
普通命令自动获得会话变量及文件路径,现有 shell 审批策略继续生效。已知秘密原文在工具输出进入历史、日志、trace 和模型前脱敏;这不能阻止任意命令主动编码、复制、写盘或外传。文件删除不保证抵御磁盘取证、快照或备份恢复。同系统账号及管理员不属于文件权限的隔离对象。
凭据只注入所属会话启动的命令子进程,不修改 Agent 全局环境,其他会话不会自动继承。但同一 Agent 的会话通常共用系统账号;具备不受限 shell 权限的其他会话可能主动读取该账号拥有的文件,进程环境的读取还受操作系统权限控制。会话分发隔离不能替代独立账号、容器或操作系统沙箱。
Web 入口¶
Web 入口需要配套前端版本并完成部署验收;仅升级 Beak 和 Agent 不会自动提供此入口。
在当前会话点击“凭据”,弹窗只提供写入、替换、删除,无列表、刷新和 Agent 选择器。尚无 session 的新任务会先创建空会话,不发送模型消息,后续消息复用该会话。
文本隐藏输入,文件可本地上传或粘贴多行原文作为文件;保留空白和换行。同名写入提示确认替换,删除输入准确名称后确认。失败输入仅保留在当前表单内存供手动重试;关闭、切换会话或成功后清空。前端不要求用户写结构化数据。
Beak 服务端只做短暂内存转发。部署方也须避免反向代理、APM 请求正文采集或 Redis 命令调试记录这些请求;生产连接使用 HTTPS/WSS。