6 คะแนน โดย GN⁺ 1 일 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ติดตั้ง Claude Code บน Mac สำรอง ที่ไม่มีข้อมูลส่วนตัว แล้วตั้งค่าให้เป็น สภาพแวดล้อมแบบสแตนด์อโลน ที่เข้าถึงได้ตลอดเวลาจาก SSH ของ Mac หลักและแอป Claude บนโทรศัพท์
  • มีระดับการแยกอุปกรณ์สูงกว่าคอนเทนเนอร์ และยังใช้ Unity รวมถึงแอป GUI เฉพาะ Mac ได้ จึงแยกความเสี่ยงของ --dangerously-skip-permissions ออกจาก Mac หลักได้
  • สร้างฐานสำหรับงานระยะไกลผ่านบัญชีผู้ดูแลระบบภายในเครื่องใหม่, sudo และ SSH แบบไม่ต้องใช้รหัสผ่าน, การป้องกันโหมดพักเครื่อง, การซิงก์คลิปบอร์ด และการติดตั้ง Claude Code
  • การควบคุม GUI ทำผ่าน เซิร์ฟเวอร์ tmux ที่ LaunchAgent คงไว้ภายในเซสชัน GUI และสิทธิ์การบันทึกหน้าจอ, การช่วยการเข้าถึง และการเข้าถึงดิสก์ทั้งหมดต้องให้คนอนุญาตเอง
  • หากเพิ่ม Remote Control, Claude in Chrome, Screen Sharing และ Tailscale จะทำได้ตั้งแต่การควบคุมผ่านโทรศัพท์ ไปจนถึงการทำงานอัตโนมัติในเบราว์เซอร์และการเชื่อมต่อจากภายนอก แต่ต้องมี การยืนยันตัวตนแยกต่างหากและการตั้งค่าสิทธิ์ของ macOS

วัตถุประสงค์และหลักการพื้นฐานของการตั้งค่า

  • สร้างสภาพแวดล้อมที่ Claude Code สามารถควบคุมได้อย่างอิสระ เพื่อมอบหมายงานวิจัยและพัฒนาให้อยู่นอก Mac หลัก
  • เอเจนต์ที่ใช้ --dangerously-skip-permissions มีสิทธิ์กว้างขวาง จึงควรรันบน อุปกรณ์แยกต่างหาก ที่ไม่มีข้อมูลส่วนตัวและ Apple ID เพื่อลดข้อมูลอ่อนไหวที่เข้าถึงได้
  • สามารถเข้าถึง Claude Code ได้ทุกเมื่อผ่านแอป Claude บนโทรศัพท์หรือ SSH จาก Mac หลัก
  • การตั้งค่าพื้นฐานต้องใช้ Mac เป้าหมาย สำรองที่เชื่อมต่อ Wi‑Fi เดียวกัน และ Mac ต้นทาง ที่ใช้เป็นประจำ

2. เหตุผลที่ใช้ Mac สำรองแทนคอนเทนเนอร์หรือ OpenClaw

  • คอนเทนเนอร์ยังคงรันอยู่บน Mac หลัก และคำขอเครือข่ายก็ผ่าน Mac หลักเช่นกัน จึงไม่ใช่การแยกอุปกรณ์โดยสมบูรณ์
  • การรัน Unity หรือแอปเฉพาะ Mac ทำได้ยาก และงาน GUI ที่ต้องคลิกหรือลากด้วยฟีเจอร์การใช้คอมพิวเตอร์ก็มีข้อจำกัด
  • การตั้งค่าด้วย Mac สำรองช่วยใช้ฟีเจอร์ล่าสุดของ Claude Code, การควบคุมผ่านแอป Claude และโควตาการใช้งานของ Claude subscription ที่มีอยู่ได้ตามเดิม
  • แยกสภาพแวดล้อมตามหลักการต่อไปนี้
    • ใช้ Mac สำรองเครื่องเก่า แทน Mac หลัก
    • สร้างบัญชีภายในเครื่องใหม่ที่ไม่มีข้อมูลส่วนตัวและ Apple ID
    • ควบคุมผ่าน SSH บนเครือข่ายภายใน และผ่านแอป Claude บนโทรศัพท์

1. รีเซ็ต Mac เป้าหมายและแยกบัญชี

  • หากมีข้อมูลส่วนตัวเดิมอยู่ เอเจนต์จะเข้าถึงได้ทั้งหมด จึงควรล้างอุปกรณ์ก่อน
    • Mac ที่รองรับ: System Settings → General → Transfer or Reset → Erase All Content and Settings
    • Mac Intel รุ่นเก่า: ระหว่างบูตให้กด Cmd-R เพื่อเข้า Recovery ใช้ Disk Utility ล้างไดรฟ์ภายใน แล้วติดตั้ง macOS ใหม่
  • หากจำเป็น ให้อัปเดตเป็น macOS เวอร์ชันล่าสุดที่ System Settings → General → Software Update
  • สร้าง บัญชีผู้ใช้ภายในเครื่อง ใหม่ และข้ามการเข้าสู่ระบบ Apple ID
  • ให้สิทธิ์ผู้ดูแลระบบแก่บัญชีเพื่อให้ใช้ sudo ได้
    • เปิดใช้งาน Allow this user to administer this computer ใน System Settings → Users & Groups
    • เมื่อกู้คืนจากบัญชีผู้ดูแลระบบอื่น สามารถใช้ sudo dseditgroup -o edit -a <user> -t user admin ได้

2. เปิดใช้งานการเข้าสู่ระบบระยะไกลผ่าน SSH

  • บน Mac เป้าหมาย ให้เปิดใช้งาน Remote Login ด้วยคำสั่งต่อไปนี้
sudo systemsetup -setremotelogin on
  • หากเกิดข้อผิดพลาด Turning Remote Login on or off requires Full Disk Access privileges ให้ให้สิทธิ์ Full Disk Access แก่ Terminal
    • เพิ่ม Applications → Utilities → Terminal ใน System Settings → Privacy & Security → Full Disk Access
    • ปิด Terminal แล้วเปิดใหม่ จากนั้นรันคำสั่งอีกครั้ง

3. ตั้งค่า sudo แบบไม่ต้องใช้รหัสผ่าน

  • สร้างกฎรายบัญชีใน /etc/sudoers.d/ เพื่อไม่ให้เอเจนต์และคำสั่ง SSH ต้องขอรหัสผ่านทุกครั้ง
echo "<user> ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/<user>-nopasswd >/dev/null
sudo chmod 440 /etc/sudoers.d/<user>-nopasswd
sudo visudo -cf /etc/sudoers.d/<user>-nopasswd
  • คำสั่งแรกบันทึกกฎ และคำสั่งที่สองตั้งค่าสิทธิ์แบบอ่านอย่างเดียวตามที่ sudo ต้องการ
  • การตรวจสอบครั้งสุดท้ายต้องแสดงผล parsed OK เสมอ และไวยากรณ์ sudoers ที่ผิดอาจทำให้เข้าถึง sudo ไม่ได้
  • หาก sudo -n true สำเร็จโดยไม่มีเอาต์พุต แสดงว่า sudo แบบไม่ต้องใช้รหัสผ่าน ทำงานแล้ว

4. ตรวจสอบที่อยู่ของ Mac เป้าหมาย

  • เนื่องจาก IP อาจเปลี่ยนหลังรีบูตหรือเมื่อเวลาผ่านไป แนะนำให้ใช้ ชื่อโฮสต์ แบบคงที่
scutil --get LocalHostName
  • นำชื่อที่แสดงผลมาเติม .local แล้วใช้เป็น <target-host>.local
  • หากชื่อ .local ของ Mac สองเครื่องในเครือข่ายเดียวกันซ้ำกัน อาจเชื่อมต่อผิดเครื่องได้ จึงควรกำหนดชื่อที่ไม่ซ้ำ
sudo scutil --set LocalHostName newmacbook
  • หากต้องการ IP สามารถตรวจสอบด้วย ipconfig getifaddr en0 แต่ IP อาจเปลี่ยนได้
  • หลังจากนี้ให้ใช้ที่อยู่ในรูปแบบ <user>@<target-host>.local

5. ตั้งค่า SSH แบบไม่ต้องใช้รหัสผ่านจาก Mac ต้นทาง

  • หากยังไม่มีคีย์ SSH เดิม ให้สร้างคีย์ Ed25519 บน Mac ต้นทาง
ssh-keygen -t ed25519
ssh-copy-id <user>@<target-host>.local
  • ป้อนรหัสผ่านของบัญชีเป้าหมายหนึ่งครั้งเมื่อติดตั้ง public key
  • หากคำสั่งต่อไปนี้แสดงชื่อผู้ใช้เป้าหมายโดยไม่ต้องป้อนรหัสผ่าน แสดงว่าตั้งค่าเสร็จแล้ว
ssh <user>@<target-host>.local whoami

6. ป้องกันโหมดพักเครื่องและการล็อกอัตโนมัติ

  • macOS อาจเข้าสู่โหมดพักเครื่องหลังไม่มีการใช้งานประมาณ 10 นาที แม้ต่อไฟอยู่ ทำให้หายไปจากเครือข่ายได้ จึงปิดใช้งานโหมดพักเครื่อง
sudo pmset -c sleep 0
sudo pmset -c disablesleep 1
sudo pmset -c displaysleep 0
  • แต่ละคำสั่งจะป้องกันการพักเครื่องของระบบขณะชาร์จ, ป้องกันการพักเครื่องเมื่อปิดฝา และป้องกันการพักจอแสดงผล
  • ตรวจสอบ sleep 0, SleepDisabled 1, displaysleep 0 ในเอาต์พุตของ pmset -g | grep -iE 'sleep'
  • หากต้องการให้ใช้กับแบตเตอรี่ด้วย ให้ใช้ -a แทน -c แต่จะใช้แบตเตอรี่มากขึ้น
  • ป้องกันการล็อกอัตโนมัติจาก screen saver ด้วย
defaults -currentHost write com.apple.screensaver idleTime 0

7. ซิงก์คลิปบอร์ดผ่าน SSH

  • เมื่อต่อ pbcopy และ pbpaste ของ macOS ผ่าน SSH จะส่งข้อความแบบ P2P ที่เข้ารหัสได้โดยไม่ต้องใช้ Apple ID หรือบริการภายนอก
  • clip.sh รองรับการส่งรูปภาพด้วย
curl -fsSL https://raw.githubusercontent.com/ykdojo/claude-controls-mac/… -o ~/.local/bin/clip
chmod +x ~/.local/bin/clip
export IC_BOX="<user>@<target-host>.local"
  • เพิ่มการตั้งค่า IC_BOX ลงใน ~/.zshrc
  • clip send ส่งข้อความหรือรูปภาพจาก Mac ต้นทางไปยังเครื่องเป้าหมาย และสามารถวางรูปภาพลงในเซสชัน Claude Code ของเครื่องเป้าหมายด้วย Ctrl-V ได้
  • clip get ดึงคลิปบอร์ดของ Mac เป้าหมายมายัง Mac ต้นทาง

8. ติดตั้ง Claude Code

  • ติดตั้ง Claude Code เวอร์ชันเฉพาะบน Mac เป้าหมายผ่าน SSH จาก Mac ต้นทาง
ssh <user>@<target-host>.local 'curl -fsSL https://claude.ai/install.sh | bash -s -- 2.1.201'
  • สามารถระบุ latest หรือ stable แทนเวอร์ชัน 2.1.201 ได้
  • หากมีคำเตือน PATH ของ ~/.local/bin ให้เพิ่มเส้นทางลงใน ~/.zshenv ซึ่ง zsh ทุกตัวอ่าน
ssh <user>@<target-host>.local 'echo '\''export PATH="$HOME/.local/bin:$PATH"'\'' >> ~/.zshenv'

9. ติดตั้งสภาพแวดล้อมที่เป็นมิตรกับ Claude Code แบบเลือกได้

  • setup-claude-env.sh ซึ่งเป็นตัวเลือก จะติดตั้ง alias ของเชลล์, ปลั๊กอิน DX, ปรับ settings.json, ติดตั้ง GitHub CLI และ Playwright MCP·yt-dlp แบบเลือกได้
  • ดูองค์ประกอบทั้งหมดได้ที่ claude-env-components.md
  • เมื่อรันแบบโต้ตอบ จะเลือกค่าพื้นฐานไว้ให้ และมีเช็กลิสต์ที่รายการติดตั้งแบบเลือกได้ถูกปิดไว้
ssh -t <user>@<target-host>.local \
  'curl -fsSL https://raw.githubusercontent.com/ykdojo/claude-controls-mac/… -o setup-claude-env.sh && bash setup-claude-env.sh'
  • การรันแบบไม่โต้ตอบจะติดตั้งเฉพาะรายการหลักโดยค่าเริ่มต้น และรองรับแฟล็ก --yt-dlp, --playwright, --all, --core
  • สคริปต์มี idempotency จึงรันซ้ำได้

10. ล็อกอิน Claude และ GitHub

  • เชื่อมต่อเข้า Mac เป้าหมายผ่าน SSH แล้วรัน claude จากนั้นล็อกอินบัญชี Anthropic ด้วยขั้นตอนผ่านเบราว์เซอร์และรหัสอุปกรณ์ที่สามารถทำให้เสร็จบนเบราว์เซอร์ของ Mac หลักได้
  • แนะนำให้เพิ่มการล็อกอิน GitHub ด้วย gh auth login สำหรับงานกับ repository
  • เพื่อไม่ให้เอเจนต์กระทบกับบัญชีหลัก การใช้ บัญชี GitHub แยกต่างหาก จะปลอดภัยกว่า

11. ฟังก์ชันการใช้คอมพิวเตอร์ผ่าน SSH

  • วิธีเชื่อมต่อกับเซสชัน GUI

    • โปรเซส SSH ไม่สามารถใช้สิทธิ์การบันทึกหน้าจอและการช่วยการเข้าถึงที่ผูกกับเซสชันล็อกอิน GUI ได้โดยตรง
    • LaunchAgent จะดูแล tmux server และเซสชัน anchor cc ไว้ที่ socket คงที่ภายในเซสชัน GUI
    • Claude Code ที่เริ่มภายในเซิร์ฟเวอร์นั้นจะสืบทอดเซสชัน GUI จึงเข้าถึงภาพหน้าจอ การควบคุมเมาส์และคีย์บอร์ดได้
  • การติดตั้ง

    ssh -t <user>@<target-host>.local \
      'curl -fsSL https://raw.githubusercontent.com/ykdojo/claude-controls-mac/… -o setup-computer-use.sh && bash setup-computer-use.sh'
    
    • ติดตั้ง LaunchAgent และ tmux anchor พร้อมเปิดใช้เครื่องมือ computer-use ในตัวที่ ~/.claude.json
    • ต้องมี tmux และแผน Claude Pro หรือ Max โดยสคริปต์รันซ้ำได้ และลบออกได้ด้วย --uninstall
  • จัดการเซสชันด้วยคำสั่ง ic

    • ติดตั้ง ic.sh บน Mac ต้นทาง
    curl -fsSL https://raw.githubusercontent.com/ykdojo/claude-controls-mac/… -o ~/.local/bin/ic
    chmod +x ~/.local/bin/ic
    echo 'export IC_BOX="<user>@<target-host>.local"' >> ~/.zshrc
    
    • คำสั่งหลักมีดังนี้
      • ic: เซสชัน Claude ใหม่
      • ic -c, ic -r: ทำบทสนทนาล่าสุดต่อ หรือเปิดตัวเลือกเพื่อกลับมาใช้งานต่อ
      • ic --chrome: รันพร้อม Claude in Chrome
      • ic sh: เชลล์ทั่วไปของเครื่องเป้าหมาย
      • ic vnc: เปิด Screen Sharing
      • ic rc: เซิร์ฟเวอร์ Remote Control สำหรับโทรศัพท์
      • ic history, ic ls: ดูบทสนทนาที่บันทึกไว้และเซสชันที่กำลังรัน
      • ic attach <id>, ic kill <id>, ic kill-all, ic kill-except: จัดการการเชื่อมต่อ·การสิ้นสุดเซสชัน
    • เซสชัน ic ทั้งหมดรันด้วย --dangerously-skip-permissions และ ic rc ใช้ --permission-mode bypassPermissions
    • ภายใน tmux นั้น Terminal.app จะไม่ได้รับลำดับคลิปบอร์ด OSC52 ที่ Claude ส่งออกมา ดังนั้นหากต้องการคัดลอกทั้งหน้าจอ ให้ใช้ Cmd-A แล้วตามด้วย Cmd-C
  • การมอบหมายงานระหว่างเอเจนต์

    • Claude Code บน Mac ต้นทางสามารถใช้ SSH และ tmux send-keys เพื่อส่งพรอมป์ไปยังเซสชัน Claude ที่กำลังรันอยู่บนเครื่องเป้าหมายได้
    • สำหรับพรอมป์ยาว ๆ Enter ที่รวมอยู่ในชุดการส่งเดียวกับข้อความอาจไม่ถูกประมวลผลเป็นการส่งคำสั่ง จึงควรรอสักครู่แล้วส่ง Enter อีกครั้งหนึ่ง
    • สามารถอ่านคำตอบด้วย tmux capture-pane และ tail แล้วตรวจซ้ำจนกว่างานจะเสร็จ
  • สิทธิ์ที่มนุษย์ต้องให้โดยตรง

    • สิทธิ์การบันทึกหน้าจอและการช่วยการเข้าถึงต้องได้รับการอนุมัติจากมนุษย์โดยตรงใน GUI ของ macOS และไม่สามารถทำด้วยการคลิกจำลองได้
    • ต้องอนุมัติคำขออนุญาต bypass the window picker ที่ปรากฏตอนจับภาพครั้งแรกด้วย และอาจปรากฏอีกประมาณเดือนละครั้ง
    • เป้าหมายของสิทธิ์ไม่ใช่ claude แต่เป็น ไบนารี tmux ซึ่งเป็นโปรเซสที่รับผิดชอบ
      • เส้นทาง Intel: /usr/local/bin/tmux
      • เส้นทาง Apple Silicon: /opt/homebrew/bin/tmux
    • การบันทึกหน้าจออนุญาตให้ถ่ายภาพหน้าจอ ส่วนการช่วยการเข้าถึงอนุญาตให้ควบคุมเมาส์·คีย์บอร์ด
    • เนื่องจากสถานะสิทธิ์ถูกแคชเมื่อโปรเซสเริ่มต้น หลังให้สิทธิ์แล้วต้องรีสตาร์ตเซิร์ฟเวอร์ด้วย tmux -S /tmp/cc-tmux.sock kill-server
    • หาก tmux ไม่ปรากฏในรายการการตั้งค่า ให้ขอให้ Claude ใน ic ถ่ายภาพหน้าจอ เพื่อให้เกิดคำขอสิทธิ์ขึ้นก่อน
    • หากไม่ต้องการให้ macOS เวอร์ชันใหม่ถามการเข้าถึงข้อมูลรายแอปซ้ำ ๆ ให้ให้สิทธิ์ Full Disk Access แก่ tmux แล้วรีสตาร์ตเซิร์ฟเวอร์

12. ติดตั้ง VPN และแอป GUI อื่น ๆ

  • สามารถติดตั้ง VPN เช่น Proton VPN เพื่อแยกทราฟฟิกของ Mac เป้าหมายออกจาก IP ภายในเครื่องได้
  • หากตั้งค่าฟังก์ชันการใช้คอมพิวเตอร์แล้ว สามารถขอให้ Claude ใน ic ติดตั้งแอปได้ แต่งานต่อไปนี้ต้องให้มนุษย์จัดการ
    • แม้เป็นแพ็กเกจฟรีก็ต้องมีข้อมูลล็อกอิน และสามารถส่งรหัสผ่านผ่าน clip send ได้
    • ต้องอนุมัติสิทธิ์การกำหนดค่า VPN·เครือข่ายสำหรับการเชื่อมต่อครั้งแรก และคำขอรหัสผ่าน Mac
    • การควบคุมแอปที่เป็น GUI เท่านั้นต้องใช้ฟังก์ชันการใช้คอมพิวเตอร์
  • หลังจากล็อกอินแล้ว เอเจนต์สามารถเชื่อมต่อและสลับเซิร์ฟเวอร์ได้ และสามารถนำ flow เดียวกันไปใช้กับแอปพลิเคชันอื่นได้

13. ควบคุมจากโทรศัพท์

  • หากรัน /remote-control หรือ /rc ในเซสชันเดิม จะสามารถควบคุมเซสชันเดียวกันต่อผ่านแอป Claude ได้
  • claude remote-control รองรับทั้งการเชื่อมต่อเซสชันเดิมจากโทรศัพท์และการสร้างเซสชันใหม่
  • หากเริ่มด้วย ic rc เซสชันที่สร้างจากโทรศัพท์ก็จะเข้าถึง ฟังก์ชันการใช้คอมพิวเตอร์ ของ Mac เป้าหมายได้

14. การตั้งค่า Claude in Chrome

  • ฟีเจอร์ใช้งานคอมพิวเตอร์ทั่วไปสามารถเห็นหน้าจอเบราว์เซอร์ได้ แต่มีข้อจำกัดในการคลิกหรือพิมพ์
  • ส่วนขยาย Claude in Chrome รองรับการนำทาง การคลิก การกรอกฟอร์ม และการอ่านคอนโซลล็อกกับคำขอเครือข่าย
  • ต่างจาก Playwright MCP ตรงที่ใช้โปรไฟล์ Chrome ปกติของ Mac ปลายทาง จึงสามารถใช้สถานะที่ล็อกอินไว้แล้วได้
  • Mac ปลายทางต้องมี Chrome และการสมัครสมาชิก Anthropic แบบ Pro, Max, Team หรือ Enterprise โดยตรง
  • งานต่อไปนี้ต้องให้คนดำเนินการเอง
    • คลิก Add to Chrome ใน Chrome Web Store
    • ล็อกอินบัญชี Claude ในส่วนขยาย โดยสามารถส่งข้อมูลรับรองผ่าน clip send ได้
  • ใน Claude Code ให้รัน /chrome เพื่อเปิดใช้เป็นค่าเริ่มต้น หรือใช้ claude --chrome หรือ ic --chrome แยกตามเซสชัน
  • หากเชื่อมต่อไม่ได้ ให้รีสตาร์ท Chrome หนึ่งครั้ง
  • สคริปต์สภาพแวดล้อมในขั้นตอนที่ 9 ใช้การอ้างอิงองค์ประกอบของ accessibility tree แทนพิกัด และเพิ่มคำสั่งใน ~/.claude/CLAUDE.md เพื่อหลีกเลี่ยงการจับภาพหน้าจอที่ไม่ได้ร้องขอ
  • หาก Chrome ทั้งฝั่งต้นทางและปลายทางรันส่วนขยายของบัญชีเดียวกันพร้อมกัน จะมีคำขอให้เลือกปรากฏขึ้น และมี issue #74667 ที่อาจระบุเครื่อง local ผิดได้
    • สามารถหลีกเลี่ยงได้โดยลบส่วนขยายบน Mac ต้นทางชั่วคราว หรือปิด Chrome ของฝั่งต้นทาง
  • เซสชันที่สร้างจากโทรศัพท์ยังไม่มีเครื่องมือเบราว์เซอร์ให้ใช้ในปัจจุบัน ตาม issue #74671
    • เริ่มเซสชันจากเทอร์มินัลก่อน แล้วเชื่อมต่อโทรศัพท์ด้วย /rc

15. macOS Screen Sharing

  • ด้วย Screen Sharing ในตัว สามารถตรวจสอบหน้าจอปลายทางแบบเรียลไทม์จาก Mac ต้นทาง และควบคุมเมาส์กับคีย์บอร์ดได้โดยตรง
  • ตั้งแต่ macOS 12.1 เป็นต้นไป ไม่สามารถเปิดใช้ผ่าน command line ได้ จึงต้องตั้งค่าจาก GUI ของเครื่องปลายทาง
  • เปิด Screen Sharing ที่ System Settings → General → Sharing
    • หาก Remote Management เปิดอยู่จนไม่เห็นสวิตช์ ให้ปิดก่อน
  • เชื่อมต่อจาก Mac ต้นทางด้วยคำสั่งต่อไปนี้
open vnc://<user>@<target-host>.local
  • ล็อกอินด้วยรหัสผ่านบัญชีของเครื่องปลายทาง และสามารถเลือกบันทึกรหัสผ่านใน Keychain ได้

16. การเข้าถึงเครือข่ายภายนอกผ่าน Tailscale

  • ที่อยู่ .local ใช้งานได้เฉพาะใน LAN แต่ Tailscale ทำให้สามารถใช้ SSH, ic, clip และ Screen Sharing จากเครือข่ายภายนอกได้ผ่านอุโมงค์ WireGuard แบบ P2P ที่เข้ารหัสตั้งแต่ต้นทางถึงปลายทาง
  • ไม่เปิดเผยบริการต่ออินเทอร์เน็ตสาธารณะ และเมื่ออยู่ในเครือข่ายบ้านจะใช้เส้นทาง LAN โดยตรง
  • การเข้าร่วมเครือข่าย Tailscale ให้เพียงความสามารถในการเข้าถึงกันระหว่างอุปกรณ์ ดังนั้นยังคงต้องใช้คีย์ SSH หรือรหัสผ่าน Screen Sharing
  • ติดตั้งบน Mac ปลายทางแบบ headless แล้วล็อกอินจาก URL ที่แสดงผล
ssh <user>@<target-host>.local 'brew install tailscale'
ssh <user>@<target-host>.local 'sudo brew services start tailscale'
ssh <user>@<target-host>.local 'sudo tailscale up --operator=<user>'
  • ติดตั้งบน Mac ต้นทางด้วย และล็อกอินด้วย บัญชี Tailscale เดียวกัน กับปลายทาง
brew install --cask tailscale-app
  • หากใช้ MagicDNS ที่เปิดใช้เป็นค่าเริ่มต้น จะเข้าถึงได้จากทุกที่ด้วยชื่อโฮสต์โดยตัด .local ออก
export IC_BOX="<user>@<target-host>"


# export IC_BOX="<user>@<target-host>.local"
  • เปลี่ยนที่อยู่ Screen Sharing เป็น open vnc://<user>@<target-host> ด้วย
  • แนะนำให้ตั้งค่าความปลอดภัยและความพร้อมใช้งานต่อไปนี้ใน คอนโซลผู้ดูแล
    • เปิดใช้ device approval เพื่อไม่ให้อุปกรณ์ใหม่เข้าร่วมได้ด้วยการขโมยข้อมูลล็อกอินเพียงอย่างเดียว
    • ปิดใช้ key expiry เพื่อไม่ให้อุปกรณ์ปลายทางถูกตัดการเชื่อมต่อเพราะคีย์หมดอายุหลังประมาณ 180 วัน
  • ตรวจสอบการเชื่อมต่อระยะไกลจริงโดยเชื่อมต่อ Mac ต้นทางกับเครือข่ายอื่น เช่น ฮอตสปอตมือถือ แล้วใช้ ic ls

1 ความคิดเห็น

 
GN⁺ 1 일 전
ความคิดเห็นใน Hacker News
  • ถ้าไม่ใช่งานพัฒนาแบบกราฟิกตามที่บทความพูดถึง ก็ไม่มีเหตุผลต้องแยกเอเจนต์ไปไว้บนฮาร์ดแวร์จริง ผมเขียนสคริปต์ที่สร้างเดสก์ท็อปกราฟิกสำหรับ Claude โดยเฉพาะด้วย libvirt และให้มันรันการทดสอบรับรองผู้ใช้ใน Chrome ได้ด้วย
    ถึงจะให้ สิทธิ์ root ทั้งหมด ถ้ามีปัญหาก็ทิ้งแล้วติดตั้งใหม่ได้ในไม่กี่วินาที

    • ผมมักสร้างผู้ใช้แยกด้วย sudo useradd agent, sudo su agent เพื่อให้เอเจนต์พังได้แค่ไฟล์ของตัวเอง ผมก็เคยให้มันถ่ายภาพหน้าจอด้วย headless Chrome และตั้งค่า VNC แต่ไม่ค่อยคุ้มที่จะใช้
      แม้แต่บน VPS ราคา 3 ดอลลาร์ ถ้าพังก็ติดตั้งใหม่ได้ทันที เลยสนุกดีที่จะให้ root กับเอเจนต์
    • สามารถรัน macOS guest ใน virtual machine บน Mac host ได้ และ Apple ก็อนุญาตเรื่องนี้ไว้อย่างชัดเจน
    • ถ้ามีพื้นที่พอ คุณก็สร้าง iMessage สำหรับ Claude โดยเฉพาะใน virtual machine ได้ แต่จะใช้ฮาร์ดแวร์ Apple เก่าที่เหลืออยู่ก็ได้เหมือนกัน
    • สคริปต์นี้ดูเหมือนเป็นโค้ดที่ Claude สร้างขึ้น ผมอ่านไปราว 250 บรรทัดแล้วเริ่มหมดความสนใจเพราะโค้ดไม่ค่อยสม่ำเสมอจนน่าเหนื่อย
  • ผมนึกไม่ออกจริง ๆ ว่าจะใช้ AI แบบ ช่วยงานได้ตลอด 24 ชั่วโมง ไปทำอะไร แต่ก็อยากรู้สึกว่าตัวเองจำเป็นต้องใช้เหมือนกัน

    • คนที่ชำนาญ Claude Code แทบไม่ใช้ IDE เลย ดังนั้นนอกจากความเคยชินแล้วก็แทบไม่มีเหตุผลว่าทำไมจะทำงานจากมือถือแทนโน้ตบุ๊กไม่ได้
      เวลาข้างนอกแล้ว Datadog, cloud log, GitHub alert เข้ามาพร้อมกัน คุณสามารถให้ Claude Code ไปสืบแล้วจัดหมวดว่า “API ของธนาคารพาร์ตเนอร์มี timeout เกิดขึ้นในราว 15% ของคำขอตั้งแต่หนึ่งชั่วโมงก่อน” ได้ จากนั้นติดต่อคนรับผิดชอบแล้วกลับไปใช้ชีวิตสุดสัปดาห์ต่อ
      ระบบ on-call ที่ดีจริง ๆ คงดีกว่า แต่ถ้าดูจากความยืดหยุ่นที่งานให้มา ก็พอยอมรับ Slack alert ช่วงสุดสัปดาห์ได้
    • ผมให้ Claude คอยเฝ้างาน วิเคราะห์ข้อมูลเชิงวิทยาการข้อมูล ที่ใช้เวลาหลายชั่วโมงเป็นหลัก รับการแจ้งเตือนผ่านรีโมตคอนโทรลเมื่อเสร็จหรือเมื่อมันต้องการการยืนยันเพิ่ม และถ้ามีไอเดียใหม่ก็โยนเข้าคิวงานได้ทันที
      หลายครั้งฮาร์ดแวร์กลายเป็นคอขวดมากกว่าขีดจำกัดของแพ็กเกจสมัครสมาชิก
    • เวลายังเหลือโทเคน ผมใช้มันกับ fuzzing ที่อาศัยความรู้เรื่องโดเมนและซอร์สโค้ดเพื่อเลือกวิธี fuzzing รวมถึงปัญหา optimization คล้าย ๆ กัน และการรัน SkillOpt ของ Microsoft
    • ผมใช้ Claude Cowork สร้าง เช็กลิสต์และแบ็กอัป เพื่อให้ติดตั้งโน้ตบุ๊กใหม่ได้อย่างปลอดภัย ให้มันตรวจ SSH settings, แอป, ดาวน์โหลด, เอกสาร ฯลฯ แล้วจัดการแบ็กอัป จากนั้นก็ให้เขียนขั้นตอนกู้คืนหลังติดตั้งใหม่ ทำให้ผมปิดงานที่ผัดวันมานานได้
    • งานที่มีประโยชน์คือให้มันควบคุม Google Chrome และ Figma แบบ GUI ในสภาพแวดล้อมแยกต่างหาก, รันงานเกิน 1 ชั่วโมงโดยปิดคอมหลักไว้, และแยกงานที่กิน CPU กับทรัพยากรมากอย่าง Gemma, Whisper, Qwen ออกไป
  • แทนที่จะติดตั้ง Claude บนพีซีเครื่องที่สามแล้วพยายามตามให้ทันด้วยการปล่อยให้มันหลอนสร้างโค้ดที่ไม่มีใครต้องการไปเรื่อย ๆ ผมขอ เขียนโค้ดเอง ดีกว่า เพราะผมสนุกกับการเขียนโค้ดอยู่แล้ว

  • ผมตั้งค่า Mac เก่าในลักษณะคล้ายกันเพื่อเป็นตัวแทนฟรีของบอต OpenClaw แม้บางครั้งการเชื่อมต่อจะหลุดแล้วต้องรับช่วงต่อใหม่จากมือถือ แต่พอรัน Homebridge ที่ Claude ควบคุมได้ไปด้วย มันก็ใช้งานได้ดีมาก

  • ผมติดตั้ง Claude Desktop บน Mac mini M4 แยกต่างหากแล้วควบคุมผ่าน Dispatch อยู่ สงสัยว่ามีเหตุผลอะไรให้เปลี่ยนไปใช้วิธีนี้ ทั้งที่ตอนนี้ Claude ก็ควบคุม local account ที่ผมให้ไปได้หมดอยู่แล้ว

    • การประมวลผลส่วนใหญ่ก็เกิดที่ฝั่ง Anthropic อยู่แล้ว เลยสงสัยว่าทำไมถึงต้องใช้ M4 ถ้าไม่ได้รันแอปที่กินทรัพยากรมากเป็นพิเศษก็ดูสเปกเกินไป
    • RC ทรงพลังกว่า Dispatch และให้ประสบการณ์ใกล้กับการใช้ Claude Code โดยตรงมากกว่า แต่เมื่อเทียบกับ sandbox ของ Claude แล้ว แม้แต่โหมด RC ก็ยังมีฟีเจอร์ที่ขาดไป
      แทนที่จะต้องรัน RC ในแต่ละ host session ผมอยากให้ Claude ใช้คอมของผมเป็น sandbox host มากกว่า ตอนนี้เลยใช้การตั้งค่าชั่วคราวที่มี master RC session คอยสร้างหน้าต่าง tmux ใหม่และ Claude RC session ใหม่สำหรับงานเขียนโค้ดแต่ละงาน
      ถ้า RC มีบั๊ก ผมก็ยังใช้ Code โดยตรงจาก Termux ได้ แต่ permission interface ของ iOS ค่อนข้างไม่นิ่ง
    • Dispatch/Cowork โดยแก่นแท้แล้วคือ Claude Code ในคอนเทนเนอร์ ส่วน “Why not run it in a container?” ในบทความก็คือคำตอบ และ Cowork บางครั้งก็อ่านหรือเขียน PDF กับไฟล์อื่นไม่ได้เพราะสิทธิ์ของคอนเทนเนอร์ แต่ Claude Code ปกติใช้ curl กับ wget ได้ไม่มีปัญหา
    • Dispatch ไม่เหมือนวิธีนี้ และสะดวกมากสำหรับงานบางอย่างรวมถึง connector แต่ก็เริ่มให้ความรู้สึกเหมือนเป็น ฟีเจอร์ที่ค่อย ๆ พอกทับบน Cowork โดยไม่มีแนวทางรวมศูนย์ที่ครอบคลุมมือถือ เดสก์ท็อป และโน้ตบุ๊ก
  • แม้จะแก้ข้อจำกัดทั้งหมดไม่ได้ แต่คุณสามารถใช้ UTM ติดตั้ง macOS และ Claude Code ใน virtual machine บน Mac ได้ UTM รันได้แม้ใช้บัญชีที่ไม่ใช่แอดมิน และใช้ เครื่องมือแบบเนทีฟของ Mac ได้เกือบทั้งหมด
    แต่ UI ของ Claude Code ใน virtual machine ของ UTM ไม่ค่อยดีในแง่ประสิทธิภาพแบบโต้ตอบ และผมก็ไม่แน่ใจว่าการเข้าไปทางเทอร์มินัลจากบัญชี non-admin บน host จะช่วยเลี่ยงปัญหานี้ได้ไหม

    • UTM ไม่รองรับการเร่งกราฟิก ทำให้ความสามารถของเบราว์เซอร์มีข้อจำกัด แม้จะไม่ต้องใช้การเร่งกราฟิก เบราว์เซอร์ที่รันในระบบปฏิบัติการเสมือนของ UTM ก็ยังไม่ผ่าน CAPTCHA สมัยใหม่บางแบบและการตรวจ browser fingerprinting
  • ผมรีบิลด์ โฮมแล็บ·มีเดียเซิร์ฟเวอร์ ด้วย HP EliteDesk ที่ใช้ i5 แทน NUC เก่าที่แก้ปัญหาความร้อนไม่ได้ โดยตั้ง virtual machine สำหรับการแยกสภาพแวดล้อมบน Ubuntu พื้นฐาน รัน Claude พร้อมทดสอบ Dispatch หรือไม่ก็ติดตั้ง Claude Code ตรง ๆ แล้วใช้แอป Moshi บน iPhone·iPad

    • ผมก็รัน Claude บน Ubuntu virtual machine เหมือนกัน และให้มันทำงานที่เมื่อก่อนจะปล่อยเป็นงานตามเวลา ถ้าไม่ต้องใช้ iMessage ก็สงสัยว่าการตั้งค่าบน Mac มีข้อดีเพิ่มเติมอะไร
  • ผมก็จัดแบบคล้ายกันด้วย M2 รุ่นเก่า มันไม่พอสำหรับรันโมเดลโลคัลที่แรงพอ แต่สำหรับ OpenClaw กับ Claude นี่สมบูรณ์แบบ
    น่าแปลกที่ตอนนี้ราคา MacBook M1·M2 ก็ถูกลงจนเทียบกับ Mac mini ได้แล้ว

    • ของผมกลับกัน คือใช้ Framework Desktop สเปกแรงเป็น เครื่อง AI แบบ headless แล้วใช้ M1 MacBook Pro เป็นเครื่องประจำวัน ซึ่งก็เวิร์กดี
    • MacBook Air และ MacBook ที่มีแรม 16GB ขึ้นไป แพงเกินไปแล้ว น่าจะเพราะความต้องการแบบนี้