macOS companion app
การควบคุมระยะไกล
โฟลว์นี้ช่วยให้แอป macOS ทำหน้าที่เป็นรีโมตคอนโทรลเต็มรูปแบบสำหรับ Gateway ของ OpenClaw ที่ทำงานบนโฮสต์อื่น (เดสก์ท็อป/เซิร์ฟเวอร์) แอปจะเชื่อมต่อโดยตรงกับ URL ของ Gateway บน LAN/Tailnet ที่เชื่อถือได้ หรือจัดการอุโมงค์ SSH เมื่อ Gateway ระยะไกลรับการเชื่อมต่อผ่าน local 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เนื่องจากอุโมงค์ทำงานผ่าน local loopback - โดยตรง (ws/wss): เชื่อมต่อกับ URL ของ Gateway โดยตรง Gateway จะเห็น IP จริงของไคลเอนต์
แอปจะปิดการใช้การเชื่อมต่อ SSH ร่วมกันและการย้ายไปทำงานเบื้องหลังหลังการยืนยันตัวตนสำหรับโพรเซส SSH ของแอปเอง เพื่อให้สามารถตรวจสอบและเริ่มโพรเซสที่เจาะจงนั้นใหม่ได้ แม้นามแฝงที่เลือกจะเปิดใช้ ControlMaster หรือ ForkAfterAuthentication
โดยค่าเริ่มต้น การตรวจสอบคีย์โฮสต์ SSH จะเข้มงวด เนื่องจากข้อมูลประจำตัวของ Gateway เดินทางผ่านอุโมงค์นี้ หากต้องการเลือกใช้ลักษณะการเชื่อถือของนามแฝง SSH ที่มีการจัดการเอง ให้ตั้งค่า --ssh-host-key-policy openssh ผ่าน openclaw-mac configure-remote หรือตั้งค่า gateway.remote.sshHostKeyPolicy เป็น "openssh" โดยตรง ตรวจสอบนามแฝง รวมถึงการกำหนดค่า Host * ที่ตรงกันหรือการกำหนดค่าระบบก่อนเลือกใช้ การเปลี่ยนเป้าหมาย SSH (ในแอปหรือผ่าน configure-remote) จะรีเซ็ตนโยบายกลับเป็น strict เว้นแต่คุณจะเลือกใช้อีกครั้งอย่างชัดเจนสำหรับเป้าหมายใหม่
ในโหมดอุโมงค์ SSH ชื่อโฮสต์ LAN/Tailnet ที่ค้นพบจะถูกบันทึกเป็น gateway.remote.sshTarget แอปจะคง gateway.remote.url ไว้ที่ปลายทางอุโมงค์ภายในเครื่อง (ตัวอย่างเช่น ws://127.0.0.1:18789) เพื่อให้ CLI, Web Chat และบริการโฮสต์ Node ภายในเครื่องใช้การรับส่งข้อมูลผ่าน local 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/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เพื่อให้เอเจนต์ทราบว่ามีสิ่งใดพร้อมใช้งานบ้าง
หมายเหตุด้านความปลอดภัย
- ควรเลือกใช้การผูกกับ local loopback บนโฮสต์ระยะไกล และเชื่อมต่อผ่าน SSH, Tailscale Serve หรือ URL โดยตรงบน Tailnet/LAN ที่เชื่อถือได้
- โดยค่าเริ่มต้น การสร้างอุโมงค์ SSH ต้องใช้คีย์โฮสต์ที่เชื่อถือแล้ว ให้เชื่อถือคีย์โฮสต์ก่อน (เพิ่มคีย์ลงในไฟล์ known-hosts ที่กำหนดค่าไว้) หรือตั้งค่า
gateway.remote.sshHostKeyPolicy: "openssh"อย่างชัดเจนสำหรับนามแฝงที่มีการจัดการซึ่งคุณยอมรับนโยบายการเชื่อถือของ OpenSSH - หากคุณผูก Gateway เข้ากับอินเทอร์เฟซที่ไม่ใช่ local loopback ให้กำหนดให้ใช้การยืนยันตัวตนของ Gateway ที่ถูกต้อง ได้แก่ โทเค็น รหัสผ่าน หรือพร็อกซีย้อนกลับที่รับรู้อัตลักษณ์พร้อม
gateway.auth.mode: "trusted-proxy" - ดูความปลอดภัยและTailscale
โฟลว์การเข้าสู่ระบบ WhatsApp (ระยะไกล)
- เรียกใช้
openclaw channels login --channel whatsapp --verboseบนโฮสต์ระยะไกล สแกนคิวอาร์โค้ดด้วย WhatsApp บนโทรศัพท์ของคุณ - เรียกใช้การเข้าสู่ระบบอีกครั้งบนโฮสต์นั้นหากการยืนยันตัวตนหมดอายุ การตรวจสอบสถานะจะแสดงปัญหาการเชื่อมโยง
การแก้ไขปัญหา
| อาการ | สาเหตุ / วิธีแก้ไข |
|---|---|
exit 127 / ไม่พบคำสั่ง |
openclaw ไม่ได้อยู่ใน PATH สำหรับเชลล์แบบ non-login ให้เพิ่มลงใน /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 จริงของไคลเอ็นต์ ให้เปลี่ยน การรับส่งข้อมูล เป็น โดยตรง (ws/wss) |
| แดชบอร์ดทำงานได้ แต่ความสามารถของ Mac ออฟไลน์ | การเชื่อมต่อของผู้ดำเนินการ/ส่วนควบคุมทำงานเป็นปกติ แต่การเชื่อมต่อ Node คู่หูยังไม่ได้เชื่อมต่อหรือไม่มีชุดคำสั่งที่จำเป็น เปิดส่วนอุปกรณ์ในแถบเมนูและตรวจสอบว่า Mac แสดงสถานะ จับคู่แล้ว · ไม่ได้เชื่อมต่อ หรือไม่ สำหรับปลายทาง Tailscale Serve แบบ wss://*.ts.net แอปจะตรวจพบพินใบรับรอง TLS รุ่นเก่าที่หมดอายุหลังการหมุนเวียนใบรับรอง ล้างพินที่หมดอายุเมื่อ macOS เชื่อถือใบรับรองใหม่แล้ว และลองใหม่โดยอัตโนมัติ หากระบบไม่เชื่อถือใบรับรองหรือโฮสต์ไม่ใช่ชื่อ Tailscale Serve ให้ตั้งค่า gateway.remote.tlsFingerprint เป็นลายนิ้วมือของใบรับรองที่คาดไว้ ตรวจสอบใบรับรอง หรือเปลี่ยนเป็น ระยะไกลผ่าน SSH |
| การปลุกด้วยเสียง | วลีเรียกใช้งานจะถูกส่งต่อโดยอัตโนมัติในโหมดระยะไกล โดยไม่จำเป็นต้องมีตัวส่งต่อแยกต่างหาก |
เสียงแจ้งเตือน
เลือกเสียงสำหรับการแจ้งเตือนแต่ละรายการจากสคริปต์ด้วย openclaw nodes notify ตัวอย่างเช่น:
openclaw nodes notify --node <id> --title "Ping" --body "Remote gateway ready" --sound Glassแอปไม่มีตัวเลือกเปิด/ปิดเสียงเริ่มต้นส่วนกลาง ผู้เรียกใช้จะเลือกเสียง (หรือไม่ใช้เสียง) สำหรับแต่ละคำขอ