概述
在前面的章节中,我们讨论了如何通过上下文清理管理工具输出。现在我们要关注一个特殊但很有用的功能:让AI智能体能够执行系统命令,进行文件系统操作、运行脚本等。
想象一下,如果AI智能体能够执行Shell命令,就可以:
- 在代码库中查找文件
- 运行测试脚本
- 构建和部署项目
- 管理系统配置
这些能力对于开发自动化、部署任务、测试验证等场景非常有用。
Shell tool中间件就是为了提供这种能力而设计的。它为AI智能体提供持久化的Shell会话,允许AI智能体执行系统命令、进行文件系统操作、运行脚本等。但同时,这也带来了安全风险,必须根据部署环境选择适当的安全策略。
使用场景
系统命令执行
AI智能体需要执行系统命令(如ls、grep、find)进行文件系统操作或系统诊断。比如查找日志文件、检查系统状态等。
开发与部署自动化
自动化开发任务(如运行测试、构建项目、管理依赖)和部署任务(如部署脚本、配置管理)。这在CI/CD场景中特别有用。
测试与验证工作流
执行测试脚本、验证配置、检查系统状态等测试验证任务。AI智能体可以自动化这些流程。
文件系统操作
创建、读取、修改、删除文件,管理目录结构等文件系统操作。AI智能体可以像开发者一样操作文件系统。
核心功能需求
安全策略设计
Shell工具提供直接系统访问,存在安全风险。必须根据部署环境选择适当的安全策略。
Host执行策略(主机执行)
- 特点:原生执行,完整主机访问,性能最好
- 适用场景:AI智能体已在容器或VM中运行,环境已隔离
- 安全级别:低(需完全信任AI智能体)
- 使用建议:只在可信环境中使用
Docker隔离策略(容器执行)
- 特点:为每次AI智能体运行启动独立Docker容器,提供容器级隔离
- 适用场景:需要更强隔离,但不需要沙箱级限制
- 安全级别:中(容器隔离)
- 使用建议:测试和生产环境推荐使用
沙箱执行策略
- 特点:使用沙箱环境,提供额外的系统调用和文件系统限制
- 适用场景:需要最高安全级别,执行不可信代码
- 安全级别:高(沙箱隔离)
- 使用建议:执行不可信代码时必须使用
产品建议:在PRD中明确各环境的安全策略要求,开发环境可以用Host策略,测试和生产环境必须使用Docker或沙箱策略。
持久会话机制
Shell工具提供持久Shell会话,在AI智能体运行期间保持状态。
状态保持
- 环境变量:会话中的环境变量会保留
- 工作目录:当前工作目录会保留
- 命令历史:命令历史会保留
- 作用:支持复杂的命令链和脚本执行
工作目录管理
- workspace_root参数:设置Shell会话的基础目录
- 隔离性:所有命令在此目录下执行,提供隔离性
- 临时目录:如果不设置,会创建临时目录,结束时自动删除
启动/关闭钩子
- startup_commands:会话启动后顺序执行的命令(如安装依赖、设置环境变量)
- shutdown_commands:会话关闭前执行的命令(如保存状态、清理临时文件)
命令过滤与限制
为了安全,我们需要对执行的命令进行过滤和限制。
命令白名单/黑名单
- 白名单:只允许执行预定义的安全命令
- 黑名单:禁止执行危险命令(如rm -rf /、format等)
- 建议:建议使用白名单机制,更安全
参数验证
- 命令注入防护:防止命令注入攻击(如<code>; rm -rf /</code>)
- 参数校验:验证命令参数,确保安全
- 必需功能:这是基本的安全要求
资源限制
- 超时设置:为命令设置超时时间,防止长时间运行
- 内存限制:限制命令使用的内存
- CPU限制:限制命令使用的CPU资源
- 作用:防止资源耗尽,影响系统稳定性
输出脱敏
命令执行可能输出敏感信息(如API Key、密码等),需要脱敏处理。
敏感信息检测
- RedactionRule:使用规则检测命令输出中的敏感信息
- 检测类型:API Key、密码、令牌等
- 实时处理:在返回给模型前清理敏感信息
脱敏规则配置
- 正则表达式:使用正则表达式匹配敏感信息模式
- 自定义规则:支持自定义脱敏规则
- 可配置:可以在PRD中明确需要脱敏的信息类型
PRD需求描述
功能需求
FR-1: Shell命令执行
- 描述:AI智能体可以执行Shell命令,进行文件系统操作和系统管理
- 持久会话:提供持久Shell会话,在AI智能体运行期间保持状态
- 优先级:P0(核心功能)
FR-2: 安全策略支持
- 描述:支持Host、Docker、沙箱三种安全策略
- 策略选择:根据部署环境选择合适的策略
- 优先级:P0(核心功能)
FR-3: 命令过滤与限制
- 描述:支持命令白名单/黑名单、参数验证、资源限制
- 安全防护:防止命令注入攻击和资源耗尽
- 优先级:P0(核心功能)
FR-4: 输出脱敏
- 描述:检测并清理命令输出中的敏感信息
- 脱敏规则:支持配置脱敏规则
- 优先级:P1
FR-5: 启动/关闭钩子
- 描述:支持会话启动和关闭时的命令执行
- 用途:初始化和清理工作
- 优先级:P1
非功能需求
NFR-1: 安全要求
- 安全策略:生产环境必须使用Docker或沙箱策略,不能使用Host策略
- 命令过滤:必须实现命令过滤机制,防止危险命令执行
- 资源限制:必须设置资源限制,防止资源耗尽
NFR-2: 监控与审计
- 命令日志:记录所有执行的命令,包括命令内容、参数、执行结果、执行时间
- 异常监控:监控命令执行异常(超时、失败、资源耗尽),触发告警
- 审计追踪:建立审计追踪机制,记录谁执行了什么命令
NFR-3: 性能要求
- 执行性能:命令执行不应显著影响响应时间
- 资源占用:控制Shell会话的资源占用,避免影响系统性能
产品设计要点
安全策略选择
开发环境:
- 可以使用HostExecutionPolicy,但需确保环境隔离
- 方便开发和调试
测试环境:
- 建议使用DockerExecutionPolicy,提供容器级隔离
- 更接近生产环境
生产环境:
- 强烈建议使用DockerExecutionPolicy或沙箱策略
- 确保安全隔离
产品建议:在PRD中明确各环境的安全策略要求,并建立安全审查流程。
命令过滤设计
白名单机制:
- 只允许执行预定义的安全命令
- 更安全,但需要维护白名单
黑名单机制:
- 禁止执行危险命令
- 更灵活,但可能遗漏
危险命令示例:
- <code>rm -rf /</code>:删除根目录
- <code>format</code>:格式化磁盘
- <code>dd</code>:磁盘操作
- 需要在PRD中明确黑名单
产品建议:建议使用白名单机制,更安全可靠。
输出脱敏设计
敏感信息类型:
- API Key、密码、令牌等
- 需要在PRD中明确需要脱敏的信息类型
脱敏规则:
- 使用正则表达式匹配敏感信息
- 支持自定义规则
脱敏效果:
- 需要测试脱敏规则的有效性
- 确保敏感信息不会被泄露
产品建议:建议在PRD中明确脱敏规则和验证要求。
使用建议
什么时候应该使用
- 开发自动化:需要执行系统命令、运行脚本的开发任务
- 部署任务:自动化部署和配置管理
- 测试验证:执行测试脚本、验证配置等
配置建议
- 安全策略:根据环境选择合适的策略,生产环境必须使用Docker或沙箱
- 命令过滤:实现命令白名单或黑名单,防止危险命令
- 资源限制:设置超时和资源限制,防止资源耗尽
注意事项
- 安全第一:Shell工具存在安全风险,必须谨慎使用
- 环境隔离:生产环境必须使用隔离策略
- 命令审计:必须记录所有命令执行日志,便于审计
与其他中间件的配合
Shell工具可以与其他中间件配合使用:
- 与ToolCallLimitMiddleware配合:限制Shell命令的执行次数
- 与PIIMiddleware配合:清理命令输出中的敏感信息
- 与Human-in-the-loop配合:关键命令执行前触发人工审核(注意:当前版本可能不支持)
后续优化方向
- 智能命令验证:基于命令语义,智能判断命令是否安全
- 命令模板:提供常用命令模板,减少错误
- 执行结果优化:优化命令输出的格式,便于AI智能体理解
- 安全增强:持续增强安全机制,防范新的安全威胁