Tools
เครื่องมือ Exec
รันคำสั่งเชลล์ในเวิร์กสเปซ รองรับการรันแบบ foreground + background ผ่าน process
หากไม่อนุญาตให้ใช้ process exec จะรันแบบซิงโครนัสและละเว้น yieldMs/background
เซสชัน background มีขอบเขตต่อ agent; process จะเห็นเฉพาะเซสชันจาก agent เดียวกันเท่านั้น
พารามิเตอร์
commandstringrequiredคำสั่งเชลล์ที่จะรัน
workdirstringไดเรกทอรีทำงานสำหรับคำสั่ง
envobjectการ override สภาพแวดล้อมแบบคีย์/ค่าที่ merge ทับบนสภาพแวดล้อมที่สืบทอดมา
yieldMsnumberย้ายคำสั่งไปเป็น background โดยอัตโนมัติหลังจากดีเลย์นี้ (ms)
backgroundbooleanย้ายคำสั่งไปเป็น background ทันทีแทนการรอ yieldMs
timeoutnumberOverride การหมดเวลา exec ที่กำหนดค่าไว้สำหรับการเรียกนี้ ตั้ง timeout: 0 เฉพาะเมื่อคำสั่งควรรันโดยไม่มีการหมดเวลาของกระบวนการ exec
ptybooleanรันใน pseudo-terminal เมื่อพร้อมใช้งาน ใช้สำหรับ CLI ที่ต้องใช้ TTY เท่านั้น, coding agents และ UI เทอร์มินัล
host'auto' | 'sandbox' | 'gateway' | 'node'ตำแหน่งที่จะรัน auto resolve เป็น sandbox เมื่อ sandbox runtime ทำงานอยู่ และเป็น gateway ในกรณีอื่น
security'deny' | 'allowlist' | 'full'โหมดการบังคับใช้สำหรับการรัน gateway / node
ask'off' | 'on-miss' | 'always'พฤติกรรมพรอมป์ขออนุมัติสำหรับการรัน gateway / node
nodestringid/name ของ Node เมื่อ host=node
elevatedbooleanขอโหมด elevated — ออกจาก sandbox ไปยัง path โฮสต์ที่กำหนดค่าไว้ security=full จะถูกบังคับใช้เฉพาะเมื่อ elevated resolve เป็น full
หมายเหตุ:
hostมีค่าเริ่มต้นเป็นauto: sandbox เมื่อ sandbox runtime ทำงานอยู่สำหรับเซสชัน มิฉะนั้นเป็น Gatewayhostรับได้เฉพาะauto,sandbox,gatewayหรือnodeเท่านั้น ไม่ใช่ตัวเลือก hostname; ค่าที่มีลักษณะเหมือน hostname จะถูกปฏิเสธก่อนคำสั่งรันautoคือกลยุทธ์ routing เริ่มต้น ไม่ใช่ wildcard อนุญาตให้ใช้host=nodeรายการต่อครั้งจากauto; อนุญาตให้ใช้host=gatewayรายการต่อครั้งเฉพาะเมื่อไม่มี sandbox runtime ทำงานอยู่- เมื่อไม่มี config เพิ่มเติม
host=autoก็ยัง "ใช้งานได้ทันที": ไม่มี sandbox หมายถึง resolve เป็นgateway; sandbox ที่ทำงานอยู่หมายถึงยังอยู่ใน sandbox elevatedออกจาก sandbox ไปยัง path โฮสต์ที่กำหนดค่าไว้: โดยค่าเริ่มต้นคือgatewayหรือnodeเมื่อtools.exec.host=node(หรือค่าเริ่มต้นของเซสชันคือhost=node) ใช้งานได้เฉพาะเมื่อเปิดใช้สิทธิ์ elevated สำหรับเซสชัน/ผู้ให้บริการปัจจุบัน- การอนุมัติ
gateway/nodeถูกควบคุมโดย~/.openclaw/exec-approvals.json nodeต้องมี node ที่จับคู่แล้ว (แอป companion หรือ headless node host)- หากมีหลาย node พร้อมใช้งาน ให้ตั้ง
exec.nodeหรือtools.exec.nodeเพื่อเลือกหนึ่งรายการ exec host=nodeเป็น path การรันเชลล์เดียวสำหรับ node; wrapper เดิมnodes.runถูกลบแล้วtimeoutใช้กับการรัน foreground, background,yieldMs, Gateway, sandbox และ Nodesystem.runหากละไว้ OpenClaw จะใช้tools.exec.timeoutSec;timeout: 0แบบระบุชัดจะปิดการหมดเวลาของกระบวนการ exec สำหรับการเรียกนั้น- บนโฮสต์ที่ไม่ใช่ Windows exec จะใช้
SHELLเมื่อมีการตั้งค่าไว้; หากSHELLเป็นfishจะเลือกใช้bash(หรือsh) จากPATHเพื่อหลีกเลี่ยงสคริปต์ที่ไม่เข้ากันกับ fish แล้วจึง fallback เป็นSHELLหากไม่มีทั้งสองรายการ - บนโฮสต์ Windows exec จะเลือกการค้นหา PowerShell 7 (
pwsh) ก่อน (Program Files, ProgramW6432 แล้วจึง PATH), แล้วจึง fallback เป็น Windows PowerShell 5.1 - การรันบนโฮสต์ (
gateway/node) ปฏิเสธenv.PATHและ loader overrides (LD_*/DYLD_*) เพื่อ ป้องกันการ hijack ไบนารีหรือโค้ดที่ถูก inject - OpenClaw ตั้ง
OPENCLAW_SHELL=execในสภาพแวดล้อมของคำสั่งที่ spawn ขึ้นมา (รวมถึงการรัน PTY และ sandbox) เพื่อให้กฎ shell/profile ตรวจจับบริบทของ exec-tool ได้ openclaw channels loginถูกบล็อกจากexecเพราะเป็น flow การยืนยันตัวตน channel แบบ interactive; ให้รันในเทอร์มินัลบน Gateway host หรือใช้เครื่องมือ login แบบ channel-native จากแชตเมื่อมี- สำคัญ: sandboxing ปิดโดยค่าเริ่มต้น หาก sandboxing ปิดอยู่
host=autoแบบ implicit จะ resolve เป็นgatewayส่วนhost=sandboxแบบ explicit ยังจะ fail closed แทนการ รันอย่างเงียบ ๆ บน Gateway host ให้เปิดใช้ sandboxing หรือใช้host=gatewayพร้อมการอนุมัติ - การตรวจ preflight ของสคริปต์ (สำหรับข้อผิดพลาดไวยากรณ์เชลล์ Python/Node ที่พบบ่อย) ตรวจเฉพาะไฟล์ภายใน
ขอบเขต
workdirที่มีผล หาก path สคริปต์ resolve ออกนอกworkdirpreflight จะถูกข้ามสำหรับ ไฟล์นั้น - สำหรับงานที่รันนานซึ่งเริ่มตอนนี้ ให้เริ่มครั้งเดียวและพึ่งการปลุกเมื่อเสร็จสิ้นโดยอัตโนมัติ
เมื่อเปิดใช้งานอยู่และคำสั่งปล่อย output หรือ fail
ใช้
processสำหรับ log, สถานะ, input หรือการแทรกแซง; อย่าจำลอง scheduling ด้วย sleep loops, timeout loops หรือการ polling ซ้ำ - สำหรับงานที่ควรเกิดขึ้นภายหลังหรือตามกำหนดเวลา ให้ใช้ Cron แทนรูปแบบ sleep/delay ของ
exec
Config
tools.exec.notifyOnExit(ค่าเริ่มต้น: true): เมื่อเป็น true เซสชัน exec ที่ถูก background จะ enqueue system event และขอ Heartbeat เมื่อออกtools.exec.approvalRunningNoticeMs(ค่าเริ่มต้น: 10000): emit notice "running" หนึ่งครั้งเมื่อ exec ที่ต้องผ่าน approval gate รันนานกว่านี้ (0 ปิดใช้งาน)tools.exec.timeoutSec(ค่าเริ่มต้น: 1800): การหมดเวลา exec เริ่มต้นต่อคำสั่งในหน่วยวินาทีtimeoutแบบ per-call จะ override ค่านี้;timeout: 0แบบ per-call จะปิดการหมดเวลาของกระบวนการ exectools.exec.host(ค่าเริ่มต้น:auto; resolve เป็นsandboxเมื่อ sandbox runtime ทำงานอยู่, เป็นgatewayในกรณีอื่น)tools.exec.security(ค่าเริ่มต้น:denyสำหรับ sandbox,fullสำหรับ Gateway + Node เมื่อไม่ได้ตั้งค่า)tools.exec.ask(ค่าเริ่มต้น:off)- exec บนโฮสต์แบบไม่ต้องอนุมัติเป็นค่าเริ่มต้นสำหรับ Gateway + Node หากคุณต้องการพฤติกรรม approvals/allowlist ให้เข้มงวดทั้ง
tools.exec.*และ~/.openclaw/exec-approvals.jsonของโฮสต์; ดู การอนุมัติ Exec - YOLO มาจากค่าเริ่มต้นของ host-policy (
security=full,ask=off) ไม่ใช่จากhost=autoหากคุณต้องการบังคับ routing ไปยัง Gateway หรือ Node ให้ตั้งtools.exec.hostหรือใช้/exec host=... - ในโหมด
security=fullบวกask=offhost exec จะทำตาม policy ที่กำหนดค่าไว้โดยตรง; ไม่มีชั้น prefilter เพิ่มเติมแบบ heuristic สำหรับการ obfuscate คำสั่งหรือชั้นปฏิเสธ script-preflight tools.exec.node(ค่าเริ่มต้น: unset)tools.exec.strictInlineEval(ค่าเริ่มต้น: false): เมื่อเป็น true รูปแบบ inline interpreter eval เช่นpython -c,node -e,ruby -e,perl -e,php -r,lua -eและosascript -eต้องขออนุมัติแบบ explicit เสมอallow-alwaysยังสามารถ persist การเรียก interpreter/script ที่ปลอดภัยได้ แต่รูปแบบ inline-eval ยังจะ prompt ทุกครั้งtools.exec.pathPrepend: รายการไดเรกทอรีที่จะ prepend ให้PATHสำหรับการรัน exec (เฉพาะ Gateway + sandbox)tools.exec.safeBins: safe binaries แบบ stdin-only ที่สามารถรันได้โดยไม่ต้องมีรายการ allowlist แบบ explicit สำหรับรายละเอียดพฤติกรรม ดู Safe binstools.exec.safeBinTrustedDirs: ไดเรกทอรี explicit เพิ่มเติมที่ trust สำหรับการตรวจ path ของsafeBinsรายการPATHจะไม่ถูก trust อัตโนมัติ ค่าเริ่มต้นในตัวคือ/binและ/usr/bintools.exec.safeBinProfiles: policy argv ที่กำหนดเองแบบไม่บังคับต่อ safe bin (minPositional,maxPositional,allowedValueFlags,deniedFlags)
ตัวอย่าง:
{
tools: {
exec: {
pathPrepend: ["~/bin", "/opt/oss/bin"],
},
},
}
การจัดการ PATH
host=gateway: mergePATHของ login-shell ของคุณเข้ากับสภาพแวดล้อม exec การ overrideenv.PATHจะถูกปฏิเสธสำหรับการรันบนโฮสต์ ตัว daemon เองยังคงรันด้วยPATHขั้นต่ำ:- macOS:
/opt/homebrew/bin,/usr/local/bin,/usr/bin,/bin - Linux:
/usr/local/bin,/usr/bin,/bin
- macOS:
host=sandbox: รันsh -lc(login shell) ภายในคอนเทนเนอร์ ดังนั้น/etc/profileอาจรีเซ็ตPATHOpenClaw prependenv.PATHหลังจาก profile sourcing ผ่าน env var ภายใน (ไม่มี shell interpolation);tools.exec.pathPrependใช้ที่นี่เช่นกันhost=node: เฉพาะ env overrides ที่ไม่ถูกบล็อกซึ่งคุณส่งมาเท่านั้นที่จะถูกส่งไปยัง node การ overrideenv.PATHจะถูกปฏิเสธสำหรับการรันบนโฮสต์และถูกละเว้นโดย node hosts หากคุณต้องการรายการ PATH เพิ่มเติมบน node ให้กำหนดค่าสภาพแวดล้อมของบริการ node host (systemd/launchd) หรือติดตั้งเครื่องมือในตำแหน่งมาตรฐาน
การผูก node ต่อ agent (ใช้ดัชนีรายการ agent ใน config):
openclaw config get agents.list
openclaw config set agents.list[0].tools.exec.node "node-id-or-name"
Control UI: แท็บ Nodes มีแผง "Exec node binding" ขนาดเล็กสำหรับการตั้งค่าเดียวกัน
การ override เซสชัน (/exec)
ใช้ /exec เพื่อตั้งค่าเริ่มต้น ต่อเซสชัน สำหรับ host, security, ask และ node
ส่ง /exec โดยไม่มี argument เพื่อแสดงค่าปัจจุบัน
ตัวอย่าง:
/exec host=auto security=allowlist ask=on-miss node=mac-1
โมเดลการอนุญาต
/exec จะถูก honor เฉพาะสำหรับ ผู้ส่งที่ได้รับอนุญาต (allowlists/pairing ของ channel บวก commands.useAccessGroups)
โดยอัปเดต สถานะเซสชันเท่านั้น และไม่เขียน config หากต้องการปิด exec แบบถาวร ให้ deny ผ่าน tool
policy (tools.deny: ["exec"] หรือต่อ agent) การอนุมัติบนโฮสต์ยังคงมีผล เว้นแต่คุณตั้ง
security=full และ ask=off อย่าง explicit
การอนุมัติ Exec (companion app / node host)
agent ที่อยู่ใน sandbox สามารถกำหนดให้ต้องมีการอนุมัติรายคำขอก่อนที่ exec จะรันบน Gateway หรือ node host
ดู การอนุมัติ Exec สำหรับ policy, allowlist และ UI flow
เมื่อต้องมีการอนุมัติ เครื่องมือ exec จะส่งกลับทันทีด้วย
status: "approval-pending" และ approval id เมื่อได้รับอนุมัติ (หรือถูกปฏิเสธ / หมดเวลา)
Gateway จะ emit system events (Exec finished / Exec denied) หากคำสั่งยังคง
รันอยู่หลัง tools.exec.approvalRunningNoticeMs จะ emit notice Exec running หนึ่งครั้ง
บน channels ที่มี native approval cards/buttons agent ควรพึ่งพา
native UI นั้นก่อน และใส่คำสั่ง /approve แบบ manual เฉพาะเมื่อผลลัพธ์ของเครื่องมือ
บอกอย่าง explicit ว่า chat approvals ไม่พร้อมใช้งาน หรือ manual approval เป็น
path เดียวเท่านั้น
Allowlist + safe bins
การบังคับใช้ allowlist แบบ manual จะจับคู่ glob ของ path ไบนารีที่ resolve แล้วและ glob
ชื่อคำสั่งเปล่า ชื่อเปล่าจะจับคู่เฉพาะคำสั่งที่เรียกผ่าน PATH ดังนั้น rg สามารถจับคู่
/opt/homebrew/bin/rg ได้เมื่อคำสั่งคือ rg แต่ไม่ใช่ ./rg หรือ /tmp/rg
เมื่อ security=allowlist คำสั่งเชลล์จะถูก auto-allow เฉพาะเมื่อ pipeline
ทุก segment อยู่ใน allowlist หรือเป็น safe bin การ chaining (;, &&, ||) และ redirections
จะถูกปฏิเสธในโหมด allowlist เว้นแต่ segment ระดับบนสุดทุก segment จะเป็นไปตาม
allowlist (รวมถึง safe bins) Redirections ยังไม่รองรับ
trust แบบ durable allow-always ไม่ bypass กฎนั้น: คำสั่งที่ chain ยังต้องให้ทุก
segment ระดับบนสุดตรงกัน
autoAllowSkills เป็น path อำนวยความสะดวกแยกต่างหากใน exec approvals ไม่เหมือนกับ
รายการ allowlist path แบบ manual สำหรับ trust แบบ explicit ที่เข้มงวด ให้ปิดใช้งาน autoAllowSkills ไว้
ใช้ control ทั้งสองสำหรับงานที่ต่างกัน:
tools.exec.safeBins: stream filters ขนาดเล็กแบบ stdin-onlytools.exec.safeBinTrustedDirs: ไดเรกทอรี trusted เพิ่มเติมแบบ explicit สำหรับ path executable ของ safe-bintools.exec.safeBinProfiles: policy argv แบบ explicit สำหรับ custom safe bins- allowlist: trust แบบ explicit สำหรับ path executable
อย่าใช้ safeBins เป็นรายการอนุญาตทั่วไป และอย่าเพิ่มไบนารีของ interpreter/runtime (เช่น python3, node, ruby, bash) หากคุณต้องใช้สิ่งเหล่านั้น ให้ใช้รายการอนุญาตแบบชัดเจนและเปิดใช้พรอมป์การอนุมัติไว้
openclaw security audit จะเตือนเมื่อรายการ safeBins ของ interpreter/runtime ไม่มีโปรไฟล์ที่ชัดเจน และ openclaw doctor --fix สามารถสร้างโครงรายการ safeBinProfiles แบบกำหนดเองที่ขาดอยู่ได้
openclaw security audit และ openclaw doctor จะเตือนด้วยเมื่อคุณเพิ่ม bin ที่มีพฤติกรรมกว้าง เช่น jq กลับเข้าไปใน safeBins อย่างชัดเจน
หากคุณอนุญาต interpreter อย่างชัดเจน ให้เปิดใช้ tools.exec.strictInlineEval เพื่อให้รูปแบบ inline code-eval ยังคงต้องขออนุมัติใหม่
สำหรับรายละเอียดนโยบายและตัวอย่างทั้งหมด โปรดดู การอนุมัติ Exec และ Safe bins เทียบกับรายการอนุญาต
ตัวอย่าง
เบื้องหน้า:
{ "tool": "exec", "command": "ls -la" }
พื้นหลัง + poll:
{"tool":"exec","command":"npm run build","yieldMs":1000}
{"tool":"process","action":"poll","sessionId":"<id>"}
การ poll ใช้สำหรับสถานะตามคำขอ ไม่ใช่ลูปรอ หากเปิดใช้การปลุกเมื่อเสร็จสิ้นอัตโนมัติ คำสั่งสามารถปลุกเซสชันเมื่อมีเอาต์พุตหรือทำงานล้มเหลว
ส่งคีย์ (รูปแบบ tmux):
{"tool":"process","action":"send-keys","sessionId":"<id>","keys":["Enter"]}
{"tool":"process","action":"send-keys","sessionId":"<id>","keys":["C-c"]}
{"tool":"process","action":"send-keys","sessionId":"<id>","keys":["Up","Up","Enter"]}
ส่ง (ส่งเฉพาะ CR):
{ "tool": "process", "action": "submit", "sessionId": "<id>" }
วาง (มี bracketed เป็นค่าเริ่มต้น):
{ "tool": "process", "action": "paste", "sessionId": "<id>", "text": "line1\nline2\n" }
apply_patch
apply_patch เป็นเครื่องมือย่อยของ exec สำหรับการแก้ไขหลายไฟล์แบบมีโครงสร้าง
เปิดใช้เป็นค่าเริ่มต้นสำหรับโมเดล OpenAI และ OpenAI Codex ใช้ config เฉพาะ
เมื่อคุณต้องการปิดใช้หรือจำกัดให้ใช้กับโมเดลที่ระบุเท่านั้น:
{
tools: {
exec: {
applyPatch: { workspaceOnly: true, allowModels: ["gpt-5.5"] },
},
},
}
หมายเหตุ:
- ใช้ได้เฉพาะกับโมเดล OpenAI/OpenAI Codex
- นโยบายเครื่องมือยังคงมีผล;
allow: ["write"]จะอนุญาตapply_patchโดยนัย deny: ["write"]ไม่ได้ปฏิเสธapply_patch; ให้ปฏิเสธapply_patchอย่างชัดเจน หรือใช้deny: ["group:fs"]เมื่อต้องการบล็อกการเขียนของ patch ด้วย- Config อยู่ใต้
tools.exec.applyPatch tools.exec.applyPatch.enabledมีค่าเริ่มต้นเป็นtrue; ตั้งเป็นfalseเพื่อปิดใช้เครื่องมือนี้สำหรับโมเดล OpenAItools.exec.applyPatch.workspaceOnlyมีค่าเริ่มต้นเป็นtrue(จำกัดอยู่ใน workspace) ตั้งเป็นfalseเฉพาะเมื่อคุณตั้งใจให้apply_patchเขียน/ลบนอกไดเรกทอรี workspace
ที่เกี่ยวข้อง
- การอนุมัติ Exec — เกตการอนุมัติสำหรับคำสั่ง shell
- Sandboxing — การรันคำสั่งในสภาพแวดล้อมแบบ sandbox
- กระบวนการพื้นหลัง — exec ที่ทำงานนานและเครื่องมือ process
- ความปลอดภัย — นโยบายเครื่องมือและการเข้าถึงที่ยกระดับ