6 ポイント 投稿者 GN⁺ 1 일 전 | 1件のコメント | WhatsAppで共有
  • 個人データのない予備の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を使える

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 0SleepDisabled 1displaysleep 0を確認する
  • バッテリー駆動時にも適用するには、-cの代わりに-aを使うが、バッテリー消費は増える
  • スクリーンセーバーによる自動ロックも防ぐ
defaults -currentHost write com.apple.screensaver idleTime 0

7. SSHクリップボード同期

  • macOSのpbcopypbpasteを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 の代わりに lateststable も指定可能
  • ~/.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 セッションを継承し、スクリーンショット、マウス、キーボード制御にアクセスできる
  • インストール

    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 の Claude Code は SSH と tmux send-keys を使って、対象で実行中の Claude セッションにプロンプトを送れる
    • 長いプロンプトでは、テキストと同じ送信バンドルに含まれた Enter が送信として扱われないことがあるため、少し待ってからもう一度 Enter を送る必要がある
    • tmux capture-panetail で応答を読み取り、作業が終わるまで繰り返し確認できる
  • 人が直接付与する必要がある権限

    • 画面収録とアクセシビリティ権限は macOS の GUI で人が直接承認する必要があり、合成クリックでは処理できない
    • 初回キャプチャ時に表示される bypass the window picker の許可要求も承認する必要があり、約 1 か月ごとに再表示されることがある
    • 権限の対象は claude ではなく、責任プロセスである tmux バイナリ
      • Intel のパス: /usr/local/bin/tmux
      • Apple Silicon のパス: /opt/homebrew/bin/tmux
    • 画面収録はスクリーンショットを、アクセシビリティはマウス・キーボード制御を許可する
    • 権限状態はプロセス起動時にキャッシュされるため、付与後は 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 で渡せる
  • 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、icclip、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件のコメント

 
GN⁺ 1 일 전
Hacker News のコメント
  • 記事で触れられているグラフィック開発でないなら、エージェントを実ハードウェア上に隔離する理由はない。libvirt で Claude 専用のグラフィックデスクトップを作り、Chrome のユーザー受け入れテストまで行うスクリプトを書いた
    root 権限をすべて与えても、問題が起きれば数秒で破棄して再インストールできる

    • 私は sudo useradd agentsudo su agent くらいで別ユーザーを作り、エージェントが自分のファイルだけを壊せるようにしている。ヘッドレス Chrome でスクリーンショットも撮ったし VNC も構成したが、使う価値はあまり大きくなかった
      3ドルの VPSでも、壊れたらすぐ再インストールできるので、エージェントに root を与える楽しさがある
    • Mac ホスト上の仮想マシンで macOS ゲストを実行でき、Apple もこれを明示的に認めている
    • 容量さえ十分なら、仮想マシンで Claude 専用の iMessage を作れるが、余っている古い Apple ハードウェアを活用してもよい
    • このスクリプトは Claude が生成したコードのようで、250行ほど読んだところで一貫性のないコードに疲れて興味を失った
  • AI が実際に 24時間ずっと手伝ってくれるような用途をどうしても見つけられないが、自分も必要性を感じてみたい

    • Claude Code に熟達した人は IDE をほとんど使わないので、ノートPCの代わりにスマートフォンから作業できない理由も、慣習以外にはあまりない
      実際、外出中に Datadog・クラウドログ・GitHub のアラートが殺到したら、Claude Code に調査を任せ、「提携銀行 API のタイムアウトが1時間前から約15%のリクエストで発生している」といった形で分類させられる。担当者に連絡したら、週末に戻ればよい
      きちんとしたオンコール体制のほうが良いだろうが、職場が提供する柔軟性を考えれば、週末の Slack アラートも受け入れられる
    • 数時間かかる データサイエンス分析を、Claude に主に監視させている。リモート制御で完了や追加確認の依頼を通知してもらい、新しいアイデアが浮かんだらすぐ作業キューに入れられる
      サブスクリプションの上限より、ハードウェアがボトルネックになることのほうが多い
    • トークンが余っているときは、ドメイン知識やソースコードの知識を活用してファジング手法を選ぶ ファジング、類似の最適化問題、Microsoft の SkillOpt の実行に使った
    • Claude Cowork で、ノートPCを安全に再インストールするための チェックリストとバックアップを作った。SSH 設定、アプリ、ダウンロード、ドキュメントなどを確認したうえでバックアップまで任せ、再インストール後の復元手順も作成させたので、長く先延ばしにしていた作業を終えられた
    • 役に立った用途は、別環境で GUI ベースの Google Chrome と Figma を操作させること、1時間を超える作業をメインコンピューターを閉じたまま実行すること、Gemma・Whisper・Qwen のように CPU とリソースを多く使う作業を分離すること
  • Claude を3台目の PC にインストールし、誰も望んでいないコードを延々と幻覚させながら遅れまいと頑張るくらいなら、コーディング自体が好きなので 自分でコーディングする

  • OpenClaw ボットの無料代替として、古い Mac に似た構成を作った。たまに接続が切れてスマートフォンで引き継ぎ直す必要があるが、Claude が操作できる Homebridge も一緒に動かしていて活用度は高い

  • 別の Mac mini M4 に Claude Desktop をインストールし、Dispatch で制御している。すでに Claude に与えたローカルアカウントを完全に制御できるのに、この方式に変える理由があるのか気になる

    • 推論の大半は Anthropic 側で処理されるのに、なぜ M4 が必要なのか疑問。特にリソース集約的なアプリを実行するのでなければ、過剰なスペックに見える
    • Dispatch より RC のほうが強力で、Claude Code を直接使う体験に近かったが、Claude 所有のサンドボックスと比べると RC モードにも欠けている機能がある
      ホストセッションごとに RC を実行する代わりに、Claude が私のコンピューターをサンドボックスホストとして使ってくれるとよい。現在は、マスター RC セッションが各コーディング作業ごとに新しい tmux ウィンドウと Claude RC セッションを作る暫定構成を使っている
      RC のバグが出たら Termux で Code を直接使えるが、iOS の権限インターフェイスはやや不安定だった
    • Dispatch/Cowork は本質的に コンテナ内の Claude Code。記事の “Why not run it in a container?” の部分が答えになっており、Cowork はコンテナ権限のために PDF や他のファイルをダウンロードして読んだり書いたりできないことがあるが、通常の Claude Code は curlwget を問題なく使う
    • Dispatch はこの方式とは異なり、コネクタをはじめ一部の作業には非常に便利。ただし、モバイル・デスクトップ・ノートPCをまたぐ統合戦略なしに、Cowork の上に段階的に継ぎ足した機能のように、だんだん感じられてきている
  • すべての制約を解決するわけではないが、UTM で Mac の仮想マシンに macOS と Claude Code をインストールできる。UTM は非管理者アカウントでも実行でき、ほとんどの Mac ネイティブツールを使える
    ただし、仮想マシン上の Claude Code UI は対話性能がよくなく、ホストの非管理者アカウントからターミナルで接続してこれを避けられるかははっきりしない

    • UTM は グラフィックアクセラレーションに対応していないため、ブラウザ機能が制限される。アクセラレーションが不要でも、UTM の仮想 OS 上で実行したブラウザは、一部の最新 CAPTCHA やブラウザフィンガープリント検査を通過できなかった
  • 過熱を解決できなかった古い NUC の代わりに、i5 搭載の HP EliteDesk で ホームラボ兼メディアサーバーを再構築した。標準の Ubuntu に隔離用の仮想マシンを作り、Claude を実行しながら Dispatch を試すか、Claude Code を直接インストールして iPhone・iPad の Moshi アプリを使うつもり

    • 私も Ubuntu 仮想マシンで Claude を実行しており、以前なら定期ジョブで処理していた作業を任せている。iMessage が不要なら、Mac 構成にどんな追加メリットがあるのか気になる
  • 古い M2 で似た構成にした。十分な性能のローカルモデルを動かすには足りないが、OpenClaw と Claude には完璧
    M1・M2 MacBook の価格も、今では Mac mini と比べてかなり安めで驚く

    • 私は逆に、高性能な Framework Desktop を ヘッドレス AI マシンとして置き、M1 MacBook Pro を日常用に使っていて、うまく機能している
    • 16GB 以上の MacBook Air と MacBook は、こうした需要のせいか 高くなりすぎている