当前位置: 首页 > news >正文

OpenClaw工具拆解之exec

如果文章对你有帮助,请点个“关注”

一、工具概述

功能:执行 shell 命令(最核心的基础工具)
核心特性

  • 支持后台运行(yieldMs/background)
  • 支持超时控制(timeout)
  • 支持 PTY 模式(pty=true 用于 TTY 命令)
  • 支持多主机(sandbox/gateway/node)
  • 支持提权执行(elevated)
  • 支持安全模式(deny/allowlist/full)
  • 支持审批模式(off/on-miss/always)
  • 支持环境变量(env)
  • 支持工作目录(cwd/workdir)

二、Schema 定义

位置:第 14782 行

constexecSchema=Type.Object({command:Type.String({description:"Shell command to execute"}),workdir:Type.Optional(Type.String({description:"Working directory (defaults to cwd)"})),env:Type.Optional(Type.Record(Type.String(),Type.String())),yieldMs:Type.Optional(Type.Number({description:"Milliseconds to wait before backgrounding (default 10000)"})),background:Type.Optional(Type.Boolean({description:"Run in background immediately"})),timeout:Type.Optional(Type.Number({description:"Timeout in seconds (optional, kills process on expiry)"})),pty:Type.Optional(Type.Boolean({description:"Run in a pseudo-terminal (PTY) when available (TTY-required CLIs, coding agents)"})),elevated:Type.Optional(Type.Boolean({description:"Run on the host with elevated permissions (if allowed)"})),host:Type.Optional(Type.String({description:"Exec host (sandbox|gateway|node)."})),security:Type.Optional(Type.String({description:"Exec security mode (deny|allowlist|full)."})),ask:Type.Optional(Type.String({description:"Exec ask mode (off|on-miss|always)."})),node:Type.Optional(Type.String({description:"Node id/name for host=node."}))});

三、完整执行代码

位置:第 16558 行

functioncreateExecTool(defaults){// 1. 解析默认配置constdefaultBackgroundMs=clampWithDefault(defaults?.backgroundMs??readEnvInt("PI_BASH_YIELD_MS"),1e4,10,12e4);constallowBackground=defaults?.allowBackground??true;constdefaultTimeoutSec=typeofdefaults?.timeoutSec==="number"&&defaults.timeoutSec>0?defaults.timeoutSec:1800;// 2. 解析安全策略(白名单、黑名单等)const{safeBins,safeBinProfiles,trustedSafeBinDirs}=resolveExecSafeBinRuntimePolicy({...});// 3. 返回工具定义return{name:"exec",label:"exec",description:"Execute shell commands with background continuation. Use yieldMs/background to continue later via process tool. Use pty=true for TTY-required commands (terminal UIs, coding agents).",parameters:execSchema,execute:async(_toolCallId,args,signal,onUpdate)=>{// === 执行逻辑开始 ===constparams=args;// 1. 参数验证if(!params.command)thrownewError("Provide a command to start.");// 2. 解析后台运行请求constbackgroundRequested=params.background===true;constyieldRequested=typeofparams.yieldMs==="number";constyieldWindow=allowBackground?(backgroundRequested?0:clampWithDefault(params.yieldMs??defaultBackgroundMs,defaultBackgroundMs,10,12e4)):null;// 3. 解析提权请求constelevatedRequested=elevatedMode!=="off";if(elevatedRequested){if(!elevatedDefaults?.enabled||!elevatedDefaults.allowed){thrownewError("elevated is not available right now...");}}// 4. 确定执行主机(sandbox/gateway/node)lethost=requestedHost??configuredHost;if(elevatedRequested)host="gateway";// 5. 确定安全模式letsecurity=minSecurity(configuredSecurity,normalizeExecSecurity$1(params.security)??configuredSecurity);if(elevatedRequested&&elevatedMode==="full")security="full";// 6. 确定审批模式letask=maxAsk(configuredAsk,normalizeExecAsk$1(params.ask)??configuredAsk);constbypassApprovals=elevatedRequested&&elevatedMode==="full";if(bypassApprovals)ask="off";// 7. 解析工作目录constrawWorkdir=params.workdir?.trim()||defaults?.cwd||process.cwd();letworkdir=rawWorkdir;if(sandbox){constresolved=awaitresolveSandboxWorkdir({workdir:rawWorkdir,sandbox,warnings});workdir=resolved.hostWorkdir;}// 8. 解析环境变量(安全检查)constenv=sandbox&&host==="sandbox"?buildSandboxEnv({...}):hostEnvResult?.env??inheritedBaseEnv;// 9. 处理不同主机的执行逻辑if(host==="node"){returnexecuteNodeHostCommand({...});}if(host==="gateway"&&!bypassApprovals){// 10. Gateway 白名单检查(可能需要用户审批)constgatewayResult=awaitprocessGatewayAllowlist({...});if(gatewayResult.pendingResult){// 需要审批,返回待处理状态returngatewayResult.pendingResult;}execCommandOverride=gatewayResult.execCommandOverride;}// 11. 执行命令construn=awaitrunExecProcess({command:params.command,execCommand:execCommandOverride,workdir,env,sandbox,containerWorkdir,usePty:params.pty===true&&!sandbox,warnings,maxOutput:DEFAULT_MAX_OUTPUT,pendingMaxOutput:DEFAULT_PENDING_MAX_OUTPUT,notifyOnExit,notifyOnExitEmptySuccess,timeoutSec:effectiveTimeout,onUpdate});// 12. 处理后台运行letyielded=false;letyieldTimer=null;constonYieldNow=()=>{if(yieldTimer)clearTimeout(yieldTimer);if(yielded)return;yielded=true;markBackgrounded(run.session);resolveRunning();};if(allowBackground&&yieldWindow!==null){if(yieldWindow===0)onYieldNow();elseyieldTimer=setTimeout(onYieldNow,yieldWindow);}// 13. 等待执行完成returnnewPromise((resolve,reject)=>{run.promise.then((outcome)=>{if(yieldTimer)clearTimeout(yieldTimer);if(yielded||run.session.backgrounded)return;resolve(buildExecForegroundResult({outcome,cwd:run.session.cwd,warningText:getWarningText()}));}).catch((err)=>{if(yieldTimer)clearTimeout(yieldTimer);if(yielded||run.session.backgrounded)return;reject(err);});});}};}

四、执行流程图

exec 工具调用 ↓ 1. 参数验证(command 必填) ↓ 2. 解析后台运行请求(background/yieldMs) ↓ 3. 解析提权请求(elevated) ↓ 4. 确定主机(sandbox/gateway/node) ↓ 5. Gateway 白名单检查 ├─ 需要审批 → 返回 pending 状态,等待用户 /approve └─ 无需审批 → 继续 ↓ 6. 启动进程(runExecProcess) ├─ 创建子进程 ├─ 监听输出 ├─ 记录日志 └─ 返回 session ↓ 7. 判断是否后台运行 ├─ 是 → 立即返回"正在运行",用户可用 process 工具管理 └─ 否 → 等待完成,返回完整输出

五、返回结果格式

前台运行完成

{"content":[{"type":"text","text":"命令输出内容..."}],"details":{"status":"completed","exitCode":0,"cwd":"/path/to/workdir"}}

后台运行中

{"content":[{"type":"text","text":"Command still running (session abc123, pid 12345). Use process (list/poll/log/write/kill/clear/remove) for follow-up."}],"details":{"status":"running","sessionId":"abc123","pid":12345,"startedAt":1711716000000,"cwd":"/path/to/workdir","tail":"部分输出..."}}

需要审批

{"content":[{"type":"text","text":"Approval required (id abc123).\nHost: gateway\nCWD: /workspace\nCommand:\n```sh\nrm -rf /tmp/test\n```\nReply with: /approve abc123 allow-once|allow-always|deny"}],"details":{"status":"pending_approval","approvalId":"abc123"}}

六、参数详解

6.1 必填参数

参数类型说明
commandstring要执行的 shell 命令

6.2 可选参数

参数类型默认值说明
workdirstringcwd工作目录
envobject-环境变量(键值对)
yieldMsnumber10000后台运行等待时间(毫秒)
backgroundbooleanfalse立即后台运行
timeoutnumber1800超时时间(秒)
ptybooleanfalse使用 PTY(TTY 命令需要)
elevatedbooleanfalse提权执行
hoststringsandbox执行主机(sandbox/gateway/node)
securitystringallowlist安全模式(deny/allowlist/full)
askstringon-miss审批模式(off/on-miss/always)
nodestring-节点 ID(host=node 时使用)

七、使用示例

7.1 简单命令

{"name":"exec","arguments":{"command":"ls -la"}}

7.2 后台运行

{"name":"exec","arguments":{"command":"python long_running_script.py","yieldMs":5000}}

7.3 超时控制

{"name":"exec","arguments":{"command":"ping -n 100 www.example.com","timeout":30}}

7.4 PTY 模式

{"name":"exec","arguments":{"command":"htop","pty":true}}

7.5 环境变量

{"name":"exec","arguments":{"command":"echo $MY_VAR","env":{"MY_VAR":"Hello World"}}}

八、安全机制

8.1 安全模式

模式说明
deny禁止所有命令
allowlist只允许白名单中的命令
full允许所有命令(需要提权)

8.2 审批模式

模式说明
off无需审批
on-miss白名单未命中时审批
always总是审批

8.3 提权执行

{"name":"exec","arguments":{"command":"apt update","elevated":true,"host":"gateway"}}

前提条件

  • elevatedDefaults.enabled = true
  • elevatedDefaults.allowed = true

九、配套工具

process 工具

exec 的配套工具,用于管理后台进程:

Action说明
list列出所有进程
poll轮询进程状态
log读取进程日志
write写入 stdin
send-keys发送按键
paste粘贴文本
submit发送 EOF
kill终止进程

如果文章对你有帮助,请点个“关注”

http://www.jsqmd.com/news/614765/

相关文章:

  • GraalVM Native Image安全性加固实战:5步完成TLS/反射/动态代理全链路可信验证,规避97.3% CVE-2023类漏洞
  • 如何配置表结构支持读写分离标记_在COMMENT中添加路由规则的架构级应用
  • 2026届必备的六大降重复率工具推荐
  • RPC数据集整理与 Scalabel 标注说明
  • AI Agent Harness Engineering 任务失败率过高?一文教你设计自愈与补偿机制
  • Java自动化生成Mapbox-GL雪碧图及JSON配置实战指南
  • 「码动四季·开源同行」轻量级k8s:适配边缘计算场景的轻量级的k8s-k3s入门与实战
  • 2026 行李箱横评|5 款实测数据,百元到千元怎么选
  • 向量嵌入性能骤降70%?EF Core 10 + ANN索引配置错误全解析,含官方未文档化AsVectorSearch()调用约束
  • IT产品标准化实战手册及注意事项
  • 代码之外周刊(第期):当技术让一切趋同,我们还剩什么?钠
  • 转行网安别死磕技术!合规才是企业刚需,运维转更易上岸
  • 20260408紫题训练 - Link
  • SQL中如何处理多重嵌套的字符串:函数嵌套调用技巧
  • SDMatte与数据库联动:开发一个带历史记录管理的在线抠图平台
  • AI Agent Harness Engineering 审计体系建设:Agent全行为的可追溯与可审计
  • Spring Boot 4.0 Agent-Ready 架构:从@ConditionalOnAgentEnabled注解到RuntimeMXBean探针注册的7步精准控制流
  • ESPS USB MSC 调试全过程记录拓
  • 免费降AIGC工具实测整理,论文过审再也不用愁!
  • 备考崩溃?这1个APP解决托福阅读三大噩梦:词汇、长难句、时间不够 - 速递信息
  • 项目介绍 MATLAB实现基于SSA-LSTM麻雀搜索算法(SSA)优化长短期记忆网络(LSTM)进行多变量时间序列光伏功率预测的详细项目实例(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点
  • mysql安装后忘记root密码如何找回_单用户模式重置密码方法
  • .NET 诊断技巧 | 日志框架原理、手写日志框架学习尉
  • DeepSeek-R1-Distill-Qwen-7B多场景落地:Ollama本地部署后用于周报生成、会议纪要提炼、邮件润色
  • 买家拍了一张带日文说明书的照片来问问题,客服看不懂怎么办?图片翻译工具实测
  • 【PHP大文件处理终极指南】:20年老司机亲授10种零内存溢出实战方案
  • 2026年热门雅思口语APP推荐:多次元雅思APP领跑,口语串题+AI精准评分成制胜关键 - 速递信息
  • 不会写C也能玩 eBPF?用 Python 打开内核观测的大门
  • 从听不懂到听力8分,我的秘密武器是多次元雅思APP的精听三步法 - 速递信息
  • SteamAchievementManager完全指南:从入门到精通