跳到主要内容

Policy CLI 使用指南

使用 agent-sec-cliasc-daemon 创建、查询、更新和删除 Policy、Scope、Binding。 Policy 描述保护策略,Scope 选择目标,Binding 关联指定版本的 Policy 和 Scope。

这些命令由 V2 CLI 提供,已发布的 Python CLI 尚未包含。当前策略记录在 daemon 重启后丢失;Binding 请求被受理不代表保护已经生效。

连接 daemon

使用部署管理员提供的绝对 socket 路径。以下示例假设 SOCKET 已设置为该路径, 且当前用户已获得策略管理权限。未授权用户会收到 permission_denied;CLI 不负责 启动 daemon 或授予权限。

agent-sec-cli --socket "$SOCKET" policy list

关联本地日志

V2 使用原生 OpenTelemetry 关联本地请求日志。--trace-context 保留原有扁平 Agent metadata 输入,应放在命令名及其它选项的非选项值之前。可选的 --otel-context 接收 version 1 JSON carrier,包含 traceparenttracestatebaggage 可选字段。 两者同时提供时,显式扁平 Agent 字段优先。

RUST_LOG=info agent-sec-cli --trace-context '{"session_id":"session-123","agent_name":"openclaw"}' \
--otel-context '{"version":1,"traceparent":"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"}' \
--socket "$SOCKET" policy list

RUST_LOG=info 开启 stderr 上的有界 JSON 关联诊断;daemon 需要单独设置其进程环境。 默认 warn 不产生这些记录。背压下允许丢诊断;命令结果、错误及退出码保持原有语义。 当前不提供公开 OTLP exporter 或导出/采样/batch 配置;OTEL_* 设置不能开启导出或 改变固定的本地采样策略。--otel-context 是入站上下文,不是导出目标。 CLI 要求支持 carrier 的新 daemon,应先升级 daemon。

管理 Policy

准备 JSON 模板文件,例如 policy.json

{"kind":"prevent_file_deletion","files":["/workspace/important/**"]}

当前支持的模板保护文件或目录项免于删除(unlink/rmdir),不覆盖重命名、移动或 文件内容修改。

agent-sec-cli --socket "$SOCKET" policy create --name "protect files" --file policy.json
agent-sec-cli --socket "$SOCKET" policy get --policy-id "$POLICY_ID" --revision 1
agent-sec-cli --socket "$SOCKET" policy list --limit 100 --offset 0
agent-sec-cli --socket "$SOCKET" policy update --policy-id "$POLICY_ID" --name "protect files v2" --file policy-v2.json
agent-sec-cli --socket "$SOCKET" policy delete --policy-id "$POLICY_ID" --revision 2

ID 和 revision 使用成功命令返回的值。这些是命令参考示例,并非顺序执行脚本; 创建 Binding 时应保留其引用的 Policy 和 Scope。 create 和 update 均要求名称及完整模板。update 替换已有 Policy,不是部分更新, 也不会创建不存在的 Policy。文件相对路径按 CLI 工作目录解析。 get/delete 要求精确的当前 revision,旧 revision 返回 not_found

管理 Scope

--pid(正进程 ID)和 --cgroup-id(正 cgroup ID)必须且只能指定一个。

agent-sec-cli --socket "$SOCKET" scope create --pid 4242
agent-sec-cli --socket "$SOCKET" scope get --scope-id "$SCOPE_ID" --revision 1
agent-sec-cli --socket "$SOCKET" scope list --limit 100 --offset 0
agent-sec-cli --socket "$SOCKET" scope update --scope-id "$SCOPE_ID" --cgroup-id 99
agent-sec-cli --socket "$SOCKET" scope delete --scope-id "$SCOPE_ID" --revision 2

update 替换完整 selector;get/delete 要求精确的当前 revision。 进程 ID 和 revision 为正 32 位无符号整数,cgroup ID 为正 64 位无符号整数。

管理 Binding

Binding 引用已经存在的 Policy revision 和 Scope revision。所有 create 命令均由 服务端生成 ID。Binding get/delete 只需要 Binding ID,无需 revision。

agent-sec-cli --socket "$SOCKET" binding create --policy-id "$POLICY_ID" --policy-revision 1 --scope-id "$SCOPE_ID" --scope-revision 1
agent-sec-cli --socket "$SOCKET" binding get --binding-id "$BINDING_ID"
agent-sec-cli --socket "$SOCKET" binding list --limit 100 --offset 0
agent-sec-cli --socket "$SOCKET" binding update --binding-id "$BINDING_ID" --policy-id "$POLICY_ID" --policy-revision 2 --scope-id "$SCOPE_ID" --scope-revision 2
agent-sec-cli --socket "$SOCKET" binding delete --binding-id "$BINDING_ID"

create/update 通常返回 PENDING_APPLY,delete 请求 PENDING_DELETE。 重复或没有实际变化的操作可能保留原有状态和 revision。这些状态表示已记录变更请求, 不代表保护生效或删除完成。当前尚不支持自动应用策略或 --wait

公共参数

参数用途
--socket PATH必填的 daemon 绝对 socket 路径,可放在子命令前后
--timeout-ms N正 32 位无符号整数,默认 5000;连接、发送、接收共用一次时间预算
--limit N列表每页条数,1..=1000,默认 100
--offset N列表偏移量,32 位无符号整数,默认 0
--help顶层、命令组和具体操作的帮助,不连接 daemon
--version顶层版本信息,不连接 daemon

支持 --key value--key=value。带空格的名称、路径需使用引号; 以 -- 开头的值使用 --key=--value。重复参数会被拒绝。 列表命令每次返回一页 {items,total}total 是分页前总数;后续页需显式请求。

输出与错误

结果输出退出码
成功stdout 输出格式化的结果 JSON,stderr 为空0
daemon 拒绝stderr 输出 JSON {requestId,error:{code,message}},stdout 为空1
文件、连接、响应或输出失败stderr 输出错误说明1
命令行参数错误stderr 输出用法错误2

模板文件最大为 4 MiB,必须是有效 JSON,不能包含未知或重复字段。 完整编码后的请求和响应各自另有 4 MiB 上限,包含行结束符。文件大小检查通过不保证 组装后的请求符合上限;请求超限时不会发送。

超时预算覆盖 daemon 通信,包括等待 daemon 处理请求;不包含文件读取、请求编码、 响应解码和结果输出。CLI 不自动重试。发送后超时、响应缺失或非法,不代表请求没有 执行;再次提交变更前应先查询当前状态。