LocalSync2026-03-28
如何用 OpenClaw 控制 Claude Code 完成编程任务
1. 概述
OpenClaw 和 Claude Code(以下简称 CC)是一对协作搭档:
- OpenClaw = 项目经理:负责需求拆解、任务派发、进度监控、验收结果
- Claude Code = 开发工程师:负责所有代码工作——读文件、写文件、执行命令、创建项目
OpenClaw 不写一行代码。它通过 exec 工具调用 CC,把任务指令传给 CC,CC 独立完成开发工作后返回结果,OpenClaw 检查验收。
这套模式的核心思想:用自然语言驱动编程,用流程管控保证质量。
2. 环境准备
2.1 安装 Claude Code
npm install -g @anthropic-ai/claude-code
验证安装:
claude --version
如果输出版本号(如 1.x.x),说明安装成功。
2.2 配置 API 认证
方式一:环境变量(推荐)
编辑 ~/.bashrc,添加以下内容:
export ANTHROPIC_BASE_URL="https://your-api-endpoint.com"
export ANTHROPIC_AUTH_TOKEN="your-token-here"
export ANTHROPIC_MODEL="claude-sonnet-4-20250514"
说明:
- ANTHROPIC_BASE_URL:API 地址,支持第三方兼容 API(如 HuanAPI 等中转服务),不限于 Anthropic 官方
- ANTHROPIC_AUTH_TOKEN(或 ANTHROPIC_API_KEY):认证令牌
- ANTHROPIC_MODEL:指定使用的模型
写完后执行:
source ~/.bashrc
方式二:settings.json
路径:~/.claude/settings.json
{
"apiBaseUrl": "https://your-api-endpoint.com",
"apiKey": "your-token-here"
}
注意:settings.json 里的认证字段实测不一定被 CC 读取,环境变量更可靠。建议优先使用环境变量方式。
2.3 配置文件权限(关键!)
编辑 ~/.claude/settings.json,添加权限配置:
{
"permissions": {
"allow": [
"Bash(*)",
"Read(*)",
"Write(*)",
"Edit(*)"
],
"deny": []
}
}
这组配置的作用:
- CC 在 -p 模式下可以读写文件、执行命令,无需交互确认
- 不需要 --dangerously-skip-permissions(该选项在 root 用户下被禁止使用)
- 如果不配这个,CC 会只输出文字建议而不实际操作文件
2.4 完成 Onboarding
CC 首次运行需要完成初始引导。检查 ~/.claude.json,确保包含:
{
"hasCompletedOnboarding": true
}
如果是全新安装,先手动运行一次:
claude
按提示完成初始引导后退出,后续就可以用 -p 模式了。
3. 核心调用方式
3.1 基本命令
claude -p "你的任务指令"
-p是 print 模式,非交互式,适合程序化调用- CC 会自主读文件、写文件、执行命令,然后输出结果文本
3.2 指定工作目录
cd /path/to/project && claude -p "任务指令"
CC 会以当前目录为工作上下文,读取该目录下的文件、在该目录下创建文件。
3.3 在 OpenClaw 中调用
OpenClaw 通过 exec 工具调用 CC:
exec background:true timeout:600
cd /path/to/project && claude -p "任务指令"
调用后用以下方式监控:
process action:poll
查看实时输出:
process action:log
典型工作流:
1. OpenClaw 拆解需求为多个子任务
2. 每个子任务通过 exec 调用 CC
3. process action:poll 等待完成
4. 检查 CC 的输出和文件变更
5. 验收通过则继续下一个任务,不通过则发补充指令
4. 任务指令编写规范
好的任务指令应包含四个要素:
| 要素 | 说明 |
|---|---|
| 目标 | 要做什么 |
| 范围 | 改哪些文件、在哪个目录 |
| 技术约束 | 用什么语言/框架、遵循什么规范 |
| 验证标准 | 怎么判断做完了 |
好的指令示例
示例 1:添加功能
claude -p "在 src/api/routes.py 中添加一个 GET /api/health 接口,返回 JSON 格式 {\"status\": \"ok\", \"timestamp\": 当前时间}。使用 Flask 框架现有的路由注册方式。完成后运行 python -m pytest tests/ 确认没有破坏现有测试。"
示例 2:修复 Bug
claude -p "用户反馈登录接口在密码包含特殊字符 &、= 时返回 400。问题可能在 src/auth/login.py 的参数解析部分。修复这个 bug,并在 tests/test_auth.py 中添加对应的测试用例覆盖特殊字符场景。"
示例 3:代码审查
claude -p "审查 src/payment/ 目录下所有 Python 文件,重点关注:1) SQL 注入风险 2) 未处理的异常 3) 硬编码的密钥或凭据。输出审查报告,不要修改任何文件。"
坏的指令示例
# 太模糊,没有范围和约束
claude -p "帮我优化一下代码"
问题:CC 不知道优化哪个文件、什么方向的优化、优化到什么程度。
核心原则
一次任务聚焦一件事。不要在一条指令里塞进"加个功能 + 改个样式 + 修个 bug + 写个文档"。拆成多次调用,每次验收后再进行下一步。
5. 实战示例
5.1 给现有项目加新功能
场景:为 Flask 项目添加用户注册接口。
cd /opt/myproject && claude -p "
在 src/api/user.py 中添加 POST /api/register 接口。
要求:
1. 接收 JSON 参数:username, email, password
2. 对 password 做 bcrypt 哈希后存入数据库
3. username 和 email 需要唯一性校验,重复时返回 409
4. 成功返回 201 和用户 ID
5. 在 tests/test_user.py 中添加正常注册、重复用户名、重复邮箱三个测试用例
6. 完成后执行 pytest tests/test_user.py -v 确认测试通过
"
5.2 修 Bug
场景:分页接口在最后一页返回空数组而不是实际数据。
cd /opt/myproject && claude -p "
Bug:GET /api/articles?page=last 返回空数组。
排查 src/api/articles.py 中的分页逻辑,找到 bug 原因并修复。
预期行为:最后一页应返回剩余的所有文章。
修复后在 tests/test_articles.py 中添加边界测试用例:
- 请求最后一页
- 请求超出总页数的页码(应返回空数组)
运行 pytest tests/test_articles.py -v 确认通过。
"
5.3 从零搭建新项目
场景:创建一个 FastAPI 项目脚手架。
cd /opt && claude -p "
在当前目录下创建一个名为 todo-api 的 FastAPI 项目,结构如下:
todo-api/
├── app/
│ ├── __init__.py
│ ├── main.py # FastAPI 应用入口
│ ├── models.py # SQLAlchemy 模型(Todo 表:id, title, done, created_at)
│ ├── schemas.py # Pydantic schemas
│ ├── database.py # 数据库连接(SQLite)
│ └── routers/
│ └── todos.py # CRUD 路由
├── tests/
│ └── test_todos.py # 基本 CRUD 测试
├── requirements.txt
└── README.md
完成后执行:
1. pip install -r requirements.txt
2. pytest tests/ -v
确认项目可运行且测试通过。
"
5.4 代码审查(只看不改)
场景:安全审计支付模块。
cd /opt/myproject && claude -p "
对 src/payment/ 目录进行安全审查,不修改任何文件。
重点关注:
1. SQL 注入风险(是否使用了参数化查询)
2. 敏感信息泄露(日志中是否打印了卡号、密钥)
3. 金额计算是否使用了 Decimal 而非 float
4. 异常处理是否会暴露内部堆栈信息
将审查结果写入 security_review_payment.md,按严重程度分级(高/中/低),每个问题注明文件名和行号。
"
5.5 多任务并行
场景:同时让 CC 处理前端和后端两个独立任务。
在 OpenClaw 中:
exec background:true timeout:600
cd /opt/myproject && claude -p "在 src/api/stats.py 中添加 GET /api/stats/daily 接口,返回今日的注册用户数和订单数。"
exec background:true timeout:600
cd /opt/myproject/frontend && claude -p "在 src/pages/Dashboard.vue 中添加一个统计卡片组件,展示日活用户数和日订单数,数据从 /api/stats/daily 获取。"
两个任务并行执行,分别用 process action:poll 监控完成状态。
6. 验收流程
CC 完成任务后,OpenClaw 按以下步骤验收:
6.1 检查文件变更
claude -p "列出过去 10 分钟内新建或修改的文件,用 find 命令。"
或直接:
exec
find /opt/myproject -mmin -10 -type f
6.2 编译/语法检查
exec
cd /opt/myproject && python -m py_compile src/api/new_module.py
6.3 运行测试
exec
cd /opt/myproject && pytest tests/ -v --tb=short
6.4 功能验证
exec
curl -s http://localhost:8000/api/health | jq .
6.5 验收判定
- 通过:文件存在、编译通过、测试通过、功能符合预期 → 进入下一个任务
- 不通过:发现问题 → 给 CC 发补充指令修复
claude -p "上一步的 /api/health 接口返回的 timestamp 格式不对,应该是 ISO 8601 格式(如 2026-03-28T12:00:00Z),请修复 src/api/routes.py 中对应的代码。"
7. 常见问题(FAQ)
Q: CC 报 "Not logged in" 或认证失败
环境变量没加载。检查:
echo $ANTHROPIC_BASE_URL
echo $ANTHROPIC_AUTH_TOKEN
如果为空,执行 source ~/.bashrc,或直接在命令前带上:
ANTHROPIC_BASE_URL="https://xxx" ANTHROPIC_AUTH_TOKEN="xxx" claude -p "任务"
Q: CC 只输出文字建议,不实际写文件
~/.claude/settings.json 没有配置 permissions.allow。参考 2.3 节配置后重试。
Q: root 下 --dangerously-skip-permissions 报错
这是 CC 的安全限制,root 用户不能使用该参数。解决方案:不需要这个参数,用 -p 模式 + settings.json 中的 permissions.allow 即可实现同样效果。
Q: CC 执行到一半就退出了
任务太大或太复杂。解决方案:
1. 把大任务拆成多个小任务,分步执行
2. 增加 exec 的 timeout 参数值
3. 检查 API 是否有请求超时限制
Q: 工作目录权限不足
# 检查权限
ls -la /path/to/project
# 修复权限
chmod -R 755 /path/to/project
chown -R $(whoami) /path/to/project
或者换到一个有写权限的目录执行任务。
Q: CC 的输出乱码或被截断
尝试在指令末尾加上"用中文回复"或"输出保持简洁"。如果输出被截断,可能是 token 限制,把任务拆小。
8. 踩过的坑(经验总结)
坑 1:root 不能用 --dangerously-skip-permissions
CC 硬性限制,root 用户调用 --dangerously-skip-permissions 会直接报错退出。这是安全设计,绕不过。
正确做法:在 ~/.claude/settings.json 配置 permissions.allow,搭配 -p 模式使用。效果一样,还更安全。
坑 2:-p 模式默认是只读的
不配 permissions.allow 的情况下,-p 模式只会输出文本建议("你应该这样改..."),不会实际修改文件。
正确做法:必须在 settings.json 中明确授权 Bash(*)、Read(*)、Write(*)、Edit(*)。
坑 3:环境变量优先级高于 settings.json
如果环境变量和 settings.json 里都配了 API 地址,环境变量会覆盖 settings.json。
建议:统一用环境变量配置认证信息,settings.json 只管权限。
坑 4:.bashrc 不一定会被加载
以下场景 .bashrc 不会自动执行:
- su 切换用户(不带 -)
- cron 任务
- 某些 Docker 容器的非交互 shell
正确做法:
# 方式一:显式加载
source ~/.bashrc && claude -p "任务"
# 方式二:直接在命令中传入环境变量
ANTHROPIC_BASE_URL="https://xxx" ANTHROPIC_AUTH_TOKEN="xxx" claude -p "任务"
# 方式三:写入 /etc/environment(全局生效)
echo 'ANTHROPIC_BASE_URL=https://xxx' >> /etc/environment
坑 5:任务指令太长导致 shell 解析出错
复杂指令中如果包含引号、特殊字符,容易被 shell 吃掉或转义错误。
正确做法:用 heredoc 或从文件读取指令:
# 方式一:heredoc
claude -p "$(cat <<'EOF'
在 src/main.py 中添加一个函数 parse_config(),
它读取 config.json 并返回字典。
键名包含 "database" 和 "redis" 两个部分。
EOF
)"
# 方式二:从文件读取
echo '任务指令内容' > /tmp/task.txt
claude -p "$(cat /tmp/task.txt)"
坑 6:CC 的工作目录感知
CC 只能看到当前工作目录及其子目录的文件。如果你的项目在 /opt/project,但你在 /root 下调用 CC,它可能找不到项目文件。
正确做法:始终 cd 到项目目录后再调用 CC。
附录:快速检查清单
开始使用前,确认以下所有项:
- [ ]
claude --version能输出版本号 - [ ] 环境变量
ANTHROPIC_BASE_URL和ANTHROPIC_AUTH_TOKEN已设置 - [ ]
~/.claude/settings.json包含permissions.allow配置 - [ ]
~/.claude.json包含hasCompletedOnboarding: true - [ ] 工作目录有读写权限
- [ ] 测试命令
claude -p "输出 hello"能正常返回
原文链接:

评论