11. 用户自定义层与 CLI 工具(11-user-layer)

← 返回主报告:Kimi Agent(云端沙箱)技术报告GitHub 原文

合规与风险声明:本报告为安全研究与互操作学习目的的逆向分析,全程只读采集,未对目标系统做任何修改;文中所有密钥、token、账号级标识(chat_id / project_id / tenant_id 等)均已脱敏;沙箱内发现的默认弱口令(VNC/SSH)属平台侧配置,仅作安全发现披露,请勿用于访问任何不属于自己的系统。docx/pdf/xlsx/kimi-slides 等引擎二进制为 Moonshot 专有许可(禁再分发/逆向),本文仅作行为级描述。报告基于单次分析窗口(约 50 分钟生命周期),软件版本与技能库存随镜像更新可能变化。

采集时间:2026-08-18(UTC+8 ~17:00–17:31)。采集方式:SSH(kimi 用户,只读)。 本节回答:沙箱里”用户自己的东西”放在哪、怎么进来、和系统预置内容的分界在哪。

0. 一张图看懂分界

沙箱把内容分成三层,来源和挂载方式完全不同:

路径来源挂载/落盘方式
系统预置层/app/.agents/skills/(269 个技能)、/app/.agents/plugins/镜像内置(时间戳 Aug 11 15:07,构建时烤入)普通目录;plugins 是指向 portal FUSE 的符号链接
用户层(云同步)/app/.user/skills//app/.user/auth/用户账号的云端数据,按账号下发*符号链接 → /mnt/portal-overlay/.user/,portal FUSE 实时挂载**
用户层(本地状态)/home/kimi/.cli-tools/.kimi-slides/.dws/.lark-cli/.config/镜像内置 + 运行时生成容器本地 overlay2,会话内持久

关键证据(mount 输出摘录):

portal on /mnt/portal-overlay type fuse.portal (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other,max_read=1048576)
drive9 on /mnt/agents type fuse.drive9 (...)
overlay2 on / type overlay (lowerdir=/run/blk-cube/vdc/60:...:/run/blk-cube/vdc/0, upperdir=/run/blk-cube/vda/disk/2d9b.../upper, ...)
  • 根文件系统是 61 层 overlay2(blk-cube 块设备分层),镜像内容烤在 lower 层。
  • /mnt/portal-overlayportal 服务的 FUSE 挂载,沙箱启动时(08:43)建立符号链接:
    • /app/.user/auth -> /mnt/portal-overlay/.user/auth
    • /app/.user/skills -> /mnt/portal-overlay/.user/skills
    • /app/.agents/plugins -> /mnt/portal-overlay/.agents/plugins(注意:系统插件也走 portal 下发,说明插件可热更新)
    • /app/.vault -> /mnt/portal-overlay/.vault/app/.websites-templates -> /mnt/portal-overlay/.websites-templates
  • portal 挂载点的目录时间戳在采集期间持续变化(09:15→09:19→09:21),证明它是活的后端存储视图,不是一次性拷贝。

/mnt/portal-overlay/ 顶层内容:

-r--r--r-- .agent-gw.json        # 只读,见 §4
dr-xr-xr-x .agents/plugins       # 系统插件(audio_generation, github, lark, tianyancha... 共 17+ 个)
drwxr-xr-x .user/{auth,skills}   # 用户层
drwxr-xr-x .vault                # 空(保险库,未见内容)
drwxr-xr-x .websites-templates   # 网站模板(0-origin, 1-cyber-rain-frontend ... 12 个)

1. /app/.user/skills/ —— 6 个用户自建技能

全部是目录(非符号链接),每个一个 SKILL.md,部分带 references/scripts/examples/。frontmatter 均为标准 name + 长 description(含触发关键词、正反例边界),格式与系统技能完全一致——用户技能和系统技能对 agent 是同构的,区别只在存放层。

技能用途(description 摘要)附带文件
engineering-ppt-converter工程设计报告/论文 → 深蓝中式工程风 PPTX;触发词含”汇报/答辩/论文转PPT”references/structure_contract.md, style_contract.md
lecture-notes-digitizer拍照讲义(高数/电路考研)数字化:转写分章 Markdown+LaTeX、按页码重命名图片、合并、导出 CJK PDFscripts/apply_page_mapping.py, fix_latex_backslashes.py
openclaw-selfhost-ops自建 OpenClaw 实例运维 runbook(重点,见 §1.1)references/ 3 个 md(共 293 行)
stem-exercise-solver考研数学/电路习题拍照解题,输出考试风格逐步详解scripts/extract_docx_images.py + examples/ 4 个
translation-review-coach考研英语二翻译批改:逐句对照点评、15 分制估分、共性错误归类references/worked-example.md
vocab-table-filler词汇书照片(新东方考研词汇 DAY 表)补全词性/中文释义列,输出 Markdown 表仅 SKILL.md

特征:description 里大量”observed 2026-08-11 across four sessions””user-verified”字样——这些技能明显是从真实用户会话中沉淀出来的经验型技能(用户自己或借助 skill-creator 创建),内容围绕该用户的固定场景(考研辅导 + 自托管 OpenClaw 运维)。

1.1 openclaw-selfhost-ops 重点解剖

这是 6 个技能里与 Hermes 关系最直接的一个,本质上是一份”如何运维用户自己的 Kimi Claw/OpenClaw 实例”的实战手册,全部标注了验证日期(2026-08-11,四个会话)。

核心内容:

  • 托管 vs 自建的分流决策表:kimi.com 一键 bot / 桌面 App → 托管(不要手动升级,等官方推送);自己 VPS 上有 SSH + openclaw CLI → 自建(用户拥有升级决定权,警告一次后给命令,不要反复念官方”不要手动升级”——记录了用户三次反驳”你怎么这么烦,忽略那个skill”)。
  • 手动升级流程(已验证 2026.4.14 → 2026.7.1-2):
  1. 备份 cp -r ~/.openclaw ~/.openclaw.bak.$(date +%F)
  2. 环境检查 node -v(需 Node 24.15+ 或 22.22.3+)、which openclaw(nvm/volta 与 /usr/lib 重复安装是经典坑);
  3. openclaw update --channel stablenpm install -g openclaw@latest
  4. openclaw doctor --fix(会对”Update gateway service config”答 Yes,重写 systemd user unit)→ openclaw gateway restartgateway status
  5. 按功能验证而非按状态:真实发消息过每个频道(微信/飞书/钉钉)、/feishu doctor、确认 cron 仍触发。
  • Config warnings 分诊(升级后第一困惑):频道能聊就不要重装插件,只清理 ~/.openclaw/openclaw.jsonplugins.entries/plugins.allow 的孤儿条目。
  • claw-install.sh 架构(references/install-architecture.md,103 行):
    • 入口脚本本身不装东西,并行跑两个子脚本:kimiim/install.sh(装 kimiim-cli~/.local/bin/ + 3 个技能 kimiim/worker-safety/time-awareness 到 ~/.openclaw/workspace/skills/)和主 install.sh(装 kimi-claw 桥接插件)。
    • 主插件流程:下载 tgz → 解压到 ~/.openclaw/extensions/kimi-clawnpm install --omit=devopenclaw plugins install 注册 → 写 WSS 桥接配置进 ~/.openclaw/openclaw.jsongateway restart
    • 桥接机制:插件作为 WSS 客户端连 wss://www.kimi.com/api-claw/bots/agent-ws,用 --bot-token(格式 km_b_prod_...)认证;模型(K2.6/K3,model: kimi-coding/k3,上下文 1.0m)和额度来自 Kimi 会员,不需要本地 API key
    • 可选参数:--with-search-plugin(装 kimi-search)、--gateway-url/--gateway-token/--agent-id(私有网关)、--shell-enabled--log-enabled、prompt 超时默认 1800000ms。
    • 频道连接器(weixin/feishu/qqbot)装在 OpenClaw 实例本地,不是云端——用户亲自下载插件包验证后纠正过这个错误说法。
  • 无公网 IP 的域名暴露(references/networking-tunnel.md,92 行):推荐 Cloudflare Tunnel + 阿里云 DNS CNAME(不需要迁 NS):Zero Trust → Networks → Tunnels 建隧道 → 服务器装 cloudflared → 加 Public Hostname 指 localhost:<openclaw-port>(端口用 ss -tlnp 找)→ 阿里云解析加 CNAME 到 <tunnel-id>.cfargotunnel.com。备选:EIP/SLB/NAT-DNAT/FRP/IPv6/Tailscale,附选型表。
  • 5 条坑全部带”observed”标注,例如”global install verify ERROR ≠ 升级失败,先 which openclaw“。

2. /app/.user/auth/ —— 第三方凭证的注入点

结构:

/app/.user/auth/
├── dws/
│   ├── .dws/                      # 空目录
│   └── .local/share/dws-cli/      # 空目录
└── lark/
    ├── .lark-cli/                 # 空目录
    └── .local/share/lark-cli/     # 空目录

当前全部为空(find 仅返回目录项,无任何文件)。结合 §3 的运行时状态可以确认设计意图:portal 把用户账号体系里已授权的第三方凭证(钉钉、飞书)按”CLI 各自的家目录布局”下发成目录树,CLI 启动时从这里读到 token 即是登录态。本次会话用户未授权钉钉/飞书,所以只有骨架目录。

这是值得注意的模式:凭证不进环境变量、不进配置文件明文,而是通过云存储视图按路径投放,沙箱本身不持久化(会话销毁即消失)。

3. /home/kimi/.cli-tools/ —— 预装的第三方平台 CLI

两个 npm 全局式布局的工具(bin/ 符号链接到 lib/node_modules//),均为镜像内置(Aug 6 03:46-03:47):

dws-cli(钉钉)

  • 包:dingtalk-workspace-cli@1.0.35(github.com/open-dingtalk/dingtalk-workspace-cli,Apache-2.0)。
  • bin/dws 是 Node 包装器,真正干活的是 vendor/dws(14.4 MB 编译二进制,Go 风格 CLI)。
  • 能力:dws --help 显示它把钉钉 MCP 服务包成命令树,共 20+ 个服务域——doc(钉钉文档读写/块级编辑)、drive(云盘)、chatcontact(通讯录)、calendarattendance(考勤)、oa(审批)、todowikimailminutes(AI 听记)、aitablesheetreport 等;另有 api(裸 OpenAPI 调用)、authdoctorschemaplugin 等工具命令。
  • 包内自带技能包:lib/node_modules/dingtalk-workspace-cli/share/skills/(SKILL.md + mono/multi/references/scripts),即”CLI + 教 agent 用 CLI 的 skill”捆绑分发。
  • 运行时状态:~/.dws/ 由 CLI 运行时创建(Aug 18 09:20,与本节采集同时),含 identity.json(75B,mode 600)、logs/dws.logcache/未登录dws auth status 返回 {"success":true,"authenticated":false,"message":"未登录"}

lark-cli(飞书/Lark)

  • 包:@larksuite/cli@1.0.50(官方,github.com/larksuite/cli,MIT),同样是 Node 包装器 + 编译二进制(bin/lark-cli,支持自更新崩溃恢复 .old 回滚逻辑)。
  • 用法:lark-cli <command> [subcommand] [method],如 lark-cli calendar +agendalark-cli contact +search-user --query "John"、通用 lark-cli api GET /open-apis/...
  • 帮助里明确写着 “AI AGENT SKILLS: lark-cli pairs with AI agent skills (Claude Code, etc.)”,安装方式是 npx skills add larksuite/cli -g -y——这套 CLI 的设计目标就是给 agent 用
  • 认证:Device Flow(lark-cli auth login 输出验证 URL,浏览器扫码)。运行时状态:未配置auth status 返回 not_configured,hint 让跑 config init --new)。~/.lark-cli/ 只有空 cache/

注意:系统插件目录里也有一个 lark 插件(portal 下发),与这里的 lark-cli 是两条路——插件走 Kimi 插件协议,CLI 走本地命令行+官方开放平台。

4. /home/kimi/ 下其余用户态目录

  • /home/kimi/.agents/skills/空目录,不是符号链接drwxr-xr-x 2 kimi kimi,Aug 6 03:47)。镜像预留的用户级技能安装位(对应 npx skills add 这类工具的家目录约定),本沙箱里用户技能实际走的是 /app/.user/skills/(portal 云同步),所以这个目录空着。agent 进程 PATH 里也没有它。
  • /home/kimi/.kimi-slides/:系统技能 kimi-slides(Moonshot 第一方 PPT 技能,定义 .pptd YAML DSL over OOXML)的配套资源:
    • fonts/:20+ 个编号 TTF(01-Liter … 12-MiSans、13-Noto-Sans-SC、14-SourceHanSerif、15-AlimamaDaoLiTi、22-SmileySans 等,中英文混排);
    • install-stateschema_version=1 + fonts_sha256=1ef2594... + fonts_installed=true——内容寻址的幂等安装标记,字体包变了才重装。
    • 配套 CLI 在 PATH 最前:/app/.ppt(agent 进程 PATH 第一项,排在 skills 模板 node_modules/.bin 之前)。
  • /home/kimi/.config/:只有 chromium/(Crash Reports 目录树,无 Preferences/Cookies 等可见内容,mode 700)。浏览器持久档案不放在标准位置或由 browser-guard 另行管理。
  • .bashrc 增补export PATH=/home/kimi/.local/bin:/home/kimi/.npm-global/bin:$PATH + NODE_PATH=/home/kimi/.npm-global/lib/node_modules(注意:.cli-tools/*/bin 不在 PATH,需全路径调用)。
  • .gitconfiguser.email=agent@example.com / name=agentsafe.directory=*——agent 身份 + 任意目录可操作的宽松配置。
  • .npmrc(mode 600):prefix=/home/ki...cache=/home/ki...(指向 .npm-global / .npm-cache,已脱敏;未见 registry token 字段)。
  • .dotnet/.nuget/.ipython/:预装的 .NET 与 Jupyter 生态用户态。
  • .Xauthority:kasmvnc/Xvnc 会话的 X 认证 cookie(115B,mode 600)。

5. portal 下发的网关凭证(脱敏记录)

/mnt/portal-overlay/.agent-gw.json(只读 186B):

{
  "api_key": "sk-kimi-8OQEd910...(已脱敏,64位 sk-kimi- 前缀密钥)",
  "base_url": "https://agent-gw.kimi.com/coding",
  "kimi_chat_id": "1a014098-****-****-****-********15cb"
}
  • 存在:是。用途:agent 调 Moonshot 模型的网关凭证(base_url 路径 /coding 表明是 coding 套餐通道),外加绑定会话的 chat_id。
  • 存放位置:portal FUSE 只读文件,不进环境变量(进程 environ 里未见),由 agent 进程自行读取。
  • 这印证 OpenClaw 技能里的说法:模型额度走 Kimi 会员体系 + 网关集中鉴权,本地不持有长期密钥;该 key 应为会话级短期凭证(随沙箱销毁失效)。

6. 用户态 vs 系统预置态的分界(结论)

  1. 系统层(镜像烤入,269 技能 + 运行时 + CLI 工具):时间戳集中在 Aug 5–11,属镜像构建产物;升级靠换镜像。
  2. portal 云同步层.user/skills.user/auth.agents/plugins.vault.websites-templates.agent-gw.json):沙箱启动时建立符号链接接入 FUSE 视图,按账号实时下发、可热更新——这是”用户自带内容”与”平台动态配置”的统一通道。
  3. 本地运行态~/.dws~/.lark-cli.cache 等):CLI/程序运行时在 overlay2 upper 层现建,会话级持久。
  4. 用户技能与系统技能同构(同样的 SKILL.md + frontmatter 规范),agent 侧大概率只是合并扫描 /app/.agents/skills + /app/.user/skills 两个目录;/home/kimi/.agents/skills 是另一个预留位但当前未启用。
  5. 第三方集成(钉钉/飞书)采取”CLI 预装 + 凭证按家目录布局从 portal 投放“的解耦设计:工具在镜像里,身份在云上,沙箱本身无秘密。

7. 对 Hermes 的启示(详见回报总结)

  • 分层模型:镜像层 / 账号同步层(类 portal FUSE + 符号链接接入点)/ 会话本地层。
  • 技能即数据:用户技能用与系统技能完全相同的格式从云端下发,无需特殊加载路径。
  • CLI+skill 捆绑分发 + 凭证与工具分离的投放方式。
  • openclaw-selfhost-ops 整份 runbook 可直接作为 Hermes 运维 Kimi Claw 自建实例的知识库素材。

附:采集受限说明

采集末段(约 17:25 起)沙箱 frpc 隧道断开(127.0.0.1:12222/18080 均 connection refused,本机 frps 正常、其余代理端口在听),多次重试未恢复。以下次要项未能补采:~/.dws/identity.json 的具体字段(仅知 75B/mode 600)、/app/.ppt/ 目录内容、.kimi-slides/fonts 精确数量(已列 20 个)。均不影响本节结论。