เครื่องมือ Exec¶
รันคำสั่งเชลล์ในเวิร์กสเปซ รองรับการรันแบบโฟร์กราวด์และแบ็กกราวด์ผ่าน process. Supports foreground + background execution via process.
หาก process ไม่ได้รับอนุญาต exec จะรันแบบซิงโครนัสและเพิกเฉยต่อ yieldMs/background.
เซสชันแบ็กกราวด์ถูกจำกัดขอบเขตต่อเอเจนต์; process จะเห็นเฉพาะเซสชันจากเอเจนต์เดียวกันเท่านั้น.
พารามิเตอร์¶
command(จำเป็น)workdir(ค่าเริ่มต้นคือ cwd)env(การแทนที่แบบคีย์/ค่า)yieldMs(ค่าเริ่มต้น 10000): เปลี่ยนเป็นแบ็กกราวด์อัตโนมัติหลังดีเลย์background(บูลีน): เข้าสู่แบ็กกราวด์ทันทีtimeout(วินาที, ค่าเริ่มต้น 1800): ฆ่ากระบวนการเมื่อหมดอายุpty(บูลีน): รันใน pseudo-terminal เมื่อมี (CLI ที่ต้องใช้ TTY, เอเจนต์โค้ดดิ้ง, UI แบบเทอร์มินัล)host(sandbox | gateway | node): ตำแหน่งที่จะรันsecurity(deny | allowlist | full): โหมดบังคับใช้สำหรับgateway/nodeask(off | on-miss | always): พรอมป์ตการอนุมัติสำหรับgateway/nodenode(สตริง): node id/name สำหรับhost=nodeelevated(บูลีน): ขอใช้โหมดสิทธิ์สูง (gateway host);security=fullจะถูกบังคับใช้เฉพาะเมื่อการยกระดับแก้ไขเป็นfull
หมายเหตุ:
hostมีค่าเริ่มต้นเป็นsandbox.elevatedจะถูกเพิกเฉยเมื่อ sandboxing ปิดอยู่ (exec รันบนโฮสต์อยู่แล้ว).- การอนุมัติ
gateway/nodeถูกควบคุมโดย~/.openclaw/exec-approvals.json. nodeต้องการโหนดที่จับคู่แล้ว (แอปคู่หูหรือโฮสต์โหนดแบบ headless).- หากมีหลายโหนด ให้ตั้งค่า
exec.nodeหรือtools.exec.nodeเพื่อเลือกหนึ่งโหนด. - บนโฮสต์ที่ไม่ใช่ Windows exec จะใช้
SHELLเมื่อมีการตั้งค่า; หากSHELLเป็นfishจะให้ความสำคัญกับbash(หรือsh) จากPATHเพื่อหลีกเลี่ยงสคริปต์ที่ไม่เข้ากันกับ fish จากนั้นจะถอยกลับไปใช้SHELLหากไม่มีทั้งสอง. - การรันบนโฮสต์ (
gateway/node) จะปฏิเสธenv.PATHและการแทนที่ตัวโหลด (LD_*/DYLD_*) เพื่อ ป้องกันการไฮแจ็กไบนารีหรือการฉีดโค้ด. - สำคัญ: sandboxing ปิดเป็นค่าเริ่มต้น. หาก sandboxing ปิดอยู่
host=sandboxจะรันโดยตรงบน โฮสต์Gateway (ไม่มีคอนเทนเนอร์) และ ไม่ต้องขอการอนุมัติ. หากต้องการบังคับให้ต้องขอการอนุมัติ ให้รันด้วยhost=gatewayและกำหนดค่าการอนุมัติ exec (หรือเปิดใช้งาน sandboxing).
คอนฟิก¶
tools.exec.notifyOnExit(ค่าเริ่มต้น: true): เมื่อเป็น true เซสชัน exec ที่ถูกส่งไปแบ็กกราวด์จะจัดคิวอีเวนต์ระบบและร้องขอฮาร์ตบีตเมื่อจบการทำงาน.tools.exec.approvalRunningNoticeMs(ค่าเริ่มต้น: 10000): ส่งการแจ้งเตือน “running” เพียงครั้งเดียวเมื่อ exec ที่ต้องผ่านการอนุมัติทำงานนานกว่าค่านี้ (0 คือปิดใช้งาน).tools.exec.host(ค่าเริ่มต้น:sandbox)tools.exec.security(ค่าเริ่มต้น:denyสำหรับ sandbox,allowlistสำหรับ gateway + node เมื่อไม่ได้ตั้งค่า)tools.exec.ask(ค่าเริ่มต้น:on-miss)tools.exec.node(ค่าเริ่มต้น: unset)tools.exec.pathPrepend: รายการไดเรกทอรีที่จะนำหน้าPATHสำหรับการรัน exec.tools.exec.safeBins: ไบนารีที่ปลอดภัยแบบ stdin-only ซึ่งสามารถรันได้โดยไม่ต้องมีรายการอนุญาตแบบชัดเจน.
ตัวอย่าง:
{
tools: {
exec: {
pathPrepend: ["~/bin", "/opt/oss/bin"],
},
},
}
การจัดการ PATH¶
host=gateway: รวมPATHของเชลล์ล็อกอินของคุณเข้ากับสภาพแวดล้อม exec. การแทนที่env.PATHจะถูกปฏิเสธสำหรับการรันบนโฮสต์. ตัวเดมอนเองยังคงรันด้วยPATHแบบขั้นต่ำ:- macOS:
/opt/homebrew/bin,/usr/local/bin,/usr/bin,/bin - Linux:
/usr/local/bin,/usr/bin,/bin host=sandbox: รันsh -lc(เชลล์ล็อกอิน) ภายในคอนเทนเนอร์ ดังนั้น/etc/profileอาจรีเซ็ตPATH. OpenClaw จะนำหน้าenv.PATHหลังจากโหลดโปรไฟล์ผ่านตัวแปรสภาพแวดล้อมภายใน (ไม่มีการอินเทอร์โพเลตของเชลล์);tools.exec.pathPrependใช้กับกรณีนี้ด้วย.host=node: จะส่งเฉพาะการแทนที่ env ที่ไม่ถูกบล็อกซึ่งคุณระบุไปยังโหนด. การแทนที่env.PATHจะถูกปฏิเสธสำหรับการรันบนโฮสต์. โฮสต์โหนดแบบ headless จะยอมรับPATHเฉพาะเมื่อเป็นการนำหน้า PATH ของโฮสต์โหนด (ไม่ใช่การแทนที่). โหนด macOS จะทิ้งการแทนที่PATHทั้งหมด.
การผูกโหนดต่อเอเจนต์ (ใช้ดัชนีรายชื่อเอเจนต์ในคอนฟิก):
openclaw config get agents.list
openclaw config set agents.list[0].tools.exec.node "node-id-or-name"
UI สำหรับควบคุม: แท็บ Nodes มีแผงเล็ก “Exec node binding” สำหรับการตั้งค่าเดียวกัน.
การแทนที่ระดับเซสชัน (/exec)¶
ใช้ /exec เพื่อกำหนดค่าเริ่มต้น ต่อเซสชัน สำหรับ host, security, ask และ node.
ส่ง /exec โดยไม่ใส่อาร์กิวเมนต์เพื่อแสดงค่าปัจจุบัน.
ตัวอย่าง:
/exec host=gateway security=allowlist ask=on-miss node=mac-1
โมเดลการให้สิทธิ์¶
/exec จะมีผลเฉพาะกับ ผู้ส่งที่ได้รับอนุญาต (allowlist ของช่องทาง/การจับคู่ พร้อม commands.useAccessGroups).
การตั้งค่านี้จะอัปเดต เฉพาะสถานะเซสชัน และไม่เขียนคอนฟิก. หากต้องการปิดใช้งาน exec แบบถาวร ให้ปฏิเสธผ่านนโยบายเครื่องมือ
(tools.deny: ["exec"] หรือระดับต่อเอเจนต์). การอนุมัติบนโฮสต์ยังคงมีผล เว้นแต่คุณจะตั้งค่า
security=full และ ask=off อย่างชัดเจน.
การอนุมัติ Exec (แอปคู่หู / โฮสต์โหนด)¶
เอเจนต์ที่อยู่ใน sandbox สามารถกำหนดให้ต้องขอการอนุมัติต่อคำขอก่อนที่ exec จะรันบนโฮสต์Gatewayหรือโฮสต์โหนด.
ดู Exec approvals สำหรับนโยบาย allowlist และโฟลว์ UI.
When approvals are required, the exec tool returns immediately with
status: "approval-pending" and an approval id. เมื่อจำเป็นต้องขอการอนุมัติ เครื่องมือ exec จะส่งกลับทันทีพร้อม
status: "approval-pending" และรหัสการอนุมัติ เมื่อได้รับการอนุมัติ (หรือถูกปฏิเสธ/หมดเวลา),
Gateway จะปล่อยอีเวนต์ระบบ (Exec finished / Exec denied). หากคำสั่งยังคง
ทำงานหลังจาก tools.exec.approvalRunningNoticeMs จะมีการแจ้งเตือน Exec running เพียงครั้งเดียว.
รายการที่อนุญาต + ไบนารีที่ปลอดภัย¶
การบังคับใช้ allowlist จะจับคู่เฉพาะ พาธไบนารีที่ถูก resolve แล้วเท่านั้น (ไม่จับคู่จากชื่อฐาน). เมื่อ
security=allowlist คำสั่งเชลล์จะถูกอนุญาตอัตโนมัติเฉพาะเมื่อทุกส่วนของ pipeline อยู่ใน allowlist หรือเป็น safe bin. การเชื่อมคำสั่ง (;, &&, ||) และการรีไดเร็กต์จะถูกปฏิเสธในโหมด allowlist.
ตัวอย่าง¶
เบื้องหน้า:
{ "tool": "exec", "command": "ls -la" }
เบื้องหลัง + การโพล:
{"tool":"exec","command":"npm run build","yieldMs":1000}
{"tool":"process","action":"poll","sessionId":"<id>"}
ส่งคีย์ (สไตล์ 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>" }
วาง (มีวงเล็บครอบโดยค่าเริ่มต้น):
{ "tool": "process", "action": "paste", "sessionId": "<id>", "text": "line1\nline2\n" }
apply_patch (ทดลอง)¶
apply_patch เป็นซับทูลของ exec สำหรับการแก้ไขหลายไฟล์แบบมีโครงสร้าง.
ต้องเปิดใช้งานอย่างชัดเจน:
{
tools: {
exec: {
applyPatch: { enabled: true, allowModels: ["gpt-5.2"] },
},
},
}
หมายเหตุ:
- ใช้ได้เฉพาะกับโมเดล OpenAI/OpenAI Codex เท่านั้น.
- นโยบายเครื่องมือยังคงมีผล;
allow: ["exec"]อนุญาตapply_patchโดยปริยาย. - คอนฟิกอยู่ภายใต้
tools.exec.applyPatch.