Tools
เครื่องมือเรียกใช้คำสั่ง
เรียกใช้คำสั่งเชลล์ในพื้นที่ทำงาน exec เป็นพื้นผิวเชลล์ที่เปลี่ยนแปลงได้: คำสั่งสามารถสร้าง แก้ไข หรือลบไฟล์ได้ทุกที่ที่โฮสต์หรือระบบไฟล์ sandbox ที่เลือกอนุญาต การปิดใช้งานเครื่องมือระบบไฟล์ของ OpenClaw เช่น write, edit หรือ apply_patch ไม่ได้ทำให้ exec เป็นแบบอ่านอย่างเดียว
รองรับการทำงานแบบ foreground + background ผ่าน process หากไม่อนุญาต process แล้ว exec จะทำงานแบบซิงโครนัสและละเว้น yieldMs/background
เซสชัน background ถูกจำกัดขอบเขตต่อ agent; process จะเห็นเฉพาะเซสชันจาก agent เดียวกันเท่านั้น
พารามิเตอร์
commandstringrequiredคำสั่งเชลล์ที่จะเรียกใช้
workdirstringdefault: cwdไดเรกทอรีทำงานสำหรับคำสั่ง
envobjectการแทนที่สภาพแวดล้อมแบบคีย์/ค่าที่ผสานทับบนสภาพแวดล้อมที่สืบทอดมา
yieldMsnumberdefault: 10000ส่งคำสั่งไป background โดยอัตโนมัติหลังจากหน่วงเวลานี้ (ms)
backgroundbooleandefault: falseส่งคำสั่งไป background ทันทีแทนที่จะรอ yieldMs
timeoutnumberdefault: tools.exec.timeoutSecแทนที่ timeout ของ exec ที่กำหนดค่าไว้สำหรับการเรียกนี้ ตั้ง timeout: 0 เฉพาะเมื่อคำสั่งควรทำงานโดยไม่มี timeout ของกระบวนการ exec
ptybooleandefault: falseเรียกใช้ใน pseudo-terminal เมื่อมีให้ใช้ ใช้สำหรับ CLI ที่ต้องใช้ TTY เท่านั้น, coding agents และ terminal UIs
host'auto' | 'sandbox' | 'gateway' | 'node'default: autoตำแหน่งที่จะดำเนินการ auto จะแปลงเป็น sandbox เมื่อมี runtime ของ sandbox ทำงานอยู่ และเป็น gateway ในกรณีอื่น
security'deny' | 'allowlist' | 'full'ถูกละเว้นสำหรับการเรียกเครื่องมือปกติ ความปลอดภัยของ gateway / node ถูกควบคุมโดย
tools.exec.security และ ~/.openclaw/exec-approvals.json; โหมด elevated สามารถ
บังคับ security=full ได้เฉพาะเมื่อ operator ให้สิทธิ์ elevated อย่างชัดเจน
ask'off' | 'on-miss' | 'always'พฤติกรรมพรอมต์ขออนุมัติสำหรับการดำเนินการบน gateway / node
nodestringรหัส/ชื่อ Node เมื่อ host=node
elevatedbooleandefault: falseร้องขอโหมด elevated — ออกจาก sandbox ไปยังพาธโฮสต์ที่กำหนดค่าไว้ security=full จะถูกบังคับเฉพาะเมื่อ elevated แปลงเป็น full
หมายเหตุ:
hostมีค่าเริ่มต้นเป็นauto: ใช้ sandbox เมื่อ runtime ของ sandbox ทำงานอยู่สำหรับเซสชัน ไม่เช่นนั้นใช้ Gatewayhostยอมรับเฉพาะauto,sandbox,gatewayหรือnodeเท่านั้น ไม่ใช่ตัวเลือก hostname; ค่าที่มีลักษณะเหมือน hostname จะถูกปฏิเสธก่อนคำสั่งทำงานautoเป็นกลยุทธ์การกำหนดเส้นทางเริ่มต้น ไม่ใช่ wildcard อนุญาตให้ใช้host=nodeต่อการเรียกจากauto; อนุญาตให้ใช้host=gatewayต่อการเรียกเฉพาะเมื่อไม่มี runtime ของ sandbox ทำงานอยู่- หากไม่มีการกำหนดค่าเพิ่มเติม
host=autoยังคง "ใช้งานได้ทันที": ไม่มี sandbox หมายถึงจะแปลงเป็นgateway; sandbox ที่ทำงานอยู่หมายถึงจะคงอยู่ใน sandbox elevatedออกจาก sandbox ไปยังพาธโฮสต์ที่กำหนดค่าไว้: โดยค่าเริ่มต้นคือgatewayหรือnodeเมื่อtools.exec.host=node(หรือค่าเริ่มต้นของเซสชันคือhost=node) ใช้ได้เฉพาะเมื่อเปิดใช้งานการเข้าถึง elevated สำหรับเซสชัน/provider ปัจจุบัน- การอนุมัติ
gateway/nodeถูกควบคุมโดย~/.openclaw/exec-approvals.json nodeต้องมี Node ที่จับคู่ไว้ (companion app หรือ headless node host)- หากมีหลาย Node ให้ตั้ง
exec.nodeหรือtools.exec.nodeเพื่อเลือกหนึ่งรายการ exec host=nodeเป็นเส้นทางการดำเนินการเชลล์เพียงเส้นทางเดียวสำหรับ Node; wrapper เดิมnodes.runถูกลบออกแล้วtimeoutใช้กับการดำเนินการ foreground, background,yieldMs, Gateway, sandbox และsystem.runของ Node หากละไว้ OpenClaw จะใช้tools.exec.timeoutSec; การระบุtimeout: 0จะปิดใช้งาน timeout ของกระบวนการ 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 (LD_*/DYLD_*) เพื่อ ป้องกันการ hijack ไบนารีหรือโค้ดที่ถูกฉีดเข้ามา - OpenClaw ตั้ง
OPENCLAW_SHELL=execในสภาพแวดล้อมของคำสั่งที่ spawn ขึ้นมา (รวมถึงการดำเนินการ PTY และ sandbox) เพื่อให้กฎ shell/profile ตรวจจับบริบทของเครื่องมือ exec ได้ openclaw channels loginถูกบล็อกจากexecเพราะเป็น flow ยืนยันตัวตนช่องทางแบบโต้ตอบ; ให้เรียกใช้ใน terminal บนโฮสต์ Gateway หรือใช้เครื่องมือ login แบบ native ของช่องทางจากแชตเมื่อมีให้ใช้- สำคัญ: sandboxing ปิดอยู่โดยค่าเริ่มต้น หาก sandboxing ปิดอยู่
host=autoโดยนัย จะแปลงเป็นgatewayการระบุhost=sandboxอย่างชัดเจนจะยังคงล้มเหลวแบบปิดแทนที่จะ ทำงานบนโฮสต์ Gateway อย่างเงียบ ๆ เปิดใช้งาน sandboxing หรือใช้host=gatewayพร้อมการอนุมัติ - การตรวจสอบ preflight ของสคริปต์ (สำหรับข้อผิดพลาด syntax ของเชลล์ Python/Node ที่พบบ่อย) จะตรวจเฉพาะไฟล์ภายใน
ขอบเขต
workdirที่มีผล หากพาธสคริปต์แปลงออกไปนอกworkdirจะข้าม preflight สำหรับ ไฟล์นั้น - สำหรับงานที่ใช้เวลานานซึ่งเริ่มตอนนี้ ให้เริ่มหนึ่งครั้งและพึ่งพาการปลุกเมื่อเสร็จสิ้นโดยอัตโนมัติ
เมื่อเปิดใช้งานและคำสั่งส่งออก output หรือล้มเหลว
ใช้
processสำหรับ log, สถานะ, input หรือการแทรกแซง; อย่าจำลอง การจัดตารางเวลาด้วย sleep loop, timeout loop หรือการ polling ซ้ำ - สำหรับงานที่ควรเกิดขึ้นภายหลังหรือตามตารางเวลา ให้ใช้ Cron แทน
รูปแบบ sleep/delay ของ
exec
การกำหนดค่า
tools.exec.notifyOnExit(ค่าเริ่มต้น: true): เมื่อเป็น true เซสชัน exec ที่ถูกส่งไป background จะ enqueue system event และขอ Heartbeat เมื่อออกtools.exec.approvalRunningNoticeMs(ค่าเริ่มต้น: 10000): ส่ง notice "running" หนึ่งครั้งเมื่อ exec ที่ต้องผ่านการอนุมัติทำงานนานกว่านี้ (0 ปิดใช้งาน)tools.exec.timeoutSec(ค่าเริ่มต้น: 1800): timeout เริ่มต้นต่อคำสั่งของ exec เป็นวินาทีtimeoutต่อการเรียกจะแทนที่ค่านี้;timeout: 0ต่อการเรียกจะปิดใช้งาน timeout ของกระบวนการ exectools.exec.host(ค่าเริ่มต้น:auto; แปลงเป็นsandboxเมื่อ runtime ของ sandbox ทำงานอยู่, เป็น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 มาจากค่าเริ่มต้นของนโยบายโฮสต์ (
security=full,ask=off) ไม่ใช่จากhost=autoหากคุณต้องการบังคับเส้นทาง Gateway หรือ Node ให้ตั้งtools.exec.hostหรือใช้/exec host=... - ในโหมด
security=fullพร้อมask=offexec บนโฮสต์จะทำตามนโยบายที่กำหนดค่าไว้โดยตรง; ไม่มีชั้น prefilter เชิง heuristic สำหรับการอำพรางคำสั่งหรือชั้นปฏิเสธ script-preflight เพิ่มเติม tools.exec.node(ค่าเริ่มต้น: ไม่ได้ตั้งค่า)tools.exec.strictInlineEval(ค่าเริ่มต้น: false): เมื่อเป็น true รูปแบบ inline interpreter eval เช่นpython -c,node -e,ruby -e,perl -e,php -r,lua -eและosascript -eจะต้องขออนุมัติอย่างชัดเจนเสมอallow-alwaysยังสามารถคงการเรียกใช้ interpreter/script ที่ปลอดภัยไว้ได้ แต่รูปแบบ inline-eval จะยังคงพรอมต์ทุกครั้งtools.exec.commandHighlighting(ค่าเริ่มต้น: false): เมื่อเป็น true พรอมต์ขออนุมัติสามารถไฮไลต์ช่วงคำสั่งที่ parser ได้มาจากข้อความคำสั่ง ตั้งเป็นtrueแบบ global หรือต่อ agent เพื่อเปิดใช้งานการไฮไลต์ข้อความคำสั่งโดยไม่เปลี่ยนนโยบายการอนุมัติ exectools.exec.pathPrepend: รายการไดเรกทอรีที่จะเติมไว้หน้าPATHสำหรับการเรียกใช้ exec (เฉพาะ Gateway + sandbox)tools.exec.safeBins: ไบนารีปลอดภัยที่ใช้ stdin เท่านั้นและสามารถทำงานได้โดยไม่ต้องมีรายการ allowlist อย่างชัดเจน สำหรับรายละเอียดพฤติกรรม ดู ไบนารีปลอดภัยtools.exec.safeBinTrustedDirs: ไดเรกทอรีเพิ่มเติมที่เชื่อถืออย่างชัดเจนสำหรับการตรวจสอบพาธของsafeBinsรายการPATHจะไม่ถูกเชื่อถือโดยอัตโนมัติ ค่าเริ่มต้นในตัวคือ/binและ/usr/bintools.exec.safeBinProfiles: นโยบาย argv แบบกำหนดเองที่เป็นตัวเลือกต่อ safe bin (minPositional,maxPositional,allowedValueFlags,deniedFlags)
ตัวอย่าง:
{ tools: { exec: { pathPrepend: ["~/bin", "/opt/oss/bin"], }, },}การจัดการ PATH
host=gateway: ผสานPATHของ login-shell ของคุณเข้าในสภาพแวดล้อม exec การแทนที่env.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) ภายใน container ดังนั้น/etc/profileอาจรีเซ็ตPATHOpenClaw เติมenv.PATHไว้หน้าหลังจาก source profile ผ่าน env var ภายใน (ไม่มี shell interpolation);tools.exec.pathPrependใช้ที่นี่ด้วยhost=node: ส่งเฉพาะ env overrides ที่ไม่ถูกบล็อกซึ่งคุณส่งให้ไปยัง Node การแทนที่env.PATHถูกปฏิเสธสำหรับการดำเนินการบนโฮสต์และถูกละเว้นโดยโฮสต์ Node หากคุณต้องการรายการ PATH เพิ่มเติมบน Node ให้กำหนดค่าสภาพแวดล้อมของบริการโฮสต์ Node (systemd/launchd) หรือติดตั้งเครื่องมือในตำแหน่งมาตรฐาน
การผูก Node ต่อ agent (ใช้ดัชนีรายการ agent ใน config):
openclaw config get agents.listopenclaw config set agents.list[0].tools.exec.node "node-id-or-name"UI ควบคุม: แท็บ Nodes มีแผง "การผูก Exec node" ขนาดเล็กสำหรับการตั้งค่าเดียวกัน
การแทนที่เซสชัน (/exec)
ใช้ /exec เพื่อตั้งค่าเริ่มต้น ต่อเซสชัน สำหรับ host, security, ask และ node
ส่ง /exec โดยไม่มีอาร์กิวเมนต์เพื่อแสดงค่าปัจจุบัน
ตัวอย่าง:
/exec host=auto security=allowlist ask=on-miss node=mac-1โมเดลการอนุญาต
/exec จะถูกใช้เฉพาะกับ ผู้ส่งที่ได้รับอนุญาต (allowlists/การจับคู่ของช่องทาง พร้อม commands.useAccessGroups)
คำสั่งนี้อัปเดต สถานะเซสชันเท่านั้น และไม่เขียน config หากต้องการปิดใช้งาน exec แบบเด็ดขาด ให้ deny ผ่านนโยบายเครื่องมือ
(tools.deny: ["exec"] หรือต่อ agent) การอนุมัติโฮสต์ยังคงมีผล เว้นแต่คุณจะตั้ง
security=full และ ask=off อย่างชัดเจน
การอนุมัติ Exec (companion app / node host)
agent ที่อยู่ใน sandbox สามารถต้องการการอนุมัติต่อคำขอก่อนที่ exec จะทำงานบนโฮสต์ Gateway หรือ Node
ดู การอนุมัติ Exec สำหรับนโยบาย, allowlist และ flow ของ UI
เมื่อจำเป็นต้องมีการอนุมัติ เครื่องมือ exec จะส่งคืนทันทีพร้อม
status: "approval-pending" และรหัสการอนุมัติ เมื่อได้รับอนุมัติแล้ว (หรือถูกปฏิเสธ / หมดเวลา)
Gateway จะส่ง system events (Exec finished / Exec denied) หากคำสั่งยังคง
ทำงานหลังจาก tools.exec.approvalRunningNoticeMs จะส่ง notice Exec running หนึ่งครั้ง
ในช่องทางที่มีการ์ด/ปุ่มอนุมัติแบบ native, agent ควรพึ่งพา
UI native นั้นก่อน และรวมคำสั่ง /approve แบบ manual เฉพาะเมื่อผลลัพธ์ของเครื่องมือ
ระบุอย่างชัดเจนว่า chat approvals ไม่พร้อมใช้งาน หรือ manual approval เป็น
เส้นทางเดียวเท่านั้น
Allowlist + ไบนารีปลอดภัย
การบังคับใช้ allowlist แบบ manual จะจับคู่ glob ของพาธไบนารีที่ resolve แล้วและ glob ของชื่อคำสั่งล้วน
ชื่อล้วนจะจับคู่เฉพาะคำสั่งที่เรียกผ่าน PATH ดังนั้น rg สามารถจับคู่
/opt/homebrew/bin/rg เมื่อคำสั่งคือ rg แต่ไม่ใช่ ./rg หรือ /tmp/rg
เมื่อ security=allowlist คำสั่งเชลล์จะถูกอนุญาตอัตโนมัติเฉพาะเมื่อทุก segment ของ pipeline
อยู่ใน allowlist หรือเป็น safe bin การ chaining (;, &&, ||) และ redirections
จะถูกปฏิเสธในโหมด allowlist เว้นแต่ว่าทุก segment ระดับบนสุดจะเป็นไปตาม
allowlist (รวมถึง safe bins) Redirections ยังไม่รองรับ
ความเชื่อถือแบบถาวร allow-always ไม่ได้ข้ามกฎนั้น: คำสั่งแบบ chained ยังคงต้องให้ทุก
segment ระดับบนสุดตรงกัน
autoAllowSkills เป็นเส้นทางอำนวยความสะดวกแยกต่างหากในการอนุมัติ exec ไม่ใช่สิ่งเดียวกับ
รายการ allowlist พาธแบบ manual สำหรับความเชื่อถืออย่างชัดเจนแบบเข้มงวด ให้ปิดใช้งาน autoAllowSkills ไว้
ใช้ตัวควบคุมสองอย่างนี้สำหรับงานที่ต่างกัน:
tools.exec.safeBins: ตัวกรองสตรีมขนาดเล็กที่รับเฉพาะ stdintools.exec.safeBinTrustedDirs: ไดเรกทอรีที่เชื่อถือเพิ่มเติมแบบระบุชัดเจนสำหรับพาธปฏิบัติการ safe-bintools.exec.safeBinProfiles: นโยบาย argv แบบระบุชัดเจนสำหรับ safe bins แบบกำหนดเอง- รายการอนุญาต: ความเชื่อถือแบบระบุชัดเจนสำหรับพาธปฏิบัติการ
อย่าถือว่า safeBins เป็นรายการอนุญาตทั่วไป และอย่าเพิ่มไบนารี interpreter/runtime (เช่น python3, node, ruby, bash) หากคุณต้องใช้สิ่งเหล่านั้น ให้ใช้รายการอนุญาตแบบระบุชัดเจนและเปิดใช้พรอมป์อนุมัติไว้
openclaw security audit จะเตือนเมื่อรายการ safeBins ของ interpreter/runtime ขาดโปรไฟล์ที่ระบุชัดเจน และ openclaw doctor --fix สามารถสร้างโครงรายการ safeBinProfiles แบบกำหนดเองที่ขาดหายได้
openclaw security audit และ openclaw doctor ยังเตือนเมื่อคุณเพิ่มไบนารีที่มีพฤติกรรมกว้าง เช่น jq กลับเข้าไปใน safeBins แบบระบุชัดเจน
หากคุณอนุญาต interpreter แบบระบุชัดเจน ให้เปิดใช้ tools.exec.strictInlineEval เพื่อให้รูปแบบ inline code-eval ยังคงต้องขออนุมัติใหม่
สำหรับรายละเอียดนโยบายและตัวอย่างทั้งหมด โปรดดู การอนุมัติ Exec และ safe bins เทียบกับรายการอนุญาต
ตัวอย่าง
Foreground:
{ "tool": "exec", "command": "ls -la" }Background + poll:
{"tool":"exec","command":"npm run build","yieldMs":1000}{"tool":"process","action":"poll","sessionId":"<id>"}การ polling ใช้สำหรับสถานะตามต้องการ ไม่ใช่ลูปรอ หากเปิดใช้การปลุกเมื่อเสร็จสิ้นโดยอัตโนมัติ คำสั่งจะปลุกเซสชันได้เมื่อปล่อยเอาต์พุตหรือทำงานล้มเหลว
ส่งคีย์ (สไตล์ 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"]}Submit (ส่งเฉพาะ CR):
{ "tool": "process", "action": "submit", "sessionId": "<id>" }Paste (ใช้วงเล็บกำกับเป็นค่าเริ่มต้น):
{ "tool": "process", "action": "paste", "sessionId": "<id>", "text": "line1\nline2\n" }apply_patch
apply_patch เป็น subtool ของ 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"]เมื่อการเขียนแพตช์ควรถูกบล็อกด้วย- Config อยู่ใต้
tools.exec.applyPatch tools.exec.applyPatch.enabledมีค่าเริ่มต้นเป็นtrue; ตั้งค่าเป็นfalseเพื่อปิดใช้เครื่องมือนี้สำหรับโมเดล OpenAItools.exec.applyPatch.workspaceOnlyมีค่าเริ่มต้นเป็นtrue(จำกัดอยู่ใน workspace) ตั้งค่าเป็นfalseเฉพาะเมื่อคุณตั้งใจให้apply_patchเขียน/ลบนอกไดเรกทอรี workspace
ที่เกี่ยวข้อง
- การอนุมัติ Exec — เกตการอนุมัติสำหรับคำสั่งเชลล์
- Sandboxing — การรันคำสั่งในสภาพแวดล้อมแบบ sandboxed
- กระบวนการเบื้องหลัง — exec ที่ทำงานนานและเครื่องมือ process
- ความปลอดภัย — นโยบายเครื่องมือและสิทธิ์การเข้าถึงระดับสูง