- 個人データのない予備のMacにClaude Codeをインストールし、メインMacのSSHとスマートフォンのClaudeアプリから常時アクセスできる独立実行環境として構成する
- コンテナより機器分離のレベルが高く、UnityやMac専用GUIアプリも使えるため、
--dangerously-skip-permissionsのリスクをメインMacから切り離せる - 新しいローカル管理者アカウント、パスワードなしの
sudo・SSH、スリープ防止、クリップボード同期、Claude Codeのインストールを経て、リモート作業の基盤を構築する - GUI制御は、LaunchAgentがGUIセッション内で維持するtmuxサーバーで実装し、画面収録・アクセシビリティ・フルディスクアクセス権限は人が直接許可する必要がある
- Remote Control、Claude in Chrome、Screen Sharing、Tailscaleを追加すれば、スマートフォン操作からブラウザ自動化、外部アクセスまで可能になるが、別途認証とmacOS権限設定が必要になる
構成の目的と基本原則
- Claude Codeが独立して制御できる環境を作り、研究・開発作業をメインMacの外に委任する
--dangerously-skip-permissionsを使うエージェントは広範な権限を持つため、個人データとApple IDのない別の機器で実行し、アクセス可能な機密情報を減らす- スマートフォンのClaudeアプリやメインMacのSSHを通じて、いつでもClaude Codeにアクセスできる
- 基本構成には、同じWi‑Fiに接続された予備の対象Macと、日常的に使うソースMacが必要
コンテナやOpenClawの代わりに予備のMacを使う理由
- コンテナは依然としてメインMac上で動作し、ネットワークリクエストもメインMacを通過するため、完全な機器分離ではない
- UnityやMac専用アプリを実行しにくく、コンピュータ使用機能でクリックやドラッグが必要なGUI作業にも制約がある
- 予備のMac構成なら、最新のClaude Code機能、Claudeアプリ制御、保有中のClaudeサブスクリプション利用量をそのまま活用できる
- 次の原則に従って環境を分離する
- メインMacではなく古い予備のMacを使う
- 個人データとApple IDのない新しいローカルアカウントを作る
- ローカルネットワークではSSH、スマートフォンではClaudeアプリで制御する
1. 対象Macの初期化とアカウント分離
- 既存の個人データがあるとエージェントがすべてにアクセスできるため、まず機器を消去する
- 対応Mac: System Settings → General → Transfer or Reset → Erase All Content and Settings
- 古いIntel Mac: 起動時に
Cmd-RでRecoveryに入り、Disk Utilityで内部ドライブを消去してからmacOSを再インストールする
- 必要であれば、System Settings → General → Software Updateで最新のmacOSに更新する
- 新しいローカルユーザーアカウントを作成し、Apple IDへのサインインはスキップする
sudoを使えるよう、アカウントに管理者権限を付与する- System Settings → Users & Groupsで
Allow this user to administer this computerを有効にする - 別の管理者アカウントから復旧する場合は、
sudo dseditgroup -o edit -a <user> -t user adminを使える
- System Settings → Users & Groupsで
2. SSHリモートログインの有効化
- 対象Macで次のコマンドを実行してRemote Loginを有効にする
sudo systemsetup -setremotelogin on
Turning Remote Login on or off requires Full Disk Access privilegesエラーが発生したら、TerminalにFull Disk Accessを付与する- System Settings → Privacy & Security → Full Disk AccessでApplications → Utilities → Terminalを追加する
- Terminalを終了して開き直し、コマンドを再実行する
3. パスワードなしのsudo設定
- エージェントとSSHコマンドが毎回パスワードを要求しないよう、
/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
- 1つ目のコマンドはルールを書き込み、2つ目のコマンドは
sudoが要求する読み取り専用権限を設定する - 最後の検証では必ず
parsed OKが出力される必要があり、誤ったsudoers構文はsudoアクセスを妨げる可能性がある sudo -n trueが出力なしで成功すれば、パスワードなしのsudoが機能している
4. 対象Macのアドレス確認
- IPは再起動後や時間経過で変わることがあるため、固定のホスト名の使用を推奨する
scutil --get LocalHostName
- 出力された名前に
.localを付けて<target-host>.localとして使う - 同じネットワーク内で2台のMacの
.local名が重複すると、誤った機器に接続する可能性があるため、一意の名前を指定する
sudo scutil --set LocalHostName newmacbook
- IPが必要なら
ipconfig getifaddr en0で確認できるが、変わる可能性がある - 以後のアドレスは
<user>@<target-host>.local形式で使う
5. ソースMacでパスワードなしSSHを構成
- 既存のSSHキーがなければ、ソースMacでEd25519キーを生成する
ssh-keygen -t ed25519
ssh-copy-id <user>@<target-host>.local
- 公開鍵をインストールするときに、対象アカウントのパスワードを一度入力する
- 次のコマンドがパスワード入力なしで対象ユーザー名を出力すれば、設定は完了
ssh <user>@<target-host>.local whoami
6. スリープと自動ロックの防止
- macOSは電源接続中でも約10分アイドル状態が続くとスリープしてネットワークから消えることがあるため、スリープを無効にする
sudo pmset -c sleep 0
sudo pmset -c disablesleep 1
sudo pmset -c displaysleep 0
- 各コマンドは、充電中のシステムスリープ防止、蓋を閉じた状態でのスリープ防止、ディスプレイスリープ防止を適用する
pmset -g | grep -iE 'sleep'の出力でsleep 0、SleepDisabled 1、displaysleep 0を確認する- バッテリー駆動時にも適用するには、
-cの代わりに-aを使うが、バッテリー消費は増える - スクリーンセーバーによる自動ロックも防ぐ
defaults -currentHost write com.apple.screensaver idleTime 0
7. SSHクリップボード同期
- macOSの
pbcopyとpbpasteをSSH経由でつなげば、Apple IDや外部サービスなしで、暗号化されたP2P方式でテキストを転送できる 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のインストール
- ソースMacからSSH経由で対象Macに特定バージョンのClaude Codeをインストールする
ssh <user>@<target-host>.local 'curl -fsSL https://claude.ai/install.sh | bash -s -- 2.1.201'
- バージョン
2.1.201の代わりにlatestやstableも指定可能 ~/.local/binの PATH 警告が出たら、すべての zsh で読み込まれる~/.zshenvにパスを追加する
ssh <user>@<target-host>.local 'echo '\''export PATH="$HOME/.local/bin:$PATH"'\'' >> ~/.zshenv'
9. Claude Code 向け環境の選択インストール
- オプションの
setup-claude-env.shは、シェルエイリアス、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フラグをサポートする - スクリプトは 冪等 なので、再実行してもよい
10. Claude と GitHub へのログイン
- SSH で対象の Mac に接続して
claudeを実行し、メインの Mac のブラウザで完了できるブラウザ・デバイスコードフローで Anthropic アカウントにログインする - リポジトリ作業のために
gh auth loginで GitHub ログインを追加する方法が推奨される - エージェントがメインアカウントに影響しないよう、別の GitHub アカウント を使うほうが安全
11. SSH 経由の Computer Use 機能
-
GUI セッションに接続する仕組み
- SSH プロセスは、GUI ログインセッションに紐づく画面収録やアクセシビリティ権限を直接使えない
- LaunchAgent が GUI セッション内の固定ソケットで tmux サーバー とアンカーセッション
ccを維持する - そのサーバー内で起動した Claude Code は GUI セッションを継承し、スクリーンショット、マウス、キーボード制御にアクセスできる
-
インストール
setup-computer-use.shを実行する
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 アンカーをインストールし、
~/.claude.jsonで組み込みのcomputer-useツールを有効にする - tmux と Claude Pro または Max プランが必要で、スクリプトは再実行でき、
--uninstallで削除できる
-
icコマンドでセッション管理- ソース Mac に
ic.shをインストールする
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 内では Claude が出力する OSC52 クリップボードシーケンスを Terminal.app が受け取れないため、画面全体をコピーするには
Cmd-AのあとCmd-Cを使う
- ソース Mac に
-
エージェント間の委任
- ソース Mac の Claude Code は SSH と
tmux send-keysを使って、対象で実行中の Claude セッションにプロンプトを送れる - 長いプロンプトでは、テキストと同じ送信バンドルに含まれた Enter が送信として扱われないことがあるため、少し待ってからもう一度 Enter を送る必要がある
tmux capture-paneとtailで応答を読み取り、作業が終わるまで繰り返し確認できる
- ソース Mac の Claude Code は SSH と
-
人が直接付与する必要がある権限
- 画面収録とアクセシビリティ権限は macOS の GUI で人が直接承認する必要があり、合成クリックでは処理できない
- 初回キャプチャ時に表示される
bypass the window pickerの許可要求も承認する必要があり、約 1 か月ごとに再表示されることがある - 権限の対象は
claudeではなく、責任プロセスである tmux バイナリ- Intel のパス:
/usr/local/bin/tmux - Apple Silicon のパス:
/opt/homebrew/bin/tmux
- Intel のパス:
- 画面収録はスクリーンショットを、アクセシビリティはマウス・キーボード制御を許可する
- 権限状態はプロセス起動時にキャッシュされるため、付与後は
tmux -S /tmp/cc-tmux.sock kill-serverでサーバーを再起動する必要がある - 設定一覧に tmux が表示されない場合は、
icで Claude にスクリーンショットを要求して、先に権限要求を発生させる - 最新の macOS でアプリごとのデータアクセス要求を繰り返さないようにするには、tmux に Full Disk Access を付与してサーバーを再起動する
12. VPN とその他の GUI アプリのインストール
- 対象 Mac のトラフィックをローカル IP と分離するために、Proton VPN のような VPN をインストールできる
- Computer Use 機能を設定済みなら、
icで Claude にアプリのインストールを依頼できるが、次の作業は人が行う必要がある- 無料プランでもログイン認証情報が必要で、パスワードは
clip sendで渡せる - 初回接続時の VPN・ネットワーク構成権限と Mac のパスワード要求を承認する必要がある
- GUI 専用アプリの操作には Computer Use 機能が必要
- 無料プランでもログイン認証情報が必要で、パスワードは
- ログイン後は、エージェントが接続やサーバー切り替えを行えるようになり、同じ流れを他のアプリケーションにも適用できる
13. スマホから操作
- 既存セッションで
/remote-controlまたは/rcを実行すると、Claude アプリで同じセッションを引き継いで操作できる claude remote-controlは、スマホから既存セッションへの接続だけでなく、新規セッションの作成にも対応するic rcで開始すると、スマホで作成したセッションも対象 Mac の Computer Use 機能 にアクセスできる
14. Claude in Chrome の設定
- 一般的なコンピューター操作機能ではブラウザー画面は見られるが、クリックや入力には制約がある
- Claude in Chrome 拡張機能 は、ナビゲーション、クリック、フォーム入力、コンソールログとネットワークリクエストの読み取りをサポートする
- Playwright MCP と違って対象 Mac の通常の Chrome プロファイルを使うため、すでにログイン済みの状態を活用できる
- 対象 Mac には Chrome と Anthropic Pro、Max、Team、または Enterprise の直接契約が必要
- 次の作業は人が直接行う必要がある
- Chrome Web Store で
Add to Chromeをクリックする - 拡張機能で Claude アカウントにログインする。認証情報は
clip sendで渡せる
- Chrome Web Store で
- Claude Code で
/chromeを実行してデフォルトで有効化するか、セッションごとにclaude --chromeまたはic --chromeを使う - 接続されない場合は Chrome を一度再起動する
- 手順 9 の環境スクリプトでは、座標の代わりにアクセシビリティツリーの要素参照を使い、要求していないスクリーンショットを避けるよう
~/.claude/CLAUDE.mdに指示を追加する - ソース側と対象側の Chrome で同じアカウントの拡張機能を同時に実行すると選択リクエストが表示され、ローカル端末の判別を誤る可能性がある Issue #74667 がある
- ソース Mac の拡張機能を一時的に削除するか、ソース側の Chrome を終了して回避できる
- スマートフォンで生成したセッションには現在ブラウザーツールが提供されない Issue #74671 がある
- ターミナルでセッションを開始した後、
/rcでスマートフォンを接続する
- ターミナルでセッションを開始した後、
15. macOS Screen Sharing
- 内蔵の Screen Sharing を使えば、ソース Mac から対象画面をリアルタイムで確認し、マウスとキーボードを直接操作できる
- macOS 12.1 以降では コマンドラインから有効化できない ため、対象の GUI で設定する必要がある
- System Settings → General → Sharing で Screen Sharing を有効にする
- Remote Management が有効でトグルが表示されない場合は、先に無効にする
- ソース Mac で次のコマンドを実行して接続する
open vnc://<user>@<target-host>.local
- 対象アカウントのパスワードでログインし、Keychain へのパスワード保存を選べる
16. Tailscale による外部ネットワーク接続
.localアドレスは LAN でしか動作しないが、Tailscale は P2P エンドツーエンド暗号化の WireGuard トンネルを通じて、SSH、ic、clip、Screen Sharing を外部ネットワークからでも使えるようにする- サービスを公開インターネットに露出せず、ホームネットワークでは直接 LAN 経路を使う
- Tailscale ネットワークへの参加は機器間の到達可能性を提供するだけなので、SSH キーや Screen Sharing のパスワードは引き続き必要
- 対象 Mac にヘッドレス方式でインストールし、出力される 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 を有効にする
- 対象機器が約 180 日後にキー有効期限切れで切断されないよう、key expiry を無効にする
- 実際のリモート接続は、ソース Mac をスマートフォンのテザリングなど別のネットワークに接続したうえで
ic lsで確認する
1件のコメント
Hacker News のコメント
記事で触れられているグラフィック開発でないなら、エージェントを実ハードウェア上に隔離する理由はない。libvirt で Claude 専用のグラフィックデスクトップを作り、Chrome のユーザー受け入れテストまで行うスクリプトを書いた
root 権限をすべて与えても、問題が起きれば数秒で破棄して再インストールできる
sudo useradd agent、sudo su agentくらいで別ユーザーを作り、エージェントが自分のファイルだけを壊せるようにしている。ヘッドレス Chrome でスクリーンショットも撮ったし VNC も構成したが、使う価値はあまり大きくなかった3ドルの VPSでも、壊れたらすぐ再インストールできるので、エージェントに root を与える楽しさがある
AI が実際に 24時間ずっと手伝ってくれるような用途をどうしても見つけられないが、自分も必要性を感じてみたい
実際、外出中に Datadog・クラウドログ・GitHub のアラートが殺到したら、Claude Code に調査を任せ、「提携銀行 API のタイムアウトが1時間前から約15%のリクエストで発生している」といった形で分類させられる。担当者に連絡したら、週末に戻ればよい
きちんとしたオンコール体制のほうが良いだろうが、職場が提供する柔軟性を考えれば、週末の Slack アラートも受け入れられる
サブスクリプションの上限より、ハードウェアがボトルネックになることのほうが多い
Claude を3台目の PC にインストールし、誰も望んでいないコードを延々と幻覚させながら遅れまいと頑張るくらいなら、コーディング自体が好きなので 自分でコーディングする
OpenClaw ボットの無料代替として、古い Mac に似た構成を作った。たまに接続が切れてスマートフォンで引き継ぎ直す必要があるが、Claude が操作できる Homebridge も一緒に動かしていて活用度は高い
別の Mac mini M4 に Claude Desktop をインストールし、Dispatch で制御している。すでに Claude に与えたローカルアカウントを完全に制御できるのに、この方式に変える理由があるのか気になる
ホストセッションごとに RC を実行する代わりに、Claude が私のコンピューターをサンドボックスホストとして使ってくれるとよい。現在は、マスター RC セッションが各コーディング作業ごとに新しい tmux ウィンドウと Claude RC セッションを作る暫定構成を使っている
RC のバグが出たら Termux で Code を直接使えるが、iOS の権限インターフェイスはやや不安定だった
curlとwgetを問題なく使うすべての制約を解決するわけではないが、UTM で Mac の仮想マシンに macOS と Claude Code をインストールできる。UTM は非管理者アカウントでも実行でき、ほとんどの Mac ネイティブツールを使える
ただし、仮想マシン上の Claude Code UI は対話性能がよくなく、ホストの非管理者アカウントからターミナルで接続してこれを避けられるかははっきりしない
過熱を解決できなかった古い NUC の代わりに、i5 搭載の HP EliteDesk で ホームラボ兼メディアサーバーを再構築した。標準の Ubuntu に隔離用の仮想マシンを作り、Claude を実行しながら Dispatch を試すか、Claude Code を直接インストールして iPhone・iPad の Moshi アプリを使うつもり
古い M2 で似た構成にした。十分な性能のローカルモデルを動かすには足りないが、OpenClaw と Claude には完璧
M1・M2 MacBook の価格も、今では Mac mini と比べてかなり安めで驚く