- Cài Claude Code trên một máy Mac dư không có dữ liệu cá nhân, cấu hình thành môi trường chạy độc lập luôn có thể truy cập từ SSH trên máy Mac chính và ứng dụng Claude trên điện thoại
- Mức độ cô lập thiết bị cao hơn container, đồng thời vẫn dùng được Unity và các ứng dụng GUI chỉ có trên Mac, nên có thể tách rủi ro của
--dangerously-skip-permissions khỏi máy Mac chính
- Thiết lập tài khoản quản trị viên cục bộ mới,
sudo·SSH không cần mật khẩu, chống ngủ, đồng bộ clipboard và cài Claude Code để xây dựng nền tảng làm việc từ xa
- Điều khiển GUI được triển khai bằng tmux server do LaunchAgent duy trì trong phiên GUI; quyền ghi màn hình, Trợ năng và Toàn quyền truy cập đĩa phải do con người tự cấp
- Khi bổ sung Remote Control, Claude in Chrome, Screen Sharing và Tailscale, có thể điều khiển từ điện thoại, tự động hóa trình duyệt và truy cập từ bên ngoài, nhưng cần xác thực riêng và thiết lập quyền trên macOS
Mục đích cấu hình và nguyên tắc cơ bản
- Tạo một môi trường để Claude Code tự vận hành và giao các tác vụ nghiên cứu·phát triển ra ngoài máy Mac chính
- Tác nhân dùng
--dangerously-skip-permissions có quyền rất rộng, vì vậy nên chạy trên thiết bị riêng không có dữ liệu cá nhân và Apple ID để giảm thông tin nhạy cảm mà nó có thể truy cập
- Có thể truy cập Claude Code bất cứ lúc nào qua ứng dụng Claude trên điện thoại hoặc SSH từ máy Mac chính
- Cấu hình cơ bản cần một máy Mac đích dư đang kết nối cùng Wi‑Fi và một máy Mac nguồn dùng hằng ngày
Vì sao dùng một máy Mac dư thay vì container hay OpenClaw
- Container vẫn chạy trên máy Mac chính và các yêu cầu mạng cũng đi qua máy Mac chính, nên không phải là tách biệt thiết bị hoàn toàn
- Khó chạy Unity hoặc các ứng dụng chỉ có trên Mac, và cũng bị hạn chế với các tác vụ GUI cần nhấp·kéo thả bằng tính năng sử dụng máy tính
- Cấu hình bằng máy Mac dư tận dụng nguyên vẹn các tính năng Claude Code mới nhất, khả năng điều khiển từ ứng dụng Claude và hạn mức của gói Claude đang có
- Môi trường được tách biệt theo các nguyên tắc sau
- Dùng máy Mac cũ dư ra thay vì máy Mac chính
- Tạo tài khoản cục bộ mới không có dữ liệu cá nhân và Apple ID
- Điều khiển bằng SSH trong mạng nội bộ, và bằng ứng dụng Claude trên điện thoại
1. Đặt lại máy Mac đích và cô lập tài khoản
- Nếu còn dữ liệu cá nhân hiện có thì tác nhân sẽ truy cập được toàn bộ, vì vậy hãy xóa thiết bị trước
- Mac được hỗ trợ: System Settings → General → Transfer or Reset → Erase All Content and Settings
- Mac Intel đời cũ: khi khởi động nhấn
Cmd-R để vào Recovery, xóa ổ đĩa trong bằng Disk Utility rồi cài lại macOS
- Nếu cần, cập nhật lên macOS mới nhất tại System Settings → General → Software Update
- Tạo tài khoản người dùng cục bộ mới và bỏ qua đăng nhập Apple ID
- Cấp quyền quản trị cho tài khoản để có thể dùng
sudo
- Trong System Settings → Users & Groups, bật
Allow this user to administer this computer
- Khi khôi phục từ tài khoản quản trị khác, có thể dùng
sudo dseditgroup -o edit -a <user> -t user admin
2. Bật đăng nhập từ xa SSH
- Trên máy Mac đích, bật Remote Login bằng lệnh sau
sudo systemsetup -setremotelogin on
- Nếu gặp lỗi
Turning Remote Login on or off requires Full Disk Access privileges, hãy cấp Full Disk Access cho Terminal
- Trong System Settings → Privacy & Security → Full Disk Access, thêm Applications → Utilities → Terminal
- Thoát Terminal rồi mở lại và chạy lại lệnh
3. Thiết lập sudo không cần mật khẩu
- Để tác nhân và lệnh SSH không phải yêu cầu mật khẩu mỗi lần, tạo quy tắc theo từng tài khoản trong
/etc/sudoers.d/
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
- Lệnh đầu ghi quy tắc, lệnh thứ hai đặt quyền chỉ đọc mà
sudo yêu cầu
- Ở bước kiểm tra cuối, bắt buộc phải hiện
parsed OK; cú pháp sudoers sai có thể chặn quyền truy cập sudo
- Nếu
sudo -n true chạy thành công mà không có đầu ra, thì sudo không cần mật khẩu đã hoạt động
4. Xác định địa chỉ máy Mac đích
- Vì IP có thể thay đổi sau khi khởi động lại hoặc theo thời gian, nên khuyến nghị dùng tên máy chủ cố định
scutil --get LocalHostName
- Gắn
.local vào tên đã xuất ra và dùng dưới dạng <target-host>.local
- Nếu tên
.local của hai máy Mac trong cùng mạng bị trùng, có thể kết nối nhầm thiết bị, nên hãy đặt tên duy nhất
sudo scutil --set LocalHostName newmacbook
- Nếu cần IP, có thể kiểm tra bằng
ipconfig getifaddr en0, nhưng địa chỉ này có thể thay đổi
- Về sau, dùng địa chỉ theo dạng
<user>@<target-host>.local
5. Cấu hình SSH không cần mật khẩu trên máy Mac nguồn
- Nếu chưa có khóa SSH, hãy tạo khóa Ed25519 trên máy Mac nguồn
ssh-keygen -t ed25519
ssh-copy-id <user>@<target-host>.local
- Khi cài khóa công khai, nhập mật khẩu của tài khoản đích một lần
- Nếu lệnh sau in ra tên người dùng đích mà không cần nhập mật khẩu, thì cấu hình đã hoàn tất
ssh <user>@<target-host>.local whoami
6. Ngăn chế độ ngủ và khóa tự động
- macOS có thể ngủ sau khoảng 10 phút không hoạt động ngay cả khi đang cắm điện, khiến máy biến mất khỏi mạng, vì vậy hãy tắt chế độ ngủ
sudo pmset -c sleep 0
sudo pmset -c disablesleep 1
sudo pmset -c displaysleep 0
- Mỗi lệnh lần lượt áp dụng ngăn hệ thống ngủ khi đang sạc, ngăn ngủ khi đóng nắp và ngăn màn hình ngủ
- Kiểm tra
sleep 0, SleepDisabled 1, displaysleep 0 trong đầu ra của pmset -g | grep -iE 'sleep'
- Nếu muốn áp dụng cả khi dùng pin, thay
-c bằng -a, nhưng mức tiêu hao pin sẽ tăng
- Đồng thời chặn khóa tự động do trình bảo vệ màn hình
defaults -currentHost write com.apple.screensaver idleTime 0
7. Đồng bộ clipboard qua SSH
- Kết nối
pbcopy và pbpaste của macOS qua SSH cho phép truyền văn bản theo kiểu P2P được mã hóa mà không cần Apple ID hay dịch vụ bên ngoài
clip.sh còn hỗ trợ truyền cả hình ảnh
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"
- Hãy thêm thiết lập
IC_BOX vào ~/.zshrc
clip send gửi văn bản hoặc hình ảnh từ máy Mac nguồn sang máy đích; hình ảnh có thể được dán vào phiên Claude Code trên máy đích bằng Ctrl-V
clip get lấy clipboard của máy Mac đích về máy Mac nguồn
8. Cài đặt Claude Code
- Từ máy Mac nguồn, cài phiên bản Claude Code cụ thể lên máy Mac đích qua SSH
ssh <user>@<target-host>.local 'curl -fsSL https://claude.ai/install.sh | bash -s -- 2.1.201'
- Có thể chỉ định
latest hoặc stable thay cho phiên bản 2.1.201
- Nếu xuất hiện cảnh báo PATH của
~/.local/bin, hãy thêm đường dẫn vào ~/.zshenv, tệp được mọi phiên zsh đọc
ssh <user>@<target-host>.local 'echo '\''export PATH="$HOME/.local/bin:$PATH"'\'' >> ~/.zshenv'
9. Cài đặt tùy chọn môi trường thân thiện với Claude Code
setup-claude-env.sh, thành phần tùy chọn, sẽ cài shell alias, plugin DX, điều chỉnh settings.json, GitHub CLI và Playwright MCP·yt-dlp tùy chọn
- Có thể xem toàn bộ thành phần tại
claude-env-components.md
- Ở chế độ chạy tương tác, các mục mặc định được chọn sẵn và các mục cài đặt tùy chọn được hiển thị dưới dạng checklist bỏ chọn
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'
- Chạy không tương tác mặc định chỉ cài các mục cốt lõi và hỗ trợ các cờ
--yt-dlp, --playwright, --all, --core
- Script có tính idempotent, nên có thể chạy lại
10. Đăng nhập Claude và GitHub
- Kết nối tới máy Mac đích qua SSH, chạy
claude, rồi đăng nhập vào tài khoản Anthropic bằng luồng mã trình duyệt·thiết bị có thể hoàn tất trên trình duyệt của máy Mac chính
- Nên thêm đăng nhập GitHub bằng
gh auth login để làm việc với kho lưu trữ
- Để agent không ảnh hưởng tới tài khoản chính, an toàn hơn là dùng tài khoản GitHub riêng
11. Tính năng sử dụng máy tính qua SSH
-
Cách kết nối vào phiên GUI
- Tiến trình SSH không thể trực tiếp dùng quyền ghi màn hình và Trợ năng gắn với phiên đăng nhập GUI
- LaunchAgent duy trì máy chủ tmux và phiên neo
cc trên một socket cố định trong phiên GUI
- Claude Code khởi động trong máy chủ đó sẽ kế thừa phiên GUI để truy cập chụp màn hình, điều khiển chuột và bàn phím
-
Cài đặt
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'
- Cài LaunchAgent và tmux anchor, đồng thời bật công cụ
computer-use tích hợp trong ~/.claude.json
- Cần tmux và gói Claude Pro hoặc Max; script có thể chạy lại và có thể gỡ bằng
--uninstall
-
Quản lý phiên bằng lệnh ic
- Cài
ic.sh trên máy Mac nguồn
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
- Các lệnh chính như sau
ic: phiên Claude mới
ic -c, ic -r: tiếp tục cuộc trò chuyện gần đây hoặc bộ chọn khôi phục
ic --chrome: chạy cùng Claude in Chrome
ic sh: shell thông thường trên máy đích
ic vnc: chạy Screen Sharing
ic rc: máy chủ Remote Control cho điện thoại
ic history, ic ls: xem các cuộc trò chuyện đã lưu và các phiên đang chạy
ic attach <id>, ic kill <id>, ic kill-all, ic kill-except: quản lý kết nối·kết thúc phiên
- Mọi phiên
ic đều chạy với --dangerously-skip-permissions, còn ic rc dùng --permission-mode bypassPermissions
- Trong tmux, Terminal.app không nhận được chuỗi clipboard OSC52 do Claude xuất ra, nên để sao chép toàn màn hình hãy dùng
Cmd-A rồi Cmd-C
-
Ủy quyền giữa các agent
- Claude Code trên máy Mac nguồn có thể dùng SSH và
tmux send-keys để gửi prompt tới phiên Claude đang chạy trên máy đích
- Với prompt dài, Enter đi kèm cùng gói truyền như văn bản có thể không được xử lý là lệnh gửi, nên cần chờ một chút rồi gửi thêm một lần Enter
- Có thể đọc phản hồi bằng
tmux capture-pane và tail, rồi kiểm tra lặp lại cho tới khi công việc hoàn tất
-
Các quyền phải do con người cấp trực tiếp
- Quyền ghi màn hình và Trợ năng phải được con người phê duyệt trực tiếp trong GUI của macOS, không thể xử lý bằng click tổng hợp
- Cũng phải chấp thuận yêu cầu cho phép
bypass the window picker xuất hiện ở lần chụp đầu tiên; yêu cầu này có thể hiện lại khoảng mỗi tháng một lần
- Đối tượng được cấp quyền không phải
claude mà là binary tmux, tức tiến trình chịu trách nhiệm
- Đường dẫn Intel:
/usr/local/bin/tmux
- Đường dẫn Apple Silicon:
/opt/homebrew/bin/tmux
- Ghi màn hình cho phép chụp screenshot, còn Trợ năng cho phép điều khiển chuột·bàn phím
- Trạng thái quyền được cache khi tiến trình khởi động, nên sau khi cấp quyền phải khởi động lại máy chủ bằng
tmux -S /tmp/cc-tmux.sock kill-server
- Nếu tmux không xuất hiện trong danh sách cài đặt, hãy yêu cầu Claude chụp màn hình từ
ic để kích hoạt yêu cầu cấp quyền trước
- Trên các bản macOS mới, để tránh các yêu cầu truy cập dữ liệu theo từng ứng dụng lặp lại, hãy cấp Full Disk Access cho tmux và khởi động lại máy chủ
12. Cài VPN và các ứng dụng GUI khác
- Có thể cài VPN như Proton VPN để tách lưu lượng của máy Mac đích khỏi IP cục bộ
- Nếu đã thiết lập tính năng sử dụng máy tính, có thể yêu cầu Claude trong
ic cài ứng dụng, nhưng các việc sau vẫn phải do con người xử lý
- Ngay cả gói miễn phí cũng cần thông tin đăng nhập và có thể truyền mật khẩu bằng
clip send
- Phải chấp thuận quyền VPN·cấu hình mạng của lần kết nối đầu tiên và yêu cầu nhập mật khẩu Mac
- Điều khiển ứng dụng chỉ có GUI cần tính năng sử dụng máy tính
- Sau khi đăng nhập, agent có thể thực hiện kết nối và chuyển máy chủ, và có thể áp dụng cùng luồng này cho các ứng dụng khác
13. Điều khiển từ điện thoại
- Chạy
/remote-control hoặc /rc trong phiên hiện có để tiếp tục điều khiển cùng phiên đó bằng ứng dụng Claude
claude remote-control hỗ trợ không chỉ kết nối vào phiên hiện có từ điện thoại mà còn tạo phiên mới
- Khi khởi động bằng
ic rc, các phiên được tạo từ điện thoại cũng có thể truy cập tính năng sử dụng máy tính của máy Mac đích
14. Thiết lập Claude in Chrome
- Tính năng sử dụng máy tính thông thường có thể nhìn thấy màn hình trình duyệt nhưng bị hạn chế trong việc nhấp chuột hoặc nhập liệu
- Tiện ích Claude in Chrome hỗ trợ điều hướng, nhấp chuột, nhập biểu mẫu, đọc log console và các yêu cầu mạng
- Khác với Playwright MCP, nó sử dụng hồ sơ Chrome thông thường của máy Mac đích nên có thể tận dụng trạng thái đã đăng nhập sẵn
- Máy Mac đích cần có Chrome và gói đăng ký trực tiếp Anthropic Pro, Max, Team hoặc Enterprise
- Các thao tác sau cần do con người trực tiếp thực hiện
- Nhấp
Add to Chrome trong Chrome Web Store
- Đăng nhập vào tài khoản Claude trong tiện ích; có thể chuyển thông tin xác thực bằng
clip send
- Trong Claude Code, chạy
/chrome để bật mặc định, hoặc dùng claude --chrome hay ic --chrome theo từng phiên
- Nếu không kết nối được, hãy khởi động lại Chrome một lần
- Script môi trường ở bước 9 thêm hướng dẫn vào
~/.claude/CLAUDE.md để dùng tham chiếu phần tử trong cây trợ năng thay vì tọa độ, và tránh chụp ảnh màn hình khi chưa được yêu cầu
- Nếu tiện ích của cùng một tài khoản đang chạy đồng thời trên Chrome nguồn và Chrome đích, sẽ xuất hiện yêu cầu chọn, và có issue #74667 khiến việc nhận diện thiết bị cục bộ có thể bị sai
- Có thể tránh bằng cách tạm gỡ tiện ích trên máy Mac nguồn hoặc đóng Chrome trên máy nguồn
- Có issue #74671 là các phiên được tạo từ điện thoại hiện chưa có công cụ trình duyệt
- Khởi động phiên trong terminal rồi kết nối điện thoại bằng
/rc
15. macOS Screen Sharing
- Screen Sharing tích hợp sẵn cho phép xem màn hình đích theo thời gian thực từ máy Mac nguồn và trực tiếp điều khiển chuột, bàn phím
- Từ macOS 12.1, không thể bật bằng dòng lệnh, nên phải thiết lập trong GUI của máy đích
- Trong System Settings → General → Sharing, bật Screen Sharing
- Nếu Remote Management đang bật nên không thấy công tắc, hãy tắt nó trước
- Kết nối từ máy Mac nguồn bằng lệnh sau
open vnc://<user>@<target-host>.local
- Đăng nhập bằng mật khẩu của tài khoản đích và có thể chọn lưu mật khẩu vào Keychain
16. Truy cập mạng bên ngoài qua Tailscale
- Địa chỉ
.local chỉ hoạt động trong LAN, nhưng Tailscale cho phép dùng SSH, ic, clip, Screen Sharing cả trên mạng bên ngoài thông qua đường hầm WireGuard P2P mã hóa đầu cuối
- Không phơi dịch vụ ra Internet công cộng, và trong mạng gia đình sẽ dùng trực tiếp đường LAN
- Việc tham gia mạng Tailscale chỉ cung cấp khả năng thiết bị liên lạc với nhau, nên vẫn cần khóa SSH hoặc mật khẩu Screen Sharing
- Cài đặt trên máy Mac đích theo kiểu headless và đăng nhập tại URL được in ra
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>'
- Cài trên máy Mac nguồn nữa và đăng nhập bằng cùng tài khoản Tailscale với máy đích
brew install --cask tailscale-app
- Nếu dùng MagicDNS được bật mặc định, có thể truy cập từ bất kỳ đâu bằng tên host không có
.local
export IC_BOX="<user>@<target-host>"
# export IC_BOX="<user>@<target-host>.local"
- Địa chỉ Screen Sharing cũng đổi thành
open vnc://<user>@<target-host>
- Trong bảng điều khiển quản trị, nên dùng các thiết lập bảo mật và khả dụng sau
- Bật device approval để thiết bị mới không thể tham gia chỉ với thông tin đăng nhập bị đánh cắp
- Tắt key expiry để thiết bị đích không bị ngắt kết nối sau khoảng 180 ngày do khóa hết hạn
- Để kiểm tra truy cập từ xa thực tế, hãy kết nối máy Mac nguồn vào một mạng khác như hotspot điện thoại rồi xác nhận bằng
ic ls
1 bình luận
Ý kiến Hacker News
Nếu không phải phát triển đồ họa như bài viết đề cập thì không có lý do gì phải cô lập agent trên phần cứng thật. Tôi đã viết một script tạo desktop đồ họa dành riêng cho Claude bằng libvirt, thậm chí còn chạy cả kiểm thử chấp nhận người dùng trên Chrome
Dù có cấp toàn bộ quyền root thì nếu có vấn đề cũng có thể xóa bỏ và cài lại trong vài giây
sudo useradd agent,sudo su agentđể agent chỉ có thể phá file của chính nó. Tôi cũng đã chụp ảnh màn hình bằng Chrome headless và cấu hình VNC, nhưng không đáng để dùng lắmNgay cả trên VPS 3 đô cũng có thể cài lại ngay nếu hỏng, nên việc cấp root cho agent cũng khá thú vị
Tôi vẫn hoàn toàn không tìm ra trường hợp dùng mà AI thật sự có thể hỗ trợ liên tục 24/7, nhưng cũng muốn cảm thấy mình cần nó
Thật vậy, khi đang ra ngoài mà Datadog, log đám mây và cảnh báo GitHub dồn dập tới, bạn có thể giao cho Claude Code điều tra và phân loại kiểu như “timeout của API ngân hàng đối tác đã xuất hiện ở khoảng 15% request từ một giờ trước”. Sau đó liên hệ người phụ trách rồi quay lại cuối tuần của mình là xong
Một hệ thống on-call tử tế vẫn tốt hơn, nhưng xét đến mức linh hoạt mà công việc mang lại thì cảnh báo Slack cuối tuần vẫn chấp nhận được
Nhiều khi phần cứng mới là nút thắt hơn là giới hạn gói đăng ký
Thay vì cài Claude lên chiếc PC thứ ba để nó tiếp tục ảo giác ra đống mã chẳng ai muốn chỉ vì cố không bị tụt lại, tôi thích tự viết code hơn vì vốn dĩ tôi thích lập trình
Tôi cũng cấu hình tương tự trên một máy Mac cũ như bản thay thế miễn phí cho bot OpenClaw. Thỉnh thoảng kết nối bị ngắt nên phải chuyển giao lại bằng điện thoại, nhưng vì còn chạy cả Homebridge để Claude điều khiển được nên tính hữu dụng khá tốt
Tôi đang cài Claude Desktop trên một Mac mini M4 riêng và điều khiển bằng Dispatch. Claude vốn đã có toàn quyền với tài khoản local mà tôi cấp cho nó, nên tôi không rõ có lý do gì để đổi sang cách này không
Thay vì phải chạy RC trên từng phiên host, sẽ tốt hơn nếu Claude dùng máy tính của tôi làm sandbox host. Hiện tại tôi đang dùng một cấu hình tạm, trong đó phiên RC chính tạo cửa sổ tmux mới và phiên Claude RC mới cho từng tác vụ lập trình
Nếu RC bị lỗi thì vẫn có thể dùng Code trực tiếp từ Termux, nhưng giao diện quyền trên iOS hơi thiếu ổn định
curlvàwgetbình thườngDù không giải quyết được mọi ràng buộc, bạn vẫn có thể cài macOS và Claude Code trong máy ảo trên Mac bằng UTM. UTM chạy được cả bằng tài khoản không phải quản trị viên và dùng được hầu hết công cụ native của Mac
Tuy nhiên, UI Claude Code trong máy ảo có hiệu năng tương tác không tốt, và tôi không chắc liệu có thể né điều đó bằng cách truy cập terminal từ tài khoản không phải quản trị viên trên host hay không
Tôi đã dựng lại homelab và media server bằng một chiếc HP EliteDesk gắn i5 thay cho NUC cũ không giải quyết được vấn đề quá nhiệt. Tôi định cài Ubuntu cơ bản, tạo máy ảo cách ly và chạy Claude để thử Dispatch, hoặc cài trực tiếp Claude Code rồi dùng ứng dụng Moshi trên iPhone và iPad
Tôi cũng làm tương tự với một chiếc M2 cũ. Nó không đủ để chạy local model đủ mạnh, nhưng lại hoàn hảo cho OpenClaw và Claude
Tôi cũng ngạc nhiên vì giá MacBook M1/M2 giờ đã rẻ hơn so với Mac mini