AI・機械学習
Claude Codeで制御するための予備Macの設定:ステップバイステップガイド
Setting up your spare Mac for Claude Code to control, a step-by-step guide (ykdojo.github.io)
要約
この記事は、使っていないMacをClaude Codeが完全に制御できる常時稼働マシンに設定する手順を解説しています。これにより、電話やメインのMacからClaude Codeに指示を出し、リスクを分離した環境でタスクを委任できます。コンテナや他のソリューションと比較して、専用Macを使用する利点と具体的な設定方法が詳細に説明されています。
全文翻訳
claude-controls-mac Claude Codeが完全に制御できるように予備Macを設定する方法 - ステップバイステップガイド
Claude Codeが完全に制御できる常時稼働マシンとして予備Macを設定するための、完全なステップバイステップガイドです。Claudeアプリを通じて電話から、またはSSH経由でメインのMacから操作できるようになります。
なぜこれを行うのか?
私はClaude Codeが独自に制御できる別の環境を作成したかったため、必ずしも自分のマシンで実行したくないタスク、例えば特定の種類の調査タスクや開発タスクを委任できるようにしました。Claude Code、特に--dangerously-skip-permissionsフラグをオンにした状態では、メインマシンで実行すると固有のリスクを伴います。これらのリスクは、必要なものがすべて揃った別の環境を予備Mac上に作成することで排除/軽減できます。
電話からいつでもClaude Codeにアクセスできるという追加の利点もあります。個人的には、モバイルアプリで通常のClaudeではなくClaude Codeと話すことを好むことが多いため、これは非常に役立っています。Claude Codeはしばしばより有能です。
以下のガイドは、メインのMacと設定用の予備のMacがあることを前提としていますが、そこからインスピレーションを得て、2台のマシンの任意の組み合わせに適用できるはずです。
なぜこのセットアップなのか?
まず、あなたが抱く可能性のあるいくつかの質問に簡単に答えます。
コンテナで実行するのはなぜダメなのか?
私はコンテナでの実行を強く推奨しており、便利に実行するための環境全体を構築したことさえあります。しかし、いくつかの制限があることに気づきました。第一に、それはまだメインマシンで実行されるため、完全に分離されていません。例えば、送信されるネットワークリクエストは依然としてメインマシンを経由します。第二に、コンテナの機能には制限があります。例えば、エージェントにゲーム開発のためにUnityを実行させたいと思いましたが、コンテナ内でそれを行う簡単な方法はありません。Macでのみ利用可能な他のアプリについても同様です。コンテナ内ではアクセスできません。これは、Claude Codeにコンピュータの使用(クリック、ドラッグなど)を通じてこれらのアプリを制御させたい場合に特に重要です。
OpenClawのようなものを使用しないのはなぜか?
私は個人的に、Claude Codeの完全で最新の機能にアクセスできることを好みます。また、Claudeアプリからそれを制御できることも気に入っています。これは非常に便利だと感じています。また、もしClaudeサブスクリプションをお持ちであれば、その利用枠を消費できるという追加の利点もあります。
結局のところ、広範な権限を持つエージェントを実行することは、失うもののないマシンの方が安全ですが、コンテナではなくフル機能のMacを使用できるという利点があります。
ここでのアプローチ:
メインのMacではなく、古い/予備のMacを使用します。
個人データを含まず、Apple IDにサインインしていない新しいローカルアカウントを作成し、エージェントが機密情報にアクセスできないようにします。
ローカルネットワーク上のメインMacからSSH経由で操作し、電話から制御します。
必要なもの
予備のMac(ターゲット)
同じWi-Fi上にある、普段使いのMac(ソース)
1. ターゲットMacで新規開始
まず消去する(個人データがある場合)
エージェントはこのマシン全体にアクセスできるようになるため、保存されているものすべてにアクセスできます。アクセスさせたくない既存のデータがある場合は、まずマシンを消去してください:
対応するMac:システム設定 -> 一般 ->転送またはリセット -> すべてのコンテンツと設定を消去。
古いIntel Mac:リカバリモードで再起動(起動時にCmd-Rを長押し)、ディスクユーティリティを使用して内蔵ドライブを消去し、macOSを再インストールします。
その後、最新のmacOSにアップデートすることもできます(システム設定 -> 一般 ->ソフトウェアアップデート)。
新規で分離されたアカウントを作成する
新しいローカルユーザーアカウントを作成します(システム設定 -> ユーザーとグループ)。Apple IDにサインインしないことをお勧めします。セットアップ中にスキップしてください。
アカウントを管理者にする(まだ行っていない場合)
アカウントには管理者権限が必要です。そうでないと、sudoが実行を拒否します。システム設定 -> ユーザーとグループ -> このユーザーにこのコンピュータを管理させるように設定します。
別の管理者アカウントから修復する必要がある場合は、次を実行します:sudo dseditgroup -o edit -a <user> -t user admin
2. ターゲットMacでリモートログイン(SSH)を有効にする
ターゲットでSSHをオンにして、ソースMacが接続できるようにします:sudo systemsetup -setremotelogin on
コマンドが「リモートログインのオン/オフにはフルディスクアクセス権限が必要です」というエラーで失敗した場合は、まずターミナルアプリにフルディスクアクセス権限を付与してください:システム設定 -> プライバシーとセキュリティ -> フルディスクアクセス。
「+」をクリックし、ファイルピッカーで「アプリケーション」->「ユーティリティ」->「ターミナル」に移動して追加します。
ターミナルを終了して再起動し、コマンドを再度実行します。
3. ターゲットアカウントのパスワードなしsudo
これにより、エージェント(および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 # 検証 - 「parsed OK」と表示される必要があります
これは、<user>がパスワードプロンプトなしでsudoを実行できることを伝える小さなルールファイルを作成します。
行1はルールを/etc/sudoers.d/に書き込みます。
行2は読み取り専用にします。そうでない場合、sudoはそのファイルを無視します。
行3は構文を検証します。sudoersファイルにタイプミスがあると、sudo自体がロックされる可能性があるため、「parsed OK」と表示される必要があります。
これを実行すると、sudoはプロンプトなしで実行されます。パスワードなしsudoが機能する場合、sudo -n true はサイレントに成功します。
4. ターゲットのアドレス(ホスト名またはIP)を見つける
ターゲットには、ホスト名またはIPアドレスのいずれかで到達できます。ホスト名を使用することをお勧めします。IPアドレスは変更されることがありますが、ホスト名は同じままです。
ホスト名(推奨)。ターゲットで実行します:
scutil --get LocalHostName # ホスト名を表示します。例: MacBook-Pro
.local を追加してアドレスを形成します: <target-host>.local。
システム設定 -> 一般 -> 共有からも読み取ることができます。ローカルホスト名として表示されます。
ターゲットに一意の名前を付けます。各Macは、ネットワーク上で一意の.local名が必要です。2台のマシンが同じ名前を共有している場合、アドレスが間違ったMacを指す可能性があります。ターゲットの名前が一意であることを確認してください。必要に応じて名前を変更してください:
sudo scutil --set LocalHostName newmacbook # -> newmacbook.local
IPアドレス(非推奨)。ターゲットで実行します:
ipconfig getifaddr en0 # 例: 192.168.1.80
IPアドレスは、再起動後や一定時間後に変更される可能性があることに注意してください。
このガイドの残りの部分では、<user>をターゲットアカウント名に、<target-host>を上記のホスト名に置き換えてください。そのため、アドレスは <user>@<target-host>.local となります。代わりに <target-host>.local の代わりにIPアドレスを使用することもできます。
5. ソースMacからパスワードなしSSHを設定する
ソースMacでSSHキーを作成します(すでに持っている場合はスキップ):
ssh-keygen -t ed25519
公開鍵をターゲットにインストールします。ターゲットアカウントのログインパスワードを一度だけ尋ねられます:
ssh-copy-id <user>@<target-host>.local
テストします。パスワードプロンプトなしでターゲットのユーザー名が表示されるはずです:
ssh <user>@<target-host>.local whoami
6. ターゲットをスリープさせない
デフォルトでは、macOSは接続中でも約10分アイドル状態になるとスリープし、ネットワークから切断されます。スリープしないようにするには、ターゲットで(またはソースからSSH経由で)次を実行します:
sudo pmset -c sleep 0 # 充電中はスリープしない (-c = 充電器使用時)
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やサードパーティのサービスは不要です。