macOS companion app
การควบคุมระยะไกล
โฟลว์นี้ช่วยให้แอป macOS ทำหน้าที่เป็นรีโมตคอนโทรลเต็มรูปแบบสำหรับ Gateway ของ OpenClaw ที่ทำงานอยู่บนโฮสต์อื่น (เดสก์ท็อป/เซิร์ฟเวอร์) แอปเชื่อมต่อโดยตรงกับ URL ของ Gateway บน LAN/Tailnet ที่เชื่อถือได้ หรือจัดการอุโมงค์ SSH เมื่อ Gateway ระยะไกลรับการเชื่อมต่อเฉพาะ loopback การตรวจสอบสถานะ การส่งต่อ Voice Wake และ Web Chat จะใช้การกำหนดค่าระยะไกลเดียวกันจาก Settings -> General
โหมด
- ภายในเครื่อง (Mac เครื่องนี้): ทุกอย่างทำงานบนแล็ปท็อป โดยไม่ใช้ SSH
- ระยะไกลผ่าน SSH (ค่าเริ่มต้น): คำสั่ง OpenClaw ทำงานบนโฮสต์ระยะไกล แอปเปิดการเชื่อมต่อ SSH ด้วย
-o BatchModeข้อมูลประจำตัว/คีย์ที่เลือก และการส่งต่อพอร์ตภายในเครื่อง - ระยะไกลโดยตรง (ws/wss): ไม่มีอุโมงค์ SSH แอปเชื่อมต่อโดยตรงกับ URL ของ Gateway (LAN, Tailscale, Tailscale Serve หรือพร็อกซีย้อนกลับ HTTPS สาธารณะ)
การรับส่งข้อมูลระยะไกล
- อุโมงค์ SSH (ค่าเริ่มต้น): ใช้
ssh -N -L ...เพื่อส่งต่อพอร์ตของ Gateway ไปยัง localhost โดย Gateway จะเห็น IP ของ Node เป็น127.0.0.1เนื่องจากอุโมงค์เป็น loopback - โดยตรง (ws/wss): เชื่อมต่อโดยตรงกับ URL ของ Gateway โดย Gateway จะเห็น IP จริงของไคลเอนต์
แอปจะปิดการมัลติเพล็กซ์การเชื่อมต่อ SSH และการทำงานเบื้องหลังหลังการยืนยันตัวตนสำหรับกระบวนการ SSH ของแอปเอง เพื่อให้สามารถตรวจสอบและเริ่มกระบวนการนั้นใหม่ได้อย่างแม่นยำ แม้ว่า alias ที่เลือกจะเปิดใช้ ControlMaster หรือ ForkAfterAuthentication
การตรวจสอบคีย์โฮสต์ SSH จะเข้มงวดตามค่าเริ่มต้น เนื่องจากข้อมูลประจำตัวของ Gateway เดินทางผ่านอุโมงค์นี้ หากต้องการเลือกใช้ลักษณะการเชื่อถือของ alias SSH ที่ได้รับการจัดการเอง ให้ตั้งค่า --ssh-host-key-policy openssh ผ่าน openclaw-mac configure-remote หรือตั้งค่า gateway.remote.sshHostKeyPolicy เป็น "openssh" โดยตรง ตรวจสอบ alias รวมถึง Host * ที่ตรงกันหรือการกำหนดค่าระบบก่อนเลือกใช้ การเปลี่ยนเป้าหมาย SSH (ในแอปหรือผ่าน configure-remote) จะรีเซ็ตนโยบายกลับเป็น strict เว้นแต่จะเลือกใช้อีกครั้งอย่างชัดเจนสำหรับเป้าหมายใหม่
ในโหมดอุโมงค์ SSH ชื่อโฮสต์ LAN/Tailnet ที่ค้นพบจะบันทึกเป็น gateway.remote.sshTarget แอปจะคง gateway.remote.url ไว้ที่ปลายทางอุโมงค์ภายในเครื่อง (เช่น ws://127.0.0.1:18789) เพื่อให้ CLI, Web Chat และบริการโฮสต์ Node ภายในเครื่องทั้งหมดใช้การรับส่งข้อมูลแบบ loopback เดียวกัน เมื่อการค้นพบส่งคืนทั้ง IP ดิบของ Tailnet และชื่อโฮสต์ที่เสถียร แอปจะเลือกใช้ชื่อ Tailscale MagicDNS หรือ LAN เพื่อให้การเชื่อมต่อทนต่อการเปลี่ยนแปลงที่อยู่ได้ดีกว่า หากพอร์ตอุโมงค์ภายในเครื่องต่างจากพอร์ต Gateway ระยะไกล ให้ตั้งค่า gateway.remote.remotePort เป็นพอร์ตบนโฮสต์ระยะไกล
การทำงานอัตโนมัติของเบราว์เซอร์ในโหมดระยะไกลอยู่ภายใต้การดูแลของโฮสต์ Node ของ CLI ไม่ใช่ Node ดั้งเดิมของแอป macOS แอปจะเริ่มบริการโฮสต์ Node ที่ติดตั้งไว้เมื่อทำได้ หากต้องการเปิดใช้การควบคุมเบราว์เซอร์จาก Mac เครื่องนั้น ให้ติดตั้ง/เริ่มบริการด้วย openclaw node install ... และ openclaw node start (หรือเรียกใช้ openclaw node run ... ในเบื้องหน้า) จากนั้นกำหนดเป้าหมายไปยัง Node ที่รองรับเบราว์เซอร์นั้น
ข้อกำหนดเบื้องต้นบนโฮสต์ระยะไกล
- ติดตั้ง Node + pnpm และสร้าง/ติดตั้ง OpenClaw CLI (
pnpm install && pnpm build && pnpm link --global) - ตรวจสอบว่า
openclawอยู่ใน PATH สำหรับเชลล์แบบไม่โต้ตอบ (สร้าง symlink ไปยัง/usr/local/binหรือ/opt/homebrew/binหากจำเป็น) - สำหรับการรับส่งข้อมูลผ่าน SSH: ตั้งค่าการยืนยันตัวตน SSH ด้วยคีย์ แนะนำให้ใช้ IP ของ Tailscale เพื่อให้เข้าถึงได้อย่างเสถียรจากภายนอก LAN
การตั้งค่าแอป macOS
หากต้องการกำหนดค่าแอปล่วงหน้าโดยไม่ผ่านโฟลว์ต้อนรับ ให้ดำเนินการผ่าน SSH:
openclaw-mac configure-remote \ --ssh-target user@gateway-host \ --local-port 18789 \ --remote-port 18789 \ --token "$OPENCLAW_GATEWAY_TOKEN"หรือสำหรับ Gateway ที่เข้าถึงได้อยู่แล้วบน LAN หรือ Tailnet ที่เชื่อถือได้ ให้ข้าม SSH ทั้งหมด:
openclaw-mac configure-remote \ --direct-url ws://192.168.0.202:18789 \ --token "$OPENCLAW_GATEWAY_TOKEN"openclaw-mac connect, wizard และ configure-remote จะระบุการกำหนดค่าที่ใช้งานอยู่ตามลำดับดังนี้: OPENCLAW_CONFIG_PATH จากนั้น $OPENCLAW_STATE_DIR/openclaw.json และ ~/.openclaw/openclaw.json การกำหนดค่าทั้งสองรูปแบบจะเขียนไปยังไฟล์ที่ใช้งานอยู่นั้น ทำเครื่องหมายว่าการเริ่มต้นใช้งานเสร็จสมบูรณ์ และให้อำนาจแอปจัดการการรับส่งข้อมูลที่เลือกเมื่อเริ่มต้นครั้งถัดไป --local-port/--remote-port มีค่าเริ่มต้นเป็น 18789 แฟล็กอื่นๆ ได้แก่ --password, --identity <path>, --ssh-host-key-policy <strict|openssh>, --project-root <path>, --cli-path <path>, --json เรียกใช้ openclaw-mac configure-remote --help เพื่อดูข้อมูลอ้างอิงฉบับเต็ม
หากต้องการกำหนดค่าจาก UI แทน:
- เปิด Settings -> General
- ภายใต้ OpenClaw runs ให้เลือก Remote และตั้งค่าดังนี้:
- Transport: SSH tunnel หรือ Direct (ws/wss)
- SSH target:
user@host(เลือกใช้:portได้) หาก Gateway อยู่บน LAN เดียวกันและประกาศผ่าน Bonjour ให้เลือกจากรายการที่ค้นพบเพื่อกรอกฟิลด์นี้โดยอัตโนมัติ - Gateway URL (เฉพาะ Direct):
wss://gateway.example.ts.net(หรือws://...สำหรับภายในเครื่อง/LAN) - Identity file (ขั้นสูง): พาธไปยังคีย์
- Project root (ขั้นสูง): พาธเช็กเอาต์ระยะไกลที่ใช้สำหรับคำสั่ง
- CLI path (ขั้นสูง): พาธทางเลือกไปยังจุดเข้าใช้งาน/ไบนารี
openclawที่เรียกใช้ได้ (กรอกโดยอัตโนมัติเมื่อมีการประกาศ)
- กด Test remote หากสำเร็จ หมายความว่า
openclaw status --jsonระยะไกลทำงานอย่างถูกต้อง ความล้มเหลวมักหมายถึงปัญหา PATH/CLI ส่วนรหัสออก 127 หมายความว่าไม่พบ CLI บนโฮสต์ระยะไกล - ขณะนี้การตรวจสอบสถานะและ Web Chat จะทำงานผ่านการรับส่งข้อมูลที่เลือกโดยอัตโนมัติ
Web Chat
- อุโมงค์ SSH: เชื่อมต่อกับ Gateway ผ่านพอร์ตควบคุม WebSocket ที่ส่งต่อมา (ค่าเริ่มต้น 18789)
- โดยตรง (ws/wss): เชื่อมต่อโดยตรงกับ URL ของ Gateway ที่กำหนดค่าไว้
- ไม่มีเซิร์ฟเวอร์ HTTP สำหรับ Web Chat แยกต่างหาก
สิทธิ์
- โฮสต์ระยะไกลต้องได้รับการอนุมัติ TCC แบบเดียวกับเครื่องภายใน (Automation, Accessibility, Screen Recording, Microphone, Speech Recognition, Notifications) ดำเนินการเริ่มต้นใช้งานบนเครื่องนั้นหนึ่งครั้งเพื่อให้สิทธิ์
- Node จะประกาศสถานะสิทธิ์ผ่าน
node.list/node.describeเพื่อให้เอเจนต์ทราบว่ามีสิ่งใดพร้อมใช้งาน
หมายเหตุด้านความปลอดภัย
- ควรเลือกการผูกกับ loopback บนโฮสต์ระยะไกล และเชื่อมต่อผ่าน SSH, Tailscale Serve หรือ URL โดยตรงของ Tailnet/LAN ที่เชื่อถือได้
- โดยค่าเริ่มต้น การสร้างอุโมงค์ SSH ต้องใช้คีย์โฮสต์ที่เชื่อถืออยู่แล้ว ให้เชื่อถือคีย์โฮสต์ก่อน (เพิ่มลงในไฟล์ known-hosts ที่กำหนดค่าไว้) หรือตั้งค่า
gateway.remote.sshHostKeyPolicy: "openssh"อย่างชัดเจนสำหรับ alias ที่ได้รับการจัดการซึ่งยอมรับนโยบายการเชื่อถือของ OpenSSH - หากผูก Gateway กับอินเทอร์เฟซที่ไม่ใช่ loopback ต้องใช้การยืนยันตัวตน Gateway ที่ถูกต้อง ได้แก่ โทเค็น รหัสผ่าน หรือพร็อกซีย้อนกลับที่รับรู้ข้อมูลประจำตัวพร้อม
gateway.auth.mode: "trusted-proxy" - ดู ความปลอดภัย และ Tailscale
โฟลว์การเข้าสู่ระบบ WhatsApp (ระยะไกล)
- เรียกใช้
openclaw channels login --channel whatsapp --verboseบนโฮสต์ระยะไกล สแกน QR ด้วย WhatsApp บนโทรศัพท์ - เข้าสู่ระบบอีกครั้งบนโฮสต์นั้นหากการยืนยันตัวตนหมดอายุ การตรวจสอบสถานะจะแสดงปัญหาการเชื่อมโยง
การแก้ไขปัญหา
| อาการ | สาเหตุ / วิธีแก้ไข |
|---|---|
exit 127 / ไม่พบ |
openclaw ไม่อยู่ใน PATH สำหรับเชลล์ที่ไม่ใช่เชลล์ล็อกอิน ให้เพิ่มลงใน /etc/paths, ไฟล์ rc ของเชลล์ หรือสร้าง symlink ไว้ใน /usr/local/bin//opt/homebrew/bin |
| โพรบตรวจสอบสถานะล้มเหลว | ตรวจสอบว่าสามารถเข้าถึงผ่าน SSH ได้, PATH ถูกต้อง และ Baileys (WhatsApp) ล็อกอินอยู่ (openclaw status --json) |
| Web Chat ค้าง | ยืนยันว่า Gateway กำลังทำงานบนโฮสต์ระยะไกล และพอร์ตที่ส่งต่อตรงกับพอร์ต WS ของ Gateway โดย UI ต้องใช้การเชื่อมต่อ WS ที่ทำงานเป็นปกติ |
IP ของ Node แสดงเป็น 127.0.0.1 |
เป็นพฤติกรรมที่คาดไว้เมื่อใช้ทันเนล SSH หากต้องการให้ Gateway เห็น IP จริงของไคลเอนต์ ให้เปลี่ยน Transport เป็น Direct (ws/wss) |
| แดชบอร์ดใช้งานได้ แต่ความสามารถของ Mac ออฟไลน์ | การเชื่อมต่อของผู้ควบคุม/ส่วนควบคุมทำงานเป็นปกติ แต่การเชื่อมต่อ Node คู่หูยังไม่ได้เชื่อมต่อหรือไม่มีชุดคำสั่ง เปิดส่วนอุปกรณ์ในแถบเมนูและตรวจสอบว่า Mac อยู่ในสถานะ paired · disconnected หรือไม่ สำหรับปลายทาง Tailscale Serve แบบ wss://*.ts.net แอปจะตรวจพบพินใบรับรอง TLS ปลายทางแบบเก่าที่หมดอายุหลังการหมุนเวียนใบรับรอง ล้างพินเก่าเมื่อ macOS เชื่อถือใบรับรองใหม่ แล้วลองอีกครั้งโดยอัตโนมัติ หากใบรับรองไม่ได้รับความเชื่อถือจากระบบหรือโฮสต์ไม่ใช่ชื่อ Tailscale Serve ให้ตั้งค่า gateway.remote.tlsFingerprint เป็นลายนิ้วมือใบรับรองที่คาดไว้ ตรวจสอบใบรับรอง หรือเปลี่ยนเป็น Remote over SSH |
| Voice Wake | วลีเรียกใช้งานจะถูกส่งต่อโดยอัตโนมัติในโหมดระยะไกล โดยไม่ต้องใช้ตัวส่งต่อแยกต่างหาก |
เสียงแจ้งเตือน
เลือกเสียงสำหรับการแจ้งเตือนแต่ละรายการจากสคริปต์ด้วย openclaw nodes notify ตัวอย่างเช่น:
openclaw nodes notify --node <id> --title "Ping" --body "Remote gateway ready" --sound Glassแอปไม่มีตัวเลือกสลับเสียงเริ่มต้นส่วนกลาง ผู้เรียกใช้จะเลือกเสียง (หรือไม่ใช้เสียง) สำหรับแต่ละคำขอ