Nodes and media
Node
Node คืออุปกรณ์คู่ข้าง (macOS/iOS/Android/headless) ที่เชื่อมต่อกับ Gateway WebSocket (พอร์ตเดียวกับผู้ปฏิบัติการ) ด้วย role: "node" และเปิดเผยพื้นผิวคำสั่ง (เช่น canvas.*, camera.*, device.*, notifications.*, system.*) ผ่าน node.invoke รายละเอียดโปรโตคอล: โปรโตคอล Gateway.
การส่งผ่านแบบเดิม: โปรโตคอล Bridge (TCP JSONL; สำหรับประวัติเท่านั้นใน Node ปัจจุบัน).
macOS ยังสามารถทำงานใน โหมด Node ได้ด้วย: แอป menubar เชื่อมต่อกับเซิร์ฟเวอร์ WS ของ Gateway และเปิดเผยคำสั่ง canvas/camera ในเครื่องของตนเป็น Node (ดังนั้น openclaw nodes … จึงทำงานกับ Mac เครื่องนี้ได้) ในโหมด Gateway ระยะไกล การทำงานอัตโนมัติของเบราว์เซอร์จะถูกจัดการโดยโฮสต์ Node ของ CLI (openclaw node run หรือบริการ Node ที่ติดตั้งไว้) ไม่ใช่โดย Node ของแอปเนทีฟ
หมายเหตุ:
- Node เป็น อุปกรณ์ต่อพ่วง ไม่ใช่ Gateway และไม่รันบริการ Gateway
- ข้อความ Telegram/WhatsApp/ฯลฯ จะไปถึง Gateway ไม่ใช่ Node
- คู่มือแก้ปัญหา: /nodes/troubleshooting
การจับคู่ + สถานะ
Node แบบ WS ใช้การจับคู่อุปกรณ์ Node แสดงตัวตนอุปกรณ์ระหว่าง connect; Gateway
สร้างคำขอจับคู่อุปกรณ์สำหรับ role: node อนุมัติผ่าน CLI ของอุปกรณ์ (หรือ UI)
CLI แบบรวดเร็ว:
openclaw devices listopenclaw devices approve <requestId>openclaw devices reject <requestId>openclaw nodes statusopenclaw nodes describe --node <idOrNameOrIp>หาก Node ลองใหม่ด้วยรายละเอียดการยืนยันตัวตนที่เปลี่ยนไป (role/scopes/public key) คำขอที่รออนุมัติก่อนหน้าจะถูกแทนที่ และจะสร้าง requestId ใหม่ ให้รัน
openclaw devices list อีกครั้งก่อนอนุมัติ
หมายเหตุ:
nodes statusทำเครื่องหมาย Node เป็น จับคู่แล้ว เมื่อบทบาทการจับคู่อุปกรณ์มีnode- เรคคอร์ดการจับคู่อุปกรณ์คือสัญญาบทบาทที่อนุมัติแบบคงทน การหมุนเวียนโทเค็นจะอยู่ภายในสัญญานั้น; ไม่สามารถยกระดับ Node ที่จับคู่แล้วไปเป็นบทบาทอื่นที่การอนุมัติการจับคู่ไม่เคยให้ไว้ได้
node.pair.*(CLI:openclaw nodes pending/approve/reject/remove/rename) เป็นที่เก็บการจับคู่ Node แยกต่างหากที่ Gateway เป็นเจ้าของ; ไม่ได้ ใช้กั้น handshakeconnectของ WSopenclaw nodes remove --node <id|name|ip>ลบการจับคู่ Node สำหรับ Node ที่มีอุปกรณ์รองรับ คำสั่งนี้จะเพิกถอนบทบาทnodeของอุปกรณ์ในdevices/paired.jsonและตัดการเชื่อมต่อเซสชันบทบาท Node ของอุปกรณ์นั้น — อุปกรณ์ที่มีหลายบทบาทจะยังคงมีแถวของตนและเสียเฉพาะบทบาทnodeเท่านั้น ขณะที่แถวของอุปกรณ์ที่เป็น Node อย่างเดียวจะถูกลบ นอกจากนี้ยังล้างรายการที่ตรงกันจากที่เก็บการจับคู่ Node แยกต่างหากที่ Gateway เป็นเจ้าของด้วยoperator.pairingอาจลบแถว Node ที่ไม่ใช่ผู้ปฏิบัติการได้; ผู้เรียกแบบโทเค็นอุปกรณ์ที่เพิกถอนบทบาท Node ของตนเองบนอุปกรณ์หลายบทบาทยังต้องมีoperator.adminเพิ่มเติม- ขอบเขตการอนุมัติตามคำสั่งที่คำขอที่รออนุมัติประกาศไว้:
- คำขอที่ไม่มีคำสั่ง:
operator.pairing - คำสั่ง Node ที่ไม่ใช่ exec:
operator.pairing+operator.write system.run/system.run.prepare/system.which:operator.pairing+operator.admin
- คำขอที่ไม่มีคำสั่ง:
โฮสต์ Node ระยะไกล (system.run)
ใช้ โฮสต์ Node เมื่อ Gateway ของคุณทำงานบนเครื่องหนึ่ง และคุณต้องการให้คำสั่งทำงานบนอีกเครื่องหนึ่ง โมเดลยังคุยกับ Gateway; Gateway
ส่งต่อการเรียก exec ไปยัง โฮสต์ Node เมื่อเลือก host=node
อะไรรันที่ไหน
- โฮสต์ Gateway: รับข้อความ รันโมเดล กำหนดเส้นทางการเรียกเครื่องมือ
- โฮสต์ Node: รัน
system.run/system.whichบนเครื่อง Node - การอนุมัติ: บังคับใช้บนโฮสต์ Node ผ่าน
~/.openclaw/exec-approvals.json
หมายเหตุการอนุมัติ:
- การรัน Node ที่มีการอนุมัติรองรับจะผูกกับบริบทคำขอที่แน่นอน
- สำหรับการรันไฟล์โดยตรงผ่าน shell/runtime OpenClaw ยังพยายามอย่างดีที่สุดเพื่อผูก operand ไฟล์ในเครื่องที่เป็นรูปธรรมหนึ่งไฟล์ และปฏิเสธการรันหากไฟล์นั้นเปลี่ยนก่อนการรัน
- หาก OpenClaw ไม่สามารถระบุไฟล์ในเครื่องที่เป็นรูปธรรมได้อย่างแน่นอนหนึ่งไฟล์สำหรับคำสั่ง interpreter/runtime การรันที่มีการอนุมัติรองรับจะถูกปฏิเสธแทนการแสร้งว่าครอบคลุม runtime ทั้งหมด ใช้ sandboxing, โฮสต์แยก, หรือรายการอนุญาต/เวิร์กโฟลว์เต็มรูปแบบที่เชื่อถือได้อย่างชัดเจนสำหรับความหมายของ interpreter ที่กว้างกว่า
เริ่มโฮสต์ Node (foreground)
บนเครื่อง Node:
openclaw node run --host <gateway-host> --port 18789 --display-name "Build Node"Gateway ระยะไกลผ่าน SSH tunnel (bind แบบ loopback)
หาก Gateway bind กับ loopback (gateway.bind=loopback, ค่าเริ่มต้นในโหมด local),
โฮสต์ Node ระยะไกลจะเชื่อมต่อโดยตรงไม่ได้ ให้สร้าง SSH tunnel และชี้โฮสต์ Node ไปยังปลายทางในเครื่องของ tunnel
ตัวอย่าง (โฮสต์ Node -> โฮสต์ Gateway):
# Terminal A (keep running): forward local 18790 -> gateway 127.0.0.1:18789ssh -N -L 18790:127.0.0.1:18789 user@gateway-host # Terminal B: export the gateway token and connect through the tunnelexport OPENCLAW_GATEWAY_TOKEN="<gateway-token>"openclaw node run --host 127.0.0.1 --port 18790 --display-name "Build Node"หมายเหตุ:
openclaw node runรองรับการยืนยันตัวตนด้วยโทเค็นหรือรหัสผ่าน- แนะนำให้ใช้ตัวแปรสภาพแวดล้อม:
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD - fallback ของคอนฟิกคือ
gateway.auth.token/gateway.auth.password - ในโหมด local โฮสต์ Node จะตั้งใจละเว้น
gateway.remote.token/gateway.remote.password - ในโหมด remote
gateway.remote.token/gateway.remote.passwordมีสิทธิ์ใช้งานตามกฎลำดับความสำคัญของ remote - หากกำหนดค่า SecretRefs ของ
gateway.auth.*แบบ local ที่ใช้งานอยู่แต่แก้ค่าไม่ได้ การยืนยันตัวตนของโฮสต์ Node จะ fail closed - การแก้ค่าการยืนยันตัวตนของโฮสต์ Node เคารพเฉพาะตัวแปรสภาพแวดล้อม
OPENCLAW_GATEWAY_*
เริ่มโฮสต์ Node (บริการ)
openclaw node install --host <gateway-host> --port 18789 --display-name "Build Node"openclaw node startopenclaw node restartจับคู่ + ตั้งชื่อ
บนโฮสต์ Gateway:
openclaw devices listopenclaw devices approve <requestId>openclaw nodes statusหาก Node ลองใหม่ด้วยรายละเอียดการยืนยันตัวตนที่เปลี่ยนไป ให้รัน openclaw devices list อีกครั้ง
และอนุมัติ requestId ปัจจุบัน
ตัวเลือกการตั้งชื่อ:
--display-nameบนopenclaw node run/openclaw node install(คงอยู่ใน~/.openclaw/node.jsonบน Node)openclaw nodes rename --node <id|name|ip> --name "Build Node"(การแทนที่จาก Gateway)
เพิ่มคำสั่งเข้าในรายการอนุญาต
การอนุมัติ Exec เป็นแบบ ต่อโฮสต์ Node เพิ่มรายการอนุญาตจาก Gateway:
openclaw approvals allowlist add --node <id|name|ip> "/usr/bin/uname"openclaw approvals allowlist add --node <id|name|ip> "/usr/bin/sw_vers"การอนุมัติอยู่บนโฮสต์ Node ที่ ~/.openclaw/exec-approvals.json
ชี้ exec ไปที่ Node
กำหนดค่าเริ่มต้น (คอนฟิก Gateway):
openclaw config set tools.exec.host nodeopenclaw config set tools.exec.security allowlistopenclaw config set tools.exec.node "<id-or-name>"หรือแบบต่อเซสชัน:
/exec host=node security=allowlist node=<id-or-name>เมื่อตั้งค่าแล้ว การเรียก exec ใดๆ ที่มี host=node จะรันบนโฮสต์ Node (ขึ้นกับรายการอนุญาต/การอนุมัติของ Node)
host=auto จะไม่เลือก Node เองโดยปริยาย แต่อนุญาตคำขอแบบต่อการเรียกที่ระบุ host=node อย่างชัดเจนจาก auto หากคุณต้องการให้ exec บน Node เป็นค่าเริ่มต้นของเซสชัน ให้ตั้ง tools.exec.host=node หรือ /exec host=node ... อย่างชัดเจน
ที่เกี่ยวข้อง:
การเรียกใช้คำสั่ง
ระดับต่ำ (RPC ดิบ):
openclaw nodes invoke --node <idOrNameOrIp> --command canvas.eval --params '{"javaScript":"location.href"}'มี helper ระดับสูงสำหรับเวิร์กโฟลว์ทั่วไปแบบ "ให้เอเจนต์มีไฟล์แนบ MEDIA"
นโยบายคำสั่ง
คำสั่ง Node ต้องผ่านด่านสองชั้นก่อนจึงจะเรียกใช้ได้:
- Node ต้องประกาศคำสั่งในรายการ
connect.commandsของ WebSocket - นโยบายแพลตฟอร์มของ Gateway ต้องอนุญาตคำสั่งที่ประกาศไว้
Node คู่ข้างบน Windows และ macOS อนุญาตคำสั่งที่ประกาศไว้อย่างปลอดภัย เช่น
canvas.*, camera.list, location.get, และ screen.snapshot ตามค่าเริ่มต้น
Node ที่เชื่อถือได้ซึ่งโฆษณาความสามารถ talk หรือประกาศคำสั่ง talk.*
ยังอนุญาตคำสั่งกดเพื่อพูดที่ประกาศไว้ (talk.ptt.start, talk.ptt.stop,
talk.ptt.cancel, talk.ptt.once) ตามค่าเริ่มต้น โดยไม่ขึ้นกับป้ายแพลตฟอร์ม
คำสั่งที่อันตรายหรือมีผลต่อความเป็นส่วนตัวสูง เช่น camera.snap, camera.clip, และ
screen.record ยังต้อง opt-in อย่างชัดเจนด้วย
gateway.nodes.allowCommands gateway.nodes.denyCommands ชนะค่าเริ่มต้นและรายการอนุญาตเพิ่มเติมเสมอ
คำสั่ง Node ที่ Plugin เป็นเจ้าของสามารถเพิ่มนโยบาย node-invoke ของ Gateway ได้ นโยบายนั้นทำงานหลังการตรวจรายการอนุญาตและก่อนส่งต่อไปยัง Node ดังนั้น node.invoke ดิบ, helper ของ CLI, และเครื่องมือเอเจนต์เฉพาะจะใช้ขอบเขตสิทธิ์ของ Plugin เดียวกัน คำสั่ง Node ของ Plugin ที่อันตรายยังต้องมีการ opt-in ด้วย gateway.nodes.allowCommands อย่างชัดเจน
หลังจาก Node เปลี่ยนรายการคำสั่งที่ประกาศไว้ ให้ปฏิเสธการจับคู่อุปกรณ์เก่า และอนุมัติคำขอใหม่เพื่อให้ Gateway เก็บสแนปช็อตคำสั่งที่อัปเดตแล้ว
คอนฟิก (openclaw.json)
การตั้งค่าที่เกี่ยวกับ Node อยู่ภายใต้ gateway.nodes และ tools.exec:
{ gateway: { nodes: { // Auto-approve first-time node pairing from trusted networks (CIDR list). // Disabled when unset. Only applies to first-time role:node requests // with no requested scopes; does not auto-approve upgrades. pairing: { autoApproveCidrs: ["192.168.1.0/24"], }, // Opt into dangerous/privacy-heavy node commands (camera.snap, etc.). allowCommands: ["camera.snap", "screen.record"], // Block exact command names even if defaults or allowCommands include them. denyCommands: ["camera.clip"], }, }, tools: { exec: { // Default exec host: "node" routes all exec calls to a paired node. host: "node", // Security mode for node exec: allow only approved/allowlisted commands. security: "allowlist", // Pin exec to a specific node (id or name). Omit to allow any node. node: "build-node", }, },}ใช้ชื่อคำสั่ง Node แบบตรงตัว denyCommands ลบคำสั่งแม้ค่าเริ่มต้นของแพลตฟอร์มหรือรายการ allowCommands จะอนุญาตอยู่ก็ตาม ดู
ข้อมูลอ้างอิงคอนฟิก Gateway
สำหรับรายละเอียดฟิลด์การจับคู่ Node ของ Gateway และนโยบายคำสั่ง
การแทนที่ Node สำหรับ exec แบบต่อเอเจนต์:
{ agents: { list: [ { id: "main", tools: { exec: { node: "build-node" } }, }, ], },}ภาพหน้าจอ (สแนปช็อต canvas)
หาก Node กำลังแสดง Canvas (WebView), canvas.snapshot จะคืนค่า { format, base64 }
helper ของ CLI (เขียนไปยังไฟล์ชั่วคราวและพิมพ์พาธที่บันทึกไว้):
openclaw nodes canvas snapshot --node <idOrNameOrIp> --format pngopenclaw nodes canvas snapshot --node <idOrNameOrIp> --format jpg --max-width 1200 --quality 0.9การควบคุม Canvas
openclaw nodes canvas present --node <idOrNameOrIp> --target https://example.comopenclaw nodes canvas hide --node <idOrNameOrIp>openclaw nodes canvas navigate https://example.com --node <idOrNameOrIp>openclaw nodes canvas eval --node <idOrNameOrIp> --js "document.title"หมายเหตุ:
canvas presentรับ URL หรือพาธไฟล์ในเครื่อง (--target) พร้อม--x/--y/--width/--heightที่เลือกได้สำหรับการจัดตำแหน่งcanvas evalรับ JS แบบ inline (--js) หรืออาร์กิวเมนต์แบบ positional
A2UI (Canvas)
openclaw nodes canvas a2ui push --node <idOrNameOrIp> --text "Hello"openclaw nodes canvas a2ui push --node <idOrNameOrIp> --jsonl ./payload.jsonlopenclaw nodes canvas a2ui reset --node <idOrNameOrIp>หมายเหตุ:
- Node มือถือใช้หน้า A2UI ที่รวมมากับแอปและแอปเป็นเจ้าของสำหรับการเรนเดอร์ที่ทำงานกับ action ได้
- รองรับเฉพาะ A2UI v0.8 JSONL (v0.9/createSurface จะถูกปฏิเสธ)
- iOS และ Android เรนเดอร์หน้า Canvas ของ Gateway ระยะไกล แต่ action ของปุ่ม A2UI จะถูก dispatch เฉพาะจากหน้า A2UI ที่รวมมากับแอปและแอปเป็นเจ้าของเท่านั้น หน้า A2UI แบบ HTTP/HTTPS ที่ Gateway โฮสต์เป็นแบบเรนเดอร์อย่างเดียวบนไคลเอนต์มือถือเหล่านั้น
รูปภาพ + วิดีโอ (กล้อง Node)
รูปภาพ (jpg):
openclaw nodes camera list --node <idOrNameOrIp>openclaw nodes camera snap --node <idOrNameOrIp> # ค่าเริ่มต้น: ทั้งสองด้าน (2 บรรทัด MEDIA)openclaw nodes camera snap --node <idOrNameOrIp> --facing frontคลิปวิดีโอ (mp4):
openclaw nodes camera clip --node <idOrNameOrIp> --duration 10sopenclaw nodes camera clip --node <idOrNameOrIp> --duration 3000 --no-audioหมายเหตุ:
- node ต้องอยู่ใน foreground สำหรับ
canvas.*และcamera.*(การเรียกขณะอยู่เบื้องหลังจะคืนค่าNODE_BACKGROUND_UNAVAILABLE) - ระยะเวลาคลิปจะถูกจำกัดไว้ (ปัจจุบัน
<= 60s) เพื่อหลีกเลี่ยง payload base64 ที่มีขนาดใหญ่เกินไป - Android จะแจ้งขอสิทธิ์
CAMERA/RECORD_AUDIOเมื่อทำได้; สิทธิ์ที่ถูกปฏิเสธจะล้มเหลวด้วย*_PERMISSION_REQUIRED
การบันทึกหน้าจอ (nodes)
nodes ที่รองรับจะแสดง screen.record (mp4) ตัวอย่าง:
openclaw nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10openclaw nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10 --no-audioหมายเหตุ:
- ความพร้อมใช้งานของ
screen.recordขึ้นอยู่กับแพลตฟอร์มของ node - การบันทึกหน้าจอจะถูกจำกัดไว้ที่
<= 60s --no-audioปิดการจับเสียงไมโครโฟนบนแพลตฟอร์มที่รองรับ- ใช้
--screen <index>เพื่อเลือกจอแสดงผลเมื่อมีหลายหน้าจอให้ใช้งาน
ตำแหน่งที่ตั้ง (nodes)
nodes จะแสดง location.get เมื่อเปิดใช้งาน Location ในการตั้งค่า
ตัวช่วย CLI:
openclaw nodes location get --node <idOrNameOrIp>openclaw nodes location get --node <idOrNameOrIp> --accuracy precise --max-age 15000 --location-timeout 10000หมายเหตุ:
- Location ปิดอยู่ตามค่าเริ่มต้น
- "Always" ต้องมีสิทธิ์จากระบบ; การดึงข้อมูลเบื้องหลังเป็นแบบพยายามให้ดีที่สุด
- การตอบกลับมี lat/lon, ความแม่นยำ (เมตร), และเวลาประทับ
SMS (Android nodes)
Android nodes สามารถแสดง sms.send ได้เมื่อผู้ใช้ให้สิทธิ์ SMS และอุปกรณ์รองรับระบบโทรศัพท์
การเรียกระดับต่ำ:
openclaw nodes invoke --node <idOrNameOrIp> --command sms.send --params '{"to":"+15555550123","message":"Hello from OpenClaw"}'หมายเหตุ:
- ต้องยอมรับพรอมป์ขอสิทธิ์บนอุปกรณ์ Android ก่อนจึงจะประกาศ capability นี้
- อุปกรณ์ที่มีเฉพาะ Wi-Fi และไม่มีระบบโทรศัพท์จะไม่ประกาศ
sms.send
คำสั่งอุปกรณ์ Android + ข้อมูลส่วนตัว
Android nodes สามารถประกาศตระกูลคำสั่งเพิ่มเติมได้เมื่อเปิดใช้งาน capabilities ที่เกี่ยวข้อง
ตระกูลที่พร้อมใช้งาน:
device.status,device.info,device.permissions,device.healthdevice.appsเมื่อเปิดใช้งานการแชร์ Installed Apps ใน Android Settingsnotifications.list,notifications.actionsphotos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
ตัวอย่างการเรียก:
openclaw nodes invoke --node <idOrNameOrIp> --command device.status --params '{}'openclaw nodes invoke --node <idOrNameOrIp> --command device.apps --params '{"limit":10}'openclaw nodes invoke --node <idOrNameOrIp> --command notifications.list --params '{}'openclaw nodes invoke --node <idOrNameOrIp> --command photos.latest --params '{"limit":1}'หมายเหตุ:
device.appsเป็นแบบเลือกเปิดใช้ และจะส่งคืนแอปที่มองเห็นได้ใน launcher ตามค่าเริ่มต้น- คำสั่งการเคลื่อนไหวถูกจำกัดด้วยความสามารถตามเซ็นเซอร์ที่มีอยู่
คำสั่งระบบ (โฮสต์โหนด / โหนด mac)
โหนด macOS เปิดเผย system.run, system.notify และ system.execApprovals.get/set
โฮสต์โหนดแบบ headless เปิดเผย system.run, system.which และ system.execApprovals.get/set
ตัวอย่าง:
openclaw nodes notify --node <idOrNameOrIp> --title "Ping" --body "Gateway ready"openclaw nodes invoke --node <idOrNameOrIp> --command system.which --params '{"name":"git"}'หมายเหตุ:
system.runส่งคืน stdout/stderr/รหัสออกใน payload- การเรียกใช้ shell ตอนนี้ผ่านเครื่องมือ
execด้วยhost=node;nodesยังคงเป็นพื้นผิว direct-RPC สำหรับคำสั่งโหนดแบบระบุชัดเจน nodes invokeไม่เปิดเผยsystem.runหรือsystem.run.prepare; รายการเหล่านั้นอยู่บนเส้นทาง exec เท่านั้น- เส้นทาง exec เตรียม
systemRunPlanแบบมาตรฐานก่อนการอนุมัติ เมื่อมีการให้ การอนุมัติแล้ว gateway จะส่งต่อแผนที่เก็บไว้นั้น ไม่ใช่ฟิลด์ command/cwd/session ที่ผู้เรียกแก้ไขภายหลัง system.notifyเคารพสถานะสิทธิ์การแจ้งเตือนบนแอป macOS- เมทาดาทา
platform/deviceFamilyของโหนดที่ไม่รู้จักจะใช้ allowlist ค่าเริ่มต้นแบบระมัดระวังซึ่งไม่รวมsystem.runและsystem.whichหากคุณต้องการคำสั่งเหล่านั้นสำหรับแพลตฟอร์มที่ไม่รู้จักโดยตั้งใจ ให้เพิ่มอย่างชัดเจนผ่านgateway.nodes.allowCommands system.runรองรับ--cwd,--env KEY=VAL,--command-timeoutและ--needs-screen-recording- สำหรับตัวครอบ shell (
bash|sh|zsh ... -c/-lc) ค่า--envที่มีขอบเขตตามคำขอจะถูกลดให้เหลือ allowlist แบบระบุชัดเจน (TERM,LANG,LC_*,COLORTERM,NO_COLOR,FORCE_COLOR) - สำหรับการตัดสินใจ allow-always ในโหมด allowlist ตัวครอบ dispatch ที่รู้จัก (
env,flock,nice,nohup,stdbuf,timeout) จะบันทึกเส้นทาง executable ภายในแทนเส้นทางของตัวครอบ หากการคลายตัวครอบไม่ปลอดภัย จะไม่มีการบันทึกรายการ allowlist โดยอัตโนมัติ - บนโฮสต์โหนด Windows ในโหมด allowlist การรันตัวครอบ shell ผ่าน
cmd.exe /cต้องได้รับการอนุมัติ (รายการ allowlist เพียงอย่างเดียวไม่ได้อนุญาตรูปแบบตัวครอบโดยอัตโนมัติ) system.notifyรองรับ--priority <passive|active|timeSensitive>และ--delivery <system|overlay|auto>- โฮสต์โหนดจะไม่สนใจการแทนที่
PATHและจะตัดคีย์ startup/shell ที่เป็นอันตรายออก (DYLD_*,LD_*,BASHOPTS,FPATH,KSH_ENV,NODE_OPTIONS,NODE_REDIRECT_WARNINGS,NODE_REPL_EXTERNAL_MODULE,NODE_REPL_HISTORY,NODE_V8_COVERAGE,PYTHON*,PERL*,RUBYOPT,SHELLOPTS,PS4,TCLLIBPATH) หากคุณต้องการรายการ PATH เพิ่มเติม ให้กำหนดค่าสภาพแวดล้อมของบริการโฮสต์โหนด (หรือติดตั้งเครื่องมือในตำแหน่งมาตรฐาน) แทนการส่งPATHผ่าน--env - ในโหมดโหนด macOS,
system.runถูกจำกัดด้วยการอนุมัติ exec ในแอป macOS (การตั้งค่า → การอนุมัติ Exec) Ask/allowlist/full ทำงานเหมือนกับโฮสต์โหนดแบบ headless; prompt ที่ถูกปฏิเสธจะส่งคืนSYSTEM_RUN_DENIED - บนโฮสต์โหนดแบบ headless,
system.runถูกจำกัดด้วยการอนุมัติ exec (~/.openclaw/exec-approvals.json)
การผูกโหนด Exec
เมื่อมีหลายโหนดพร้อมใช้งาน คุณสามารถผูก exec กับโหนดเฉพาะได้
สิ่งนี้ตั้งค่าโหนดเริ่มต้นสำหรับ exec host=node (และสามารถถูกแทนที่ต่อ agent ได้)
ค่าเริ่มต้นแบบ global:
openclaw config set tools.exec.node "node-id-or-name"การแทนที่ต่อ agent:
openclaw config get agents.listopenclaw config set 'agents.list[0].tools.exec.node' "node-id-or-name"ยกเลิกการตั้งค่าเพื่ออนุญาตโหนดใดก็ได้:
openclaw config unset tools.exec.nodeopenclaw config unset 'agents.list[0].tools.exec.node'แผนที่สิทธิ์
โหนดอาจมีแมป permissions ใน node.list / node.describe โดยใช้ชื่อสิทธิ์เป็นคีย์ (เช่น screenRecording, accessibility) พร้อมค่าบูลีน (true = ได้รับอนุญาตแล้ว)
โฮสต์โหนดแบบ headless (ข้ามแพลตฟอร์ม)
OpenClaw สามารถรัน โฮสต์โหนดแบบ headless (ไม่มี UI) ที่เชื่อมต่อกับ Gateway
WebSocket และเปิดเผย system.run / system.which ได้ สิ่งนี้มีประโยชน์บน Linux/Windows
หรือสำหรับการรันโหนดขนาดเล็กควบคู่กับเซิร์ฟเวอร์
เริ่มต้นใช้งาน:
openclaw node run --host <gateway-host> --port 18789หมายเหตุ:
- ยังจำเป็นต้องจับคู่ (Gateway จะแสดง prompt การจับคู่อุปกรณ์)
- โฮสต์โหนดจะเก็บ node id, token, display name และข้อมูลการเชื่อมต่อ gateway ไว้ใน
~/.openclaw/node.json - การอนุมัติ exec ถูกบังคับใช้ภายในเครื่องผ่าน
~/.openclaw/exec-approvals.json(ดู การอนุมัติ Exec) - บน macOS โฮสต์โหนดแบบ headless จะเรียกใช้
system.runภายในเครื่องตามค่าเริ่มต้น ตั้งค่าOPENCLAW_NODE_EXEC_HOST=appเพื่อกำหนดเส้นทางsystem.runผ่าน exec host ของแอปคู่ขนาน; เพิ่มOPENCLAW_NODE_EXEC_FALLBACK=0เพื่อบังคับใช้ app host และ fail closed หากไม่พร้อมใช้งาน - เพิ่ม
--tls/--tls-fingerprintเมื่อ Gateway WS ใช้ TLS
โหมดโหนด Mac
- แอป menubar ของ macOS เชื่อมต่อกับเซิร์ฟเวอร์ Gateway WS ในฐานะโหนด (ดังนั้น
openclaw nodes …จึงทำงานกับ Mac เครื่องนี้ได้) - ในโหมดระยะไกล แอปจะเปิด SSH tunnel สำหรับพอร์ต Gateway และเชื่อมต่อกับ
localhost