# SafeExec 详细文档

> 完整的使用指南、配置说明、开发文档和常见问题

**主文档：** [README.md](README.md) | **变更日志：** [CHANGELOG.md](CHANGELOG.md)

---

## 📑 目录

- [使用指南](#使用指南)
  - [工作原理](#工作原理)
  - [批准工作流](#批准工作流)
  - [风险等级详解](#风险等级详解)
  - [全局控制](#全局控制)
- [高级配置](#高级配置)
  - [环境变量](#环境变量)
  - [自定义规则](#自定义规则)
  - [非交互式模式](#非交互式模式)
- [开发文档](#开发文档)
  - [架构设计](#架构设计)
  - [文件说明](#文件说明)
  - [API 参考](#api-参考)
  - [贡献指南](#贡献指南)
- [常见问题](#常见问题)
  - [故障排查](#故障排查)
  - [最佳实践](#最佳实践)
  - [性能优化](#性能优化)

---

## 使用指南

### 工作原理

SafeExec 通过以下步骤保护你的系统：

```
1. 命令拦截
   ↓
2. 模式匹配
   ↓
3. 风险评估
   ↓
4. 决策
   ├── 安全 → 直接执行
   └── 危险 → 请求批准
```

#### 架构组件

```
~/.openclaw/safe-exec/
├── pending/              # 待处理的批准请求
│   └── req_*.json       # 请求详情文件
├── safe-exec-rules.json # 规则配置文件
└── safe-exec-audit.log  # 审计日志

~/.openclaw/safe-exec-known-*.txt  # 监控追踪文件
```

### 批准工作流

#### 1. 危险命令检测

当 Agent 尝试执行危险命令时：

```
🚨 **危险操作检测 - 命令已拦截**

**风险等级:** CRITICAL
**命令:** `rm -rf /tmp/test`
**原因:** 递归删除，使用 force 标志

**请求 ID:** `req_1769938492_9730`

ℹ️  此命令需要用户批准才能执行。

**批准方法:**
1. 在终端运行: `safe-exec-approve req_1769938492_9730`
2. 或者: `safe-exec-list` 查看所有待处理请求

**拒绝方法:**
 `safe-exec-reject req_1769938492_9730`
```

#### 2. 批准请求

```bash
# 方法 1: 使用请求 ID
safe-exec-approve req_1769938492_9730

# 方法 2: 列出并批准最近的请求
safe-exec-list
# 输出所有待处理的请求，然后使用 ID 批准
```

#### 3. 命令执行

批准后，命令会执行并记录到审计日志。

### 风险等级详解

#### 🔴 CRITICAL（危急）

系统破坏性命令，需要明确批准：

- `rm -rf /` - 删除根目录
- `dd if=/dev/zero` - 磁盘覆盖
- `mkfs.*` - 格式化文件系统
- `:(){ :|:& };:` - Fork bomb
- `> /dev/sda` - 直接写入磁盘

#### 🟠 HIGH（高危）

可能导致数据丢失或系统变动的命令：

- `rm -rf` (非根目录) - 递归删除
- `chmod 777` - 设置全局可写权限
- `curl | bash` - 管道下载到 shell
- 写入 `/etc/`, `/boot/`, `/sys/` - 系统目录修改
- `wget | sh` - 下载并执行脚本

#### 🟡 MEDIUM（中危）

需要特权或影响系统的操作：

- `sudo` - 使用特权执行
- `iptables`, `firewall-cmd`, `ufw` - 防火墙修改
- `systemctl` - 服务管理
- `crontab -e` - 定时任务编辑

#### 🟢 LOW（低危）

相对安全的操作，可能无需批准：

- `ls`, `cat`, `grep` - 读取操作
- `cp`, `mv` (非系统目录) - 文件操作
- `mkdir`, `touch` - 创建操作
- `cd`, `pwd` - 导航操作

### 全局控制

#### 启用/禁用 SafeExec

**对话式：**
```
Enable SafeExec   # 启用
Disable SafeExec  # 禁用
```

**脚本式：**
```bash
~/.openclaw/skills/safe-exec/safe-exec.sh --enable
~/.openclaw/skills/safe-exec/safe-exec.sh --disable
```

**环境变量：**
```bash
export SAFE_EXEC_DISABLE=1  # 禁用
unset SAFE_EXEC_DISABLE     # 启用
```

#### 查看状态

```bash
# 查看待处理的请求
safe-exec-list

# 查看审计日志（最近 50 条）
tail -n 50 ~/.openclaw/safe-exec-audit.log

# 查看配置
cat ~/.openclaw/safe-exec-rules.json
```

---

## 高级配置

### 环境变量

| 变量 | 说明 | 默认值 |
|------|------|--------|
| `SAFE_EXEC_DISABLE` | 全局禁用 SafeExec | 未设置 |
| `OPENCLAW_AGENT_CALL` | 标识 Agent 调用（自动检测） | 自动 |
| `SAFE_EXEC_AUTO_CONFIRM` | 自动批准 LOW/MEDIUM 风险 | 未设置 |
| `SAFEXEC_CONTEXT` | 用户上下文信息 | 空 |

**使用示例：**

```bash
# 自动批准低中风险命令
export SAFE_EXEC_AUTO_CONFIRM=1

# 在 Agent 中使用（自动设置）
export OPENCLAW_AGENT_CALL=1

# 完全禁用
export SAFE_EXEC_DISABLE=1
```

### 自定义规则

编辑 `~/.openclaw/safe-exec-rules.json`：

```json
{
  "enabled": true,
  "rules": [
    {
      "pattern": "docker rm.*-f",
      "risk": "medium",
      "reason": "强制删除 Docker 容器"
    },
    {
      "pattern": "kubectl delete",
      "risk": "high",
      "reason": "删除 Kubernetes 资源"
    }
  ]
}
```

### 非交互式模式

在非交互式环境（如 Agent 调用）中：

1. **TTY 检测**：SafeExec 自动检测是否在交互式终端
2. **环境检测**：检测 `OPENCLAW_AGENT_CALL` 环境变量
3. **智能跳过**：在非交互式环境中跳过二次确认

```bash
# Agent 调用时自动启用非交互模式
export OPENCLAW_AGENT_CALL=1
```

---

## 开发文档

### 架构设计

```
┌─────────────┐
│   Agent     │
└──────┬──────┘
       │
       ▼
┌──────────────────┐
│  safe-exec.sh    │ ← 主入口
└──────┬───────────┘
       │
       ▼
┌────────────────────┐
│  风险评估引擎      │
│  - 模式匹配        │
│  - 上下文分析      │
└──────┬─────────────┘
       │
       ▼
   ┌───┴────┐
   │ 危险？  │
   └───┬────┘
     是 │   │ 否
        │   └──────────→ 直接执行
        ▼
┌──────────────┐
│ 请求批准     │
│ - 写入 pending│
│ - 通知用户   │
└──────────────┘
```

### 文件说明

#### 核心脚本

| 文件 | 功能 |
|------|------|
| `safe-exec.sh` | 主执行脚本，命令拦截和风险评估 |
| `safe-exec-approve.sh` | 批准请求的脚本 |
| `safe-exec-reject.sh` | 拒绝请求的脚本 |
| `safe-exec-list.sh` | 列出待处理的请求 |
| `safe-exec-check-pending.sh` | 检查待处理请求 |

#### 文档文件

| 文件 | 说明 |
|------|------|
| `README.md` | 主要文档，快速开始 |
| `README-detail.md` | 本文档，详细说明 |
| `CHANGELOG.md` | 版本变更日志 |
| `SKILL.md` | ClawdHub skill 描述 |
| `CONTRIBUTING.md` | 贡献指南 |

#### 配置和数据

| 文件/目录 | 说明 |
|-----------|------|
| `~/.openclaw/safe-exec-rules.json` | 规则配置 |
| `~/.openclaw/safe-exec-audit.log` | 审计日志 |
| `~/.openclaw/safe-exec/pending/` | 待处理请求 |

### API 参考

#### safe-exec.sh

```bash
# 执行命令
safe-exec.sh "command"

# 启用/禁用
safe-exec.sh --enable
safe-exec.sh --disable
safe-exec.sh --status
```

#### safe-exec-approve.sh

```bash
# 批准请求
safe-exec-approve.sh <request_id>

# 查看详情
safe-exec-approve.sh --list
```

#### safe-exec-list.sh

```bash
# 列出所有待处理请求
safe-exec-list.sh

# 仅显示 CRITICAL 级别
safe-exec-list.sh --critical
```

### 贡献指南

#### 开发环境设置

```bash
# 1. Fork 并克隆仓库
git clone https://github.com/OTTTTTO/safe-exec.git
cd safe-exec

# 2. 创建功能分支
git checkout -b feature/my-feature

# 3. 测试修改
./test-safeexec.sh

# 4. 提交更改
git commit -m "feat: Add my feature"

# 5. 推送并创建 PR
git push origin feature/my-feature
```

#### 代码规范

- Bash 脚本遵循 [ShellCheck](https://www.shellcheck.net/) 建议
- 文档使用 Markdown 格式
- 提交信息遵循 [Conventional Commits](https://www.conventionalcommits.org/)

#### 测试

```bash
# 运行所有测试
./test-safeexec.sh

# 运行特定测试
./test-regression.sh
./test-context-aware.sh
```

---

## 常见问题

### 故障排查

#### Q: SafeExec 没有拦截命令

**A:** 检查以下几点：

1. 是否已启用？
```bash
~/.openclaw/skills/safe-exec/safe-exec.sh --status
```

2. 是否被环境变量禁用？
```bash
echo $SAFE_EXEC_DISABLE
```

3. 命令是否在白名单中？

#### Q: 批准命令后没有执行

**A:** 可能的原因：

1. 请求已超时（5分钟）
2. 命令语法错误
3. 权限不足

查看审计日志：
```bash
tail -f ~/.openclaw/safe-exec-audit.log
```

#### Q: 如何重置所有状态？

**A:** 删除数据文件：
```bash
rm -rf ~/.openclaw/safe-exec/
rm ~/.openclaw/safe-exec-*
```

### 最佳实践

#### 1. 生产环境使用

```bash
# 启用自动确认低中风险操作
export SAFE_EXEC_AUTO_CONFIRM=1

# 定期备份审计日志
cp ~/.openclaw/safe-exec-audit.log ~/.backup/
```

#### 2. 多用户环境

为每个用户配置独立的规则文件：
```bash
export SAFE_EXEC_RULES_FILE="/home/user/.safe-exec-rules.json"
```

#### 3. 与其他工具集成

**与 sudo 集成：**
```bash
# 在 sudoers 中添加
Defaults secure_path = /usr/local/bin:/usr/bin:/bin
```

**与日志系统集成：**
```bash
# 将审计日志发送到 rsyslog
tail -f ~/.openclaw/safe-exec-audit.log | logger -t safeexec
```

### 性能优化

#### 减少延迟

```bash
# 使用更快的磁盘存储
export SAFE_EXEC_DIR="/dev/shm/safe-exec"
```

#### 定期清理

```bash
# 清理过期的 pending 请求
find ~/.openclaw/safe-exec/pending/ -mtime +1 -delete

# 压缩旧日志
logrotate ~/.openclaw/safe-exec-audit.log
```

---

## 附录

### 相关资源

- [OpenClaw 文档](https://docs.openclaw.ai/)
- [ClawdHub 市场](https://www.clawhub.ai/skills)
- [Bash 最佳实践](https://github.com/koalaman/shellcheck)

### 社区

- **GitHub Issues**: https://github.com/OTTTTTO/safe-exec/issues
- **Discussions**: https://github.com/OTTTTTO/safe-exec/discussions
- **Email**: 731554297@qq.com

### 许可证

MIT License - 详见 [LICENSE](LICENSE)

---

**最后更新:** 2026-02-01
**维护者:** OTTTTTO
**版本:** v0.3.3
