- Installez Claude Code sur un Mac de rechange ne contenant aucune donnée personnelle, et configurez-le comme un environnement autonome toujours accessible depuis le SSH du Mac principal et l’app Claude sur téléphone
- Le niveau d’isolation matérielle est plus élevé qu’avec des conteneurs, et il est possible d’utiliser Unity ainsi que des apps GUI propres au Mac, ce qui permet de séparer du Mac principal les risques liés à
--dangerously-skip-permissions
- La base de travail à distance est mise en place via un nouveau compte administrateur local,
sudo et SSH sans mot de passe, la prévention de la mise en veille, la synchronisation du presse-papiers et l’installation de Claude Code
- Le contrôle de l’interface graphique est implémenté avec un serveur tmux maintenu par un LaunchAgent au sein de la session GUI ; les autorisations d’enregistrement de l’écran, d’accessibilité et d’accès complet au disque doivent être accordées manuellement
- En ajoutant Remote Control, Claude in Chrome, Screen Sharing et Tailscale, on peut aller du contrôle depuis un téléphone à l’automatisation du navigateur et à l’accès externe, mais cela nécessite une authentification distincte et la configuration des autorisations macOS
Objectif de la configuration et principes de base
- Créer un environnement que Claude Code pourra contrôler de manière autonome afin de déléguer des travaux de recherche et de développement en dehors du Mac principal
- Comme un agent utilisant
--dangerously-skip-permissions dispose de permissions étendues, l’exécuter sur une machine distincte sans données personnelles ni Apple ID afin de réduire les informations sensibles accessibles
- Claude Code reste accessible à tout moment via l’app Claude sur téléphone ou le SSH du Mac principal
- La configuration de base nécessite un Mac cible de rechange connecté au même Wi-Fi et le Mac source utilisé au quotidien
Pourquoi utiliser un Mac de rechange plutôt qu’un conteneur ou OpenClaw
- Un conteneur s’exécute toujours sur le Mac principal, et les requêtes réseau passent aussi par celui-ci : ce n’est donc pas une séparation matérielle complète
- Il est difficile d’exécuter Unity ou des apps propres au Mac, et les tâches GUI nécessitant de cliquer ou de glisser via les fonctions d’utilisation de l’ordinateur sont également limitées
- La configuration sur un Mac de rechange permet d’exploiter telles quelles les dernières fonctions de Claude Code, le contrôle via l’app Claude et le quota de l’abonnement Claude déjà détenu
- L’environnement est isolé selon les principes suivants
- Utiliser un ancien Mac de rechange, et non le Mac principal
- Créer un nouveau compte local sans données personnelles ni Apple ID
- Contrôler la machine via SSH sur le réseau local, et via l’app Claude depuis le téléphone
1. Réinitialiser le Mac cible et isoler le compte
- S’il contient déjà des données personnelles, l’agent pourrait toutes y accéder ; il faut donc d’abord effacer la machine
- Mac pris en charge : System Settings → General → Transfer or Reset → Erase All Content and Settings
- Anciens Mac Intel : au démarrage, entrer dans Recovery avec
Cmd-R, effacer le disque interne avec Disk Utility, puis réinstaller macOS
- Si nécessaire, mettre à jour vers la dernière version de macOS dans System Settings → General → Software Update
- Créer un nouveau compte utilisateur local et ignorer la connexion à l’Apple ID
- Accorder au compte les droits administrateur pour qu’il puisse utiliser
sudo
- Dans System Settings → Users & Groups, activer
Allow this user to administer this computer
- Lors d’une récupération depuis un autre compte administrateur, on peut utiliser
sudo dseditgroup -o edit -a <user> -t user admin
2. Activer la connexion SSH à distance
- Sur le Mac cible, activer Remote Login avec la commande suivante
sudo systemsetup -setremotelogin on
- Si l’erreur
Turning Remote Login on or off requires Full Disk Access privileges se produit, accorder à Terminal l’accès complet au disque
- Dans System Settings → Privacy & Security → Full Disk Access, ajouter Applications → Utilities → Terminal
- Quitter Terminal, le rouvrir, puis relancer la commande
3. Configurer sudo sans mot de passe
- Créer une règle par compte dans
/etc/sudoers.d/ afin que l’agent et les commandes SSH ne demandent pas le mot de passe à chaque fois
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
- La première commande écrit la règle, et la deuxième définit les permissions en lecture seule requises par
sudo
- La dernière vérification doit impérativement afficher
parsed OK ; une syntaxe sudoers incorrecte peut bloquer l’accès à sudo
- Si
sudo -n true réussit sans afficher de sortie, sudo sans mot de passe fonctionne
4. Vérifier l’adresse du Mac cible
- Comme l’IP peut changer après un redémarrage ou avec le temps, il est recommandé d’utiliser un nom d’hôte fixe
scutil --get LocalHostName
- Ajouter
.local au nom affiché et l’utiliser sous la forme <target-host>.local
- Si les noms
.local des deux Mac se chevauchent sur le même réseau, on peut se connecter à la mauvaise machine ; définir donc un nom unique
sudo scutil --set LocalHostName newmacbook
- Si une IP est nécessaire, on peut la vérifier avec
ipconfig getifaddr en0, mais elle peut changer
- Par la suite, utiliser l’adresse au format
<user>@<target-host>.local
5. Configurer le SSH sans mot de passe depuis le Mac source
- Si aucune clé SSH n’existe déjà, générer une clé Ed25519 sur le Mac source
ssh-keygen -t ed25519
ssh-copy-id <user>@<target-host>.local
- Saisir une fois le mot de passe du compte cible lors de l’installation de la clé publique
- Si la commande suivante affiche le nom d’utilisateur cible sans demander de mot de passe, la configuration est terminée
ssh <user>@<target-host>.local whoami
6. Empêcher la mise en veille et le verrouillage automatique
- Même branché sur secteur, macOS peut se mettre en veille après environ 10 minutes d’inactivité et disparaître du réseau ; désactiver donc la veille
sudo pmset -c sleep 0
sudo pmset -c disablesleep 1
sudo pmset -c displaysleep 0
- Chaque commande empêche respectivement la mise en veille du système sur secteur, la mise en veille lorsque le capot est fermé, et la mise en veille de l’écran
- Vérifier la sortie de
pmset -g | grep -iE 'sleep' pour confirmer sleep 0, SleepDisabled 1 et displaysleep 0
- Pour appliquer aussi ces réglages sur batterie, utiliser
-a au lieu de -c, mais la consommation de batterie augmentera
- Empêcher également le verrouillage automatique dû à l’économiseur d’écran
defaults -currentHost write com.apple.screensaver idleTime 0
7. Synchronisation du presse-papiers via SSH
- En reliant
pbcopy et pbpaste de macOS via SSH, on peut transférer du texte en P2P chiffré, sans Apple ID ni service externe
clip.sh prend aussi en charge le transfert d’images
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"
- Ajouter le réglage
IC_BOX à ~/.zshrc
clip send envoie le texte ou les images du Mac source vers le Mac cible ; les images peuvent être collées avec Ctrl-V dans la session Claude Code de la cible
clip get récupère le presse-papiers du Mac cible vers le Mac source
8. Installer Claude Code
- Depuis le Mac source, installer une version précise de Claude Code sur le Mac cible via SSH
ssh <user>@<target-host>.local 'curl -fsSL https://claude.ai/install.sh | bash -s -- 2.1.201'
- Vous pouvez aussi spécifier
latest ou stable au lieu de la version 2.1.201
- Si un avertissement concernant le
PATH de ~/.local/bin apparaît, ajoutez le chemin à ~/.zshenv, lu par tous les zsh
ssh <user>@<target-host>.local 'echo '\''export PATH="$HOME/.local/bin:$PATH"'\'' >> ~/.zshenv'
9. Installer au choix un environnement adapté à Claude Code
- Le script optionnel
setup-claude-env.sh installe des alias shell, des plugins DX, des ajustements de settings.json, GitHub CLI ainsi que, en option, Playwright MCP et yt-dlp
- La liste complète des composants est disponible dans
claude-env-components.md
- En exécution interactive, il propose une checklist où les éléments par défaut sont sélectionnés et les éléments optionnels sont décochés
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'
- L’exécution non interactive n’installe par défaut que les éléments essentiels et prend en charge les flags
--yt-dlp, --playwright, --all et --core
- Le script est idempotent : il peut être relancé sans problème
10. Connexion à Claude et GitHub
- Connectez-vous au Mac cible en SSH, lancez
claude, puis connectez-vous à votre compte Anthropic via le flux navigateur/code d’appareil, que vous pouvez terminer dans le navigateur du Mac principal
- Pour travailler sur des dépôts, il est recommandé d’ajouter une connexion GitHub avec
gh auth login
- Il est plus sûr d’utiliser un compte GitHub séparé afin que l’agent n’affecte pas le compte principal
11. Fonctionnalité d’utilisation de l’ordinateur via SSH
-
Mode de connexion à la session GUI
- Un processus SSH ne peut pas utiliser directement les autorisations d’enregistrement de l’écran et d’accessibilité associées à la session de connexion GUI
- Un LaunchAgent maintient un serveur tmux et une session d’ancrage
cc sur un socket fixe dans la session GUI
- Claude Code lancé dans ce serveur hérite de la session GUI et peut accéder aux captures d’écran ainsi au contrôle de la souris et du clavier
-
Installation
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'
- Il installe le LaunchAgent et l’ancrage tmux, puis active l’outil intégré
computer-use dans ~/.claude.json
- tmux et un forfait Claude Pro ou Max sont nécessaires ; le script peut être relancé et supprimé avec
--uninstall
-
Gérer les sessions avec la commande ic
- Installez
ic.sh sur le Mac source
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
- Les principales commandes sont les suivantes
ic : nouvelle session Claude
ic -c, ic -r : poursuivre la conversation récente ou choisir une reprise
ic --chrome : exécuter avec Claude in Chrome
ic sh : shell standard de la cible
ic vnc : lancer Screen Sharing
ic rc : serveur Remote Control pour téléphone
ic history, ic ls : consulter les conversations enregistrées et les sessions en cours
ic attach <id>, ic kill <id>, ic kill-all, ic kill-except : gérer l’attachement et l’arrêt des sessions
- Toutes les sessions
ic sont lancées avec --dangerously-skip-permissions, et ic rc utilise --permission-mode bypassPermissions
- Dans tmux, Terminal.app ne reçoit pas les séquences de presse-papiers OSC52 émises par Claude ; pour copier tout l’écran, utilisez
Cmd-A puis Cmd-C
-
Délégation entre agents
- Claude Code sur le Mac source peut utiliser SSH et
tmux send-keys pour envoyer des prompts à une session Claude en cours d’exécution sur la cible
- Pour les prompts longs, l’Entrée incluse dans le même lot d’envoi que le texte peut ne pas être traitée comme une soumission ; il faut alors attendre brièvement puis envoyer une nouvelle fois Entrée
- Vous pouvez lire la réponse avec
tmux capture-pane et tail, puis vérifier à intervalles réguliers jusqu’à la fin de la tâche
-
Autorisations à accorder manuellement
- Les autorisations d’enregistrement de l’écran et d’accessibilité doivent être approuvées manuellement dans l’interface GUI de macOS et ne peuvent pas être accordées par des clics synthétiques
- Il faut aussi approuver la demande d’autorisation
bypass the window picker qui apparaît lors de la première capture ; elle peut réapparaître environ une fois par mois
- La cible des autorisations n’est pas
claude, mais le processus responsable, le binaire tmux
- Chemin Intel :
/usr/local/bin/tmux
- Chemin Apple Silicon :
/opt/homebrew/bin/tmux
- L’enregistrement de l’écran autorise les captures d’écran, et l’accessibilité autorise le contrôle de la souris et du clavier
- Comme l’état des autorisations est mis en cache au démarrage du processus, redémarrez le serveur après les avoir accordées avec
tmux -S /tmp/cc-tmux.sock kill-server
- Si tmux n’apparaît pas dans la liste des réglages, demandez d’abord une capture d’écran à Claude depuis
ic afin de déclencher la demande d’autorisation
- Pour éviter les demandes répétées d’accès aux données par application dans les versions récentes de macOS, accordez le Full Disk Access à tmux puis redémarrez le serveur
12. Installer un VPN et d’autres applications GUI
- Vous pouvez installer un VPN comme Proton VPN afin de séparer le trafic du Mac cible de votre IP locale
- Si la fonctionnalité d’utilisation de l’ordinateur est configurée, vous pouvez demander à Claude depuis
ic d’installer l’application, mais les tâches suivantes doivent être effectuées par une personne
- Même avec l’offre gratuite, des identifiants de connexion sont nécessaires, et le mot de passe peut être transmis avec
clip send
- Il faut approuver les autorisations de configuration VPN/réseau lors de la première connexion ainsi que la demande de mot de passe du Mac
- Le contrôle d’applications exclusivement GUI nécessite la fonctionnalité d’utilisation de l’ordinateur
- Après la connexion, l’agent peut se connecter et changer de serveur, et le même flux peut être appliqué à d’autres applications
13. Contrôler depuis un téléphone
- En exécutant
/remote-control ou /rc dans une session existante, vous pouvez continuer à contrôler la même session depuis l’application Claude
claude remote-control prend en charge non seulement la connexion à une session existante depuis un téléphone, mais aussi la création d’une nouvelle session
- En lançant
ic rc, les sessions créées depuis le téléphone peuvent également accéder à la fonctionnalité d’utilisation de l’ordinateur du Mac cible
14. Configuration de Claude in Chrome
- La fonctionnalité générale d’utilisation de l’ordinateur permet de voir l’écran du navigateur, mais reste limitée pour les clics et la saisie
- L’extension Claude in Chrome prend en charge la navigation, les clics, la saisie de formulaires, ainsi que la lecture des logs de console et des requêtes réseau
- Contrairement à Playwright MCP, elle utilise le profil Chrome standard du Mac cible, ce qui permet de tirer parti des sessions déjà connectées
- Le Mac cible doit disposer de Chrome et d’un abonnement direct Anthropic Pro, Max, Team ou Enterprise
- Les actions suivantes doivent être effectuées manuellement
- Cliquer sur
Add to Chrome dans le Chrome Web Store
- Se connecter au compte Claude dans l’extension ; les identifiants peuvent être transmis avec
clip send
- Dans Claude Code, exécuter
/chrome pour l’activer par défaut, ou utiliser claude --chrome ou ic --chrome pour une session donnée
- Si la connexion ne s’établit pas, redémarrer Chrome une fois
- Le script d’environnement de l’étape 9 ajoute dans
~/.claude/CLAUDE.md des consignes pour utiliser des références d’éléments de l’arbre d’accessibilité plutôt que des coordonnées, et pour éviter les captures d’écran non demandées
- Si les extensions Chrome de la machine source et de la machine cible, associées au même compte, s’exécutent simultanément, une demande de sélection apparaît ; il existe aussi un problème #74667 pouvant entraîner une mauvaise identification de la machine locale
- Pour le contourner, supprimer temporairement l’extension du Mac source ou fermer Chrome sur la source
- Il existe un problème #74671 : les outils de navigateur ne sont actuellement pas disponibles dans les sessions créées depuis un téléphone
- Démarrer la session depuis le terminal, puis connecter le téléphone avec
/rc
15. Partage d’écran macOS
- Avec le partage d’écran intégré, il est possible de consulter en temps réel l’écran cible depuis le Mac source et de contrôler directement la souris et le clavier
- Depuis macOS 12.1, il ne peut plus être activé en ligne de commande et doit donc être configuré dans l’interface graphique de la machine cible
- Dans Réglages Système → Général → Partage, activer le partage d’écran
- Si la gestion à distance est activée et que le bouton n’apparaît pas, la désactiver d’abord
- Depuis le Mac source, se connecter avec la commande suivante
open vnc://<user>@<target-host>.local
- Se connecter avec le mot de passe du compte cible ; il est possible de choisir d’enregistrer le mot de passe dans le trousseau
16. Accès depuis un réseau externe via Tailscale
- Les adresses
.local ne fonctionnent que sur le LAN, mais Tailscale permet d’utiliser SSH, ic, clip et le partage d’écran depuis un réseau externe au moyen de tunnels WireGuard P2P chiffrés de bout en bout
- Aucun service n’est exposé sur l’Internet public, et sur le réseau domestique, le chemin LAN direct est utilisé
- Rejoindre le réseau Tailscale ne fournit que la joignabilité entre machines ; les clés SSH ou le mot de passe du partage d’écran restent nécessaires
- Installer Tailscale sur le Mac cible en mode headless, puis se connecter via l’URL affichée
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>'
- L’installer aussi sur le Mac source et se connecter avec le même compte Tailscale que la cible
brew install --cask tailscale-app
- Avec MagicDNS, activé par défaut, il est possible d’accéder à la machine de n’importe où avec le nom d’hôte sans
.local
export IC_BOX="<user>@<target-host>"
# export IC_BOX="<user>@<target-host>.local"
- L’adresse de partage d’écran devient également
open vnc://<user>@<target-host>
- Les paramètres de sécurité et de disponibilité suivants sont recommandés dans la console d’administration
- Activer device approval afin qu’une simple connexion compromise ne permette pas d’ajouter un nouvel appareil
- Désactiver l’expiration des clés pour éviter que la machine cible ne soit déconnectée après environ 180 jours à cause de l’expiration de sa clé
- Tester l’accès distant réel en connectant le Mac source à un autre réseau, comme un hotspot de téléphone, puis en vérifiant avec
ic ls
1 commentaires
Commentaires sur Hacker News
Sauf pour le développement graphique mentionné dans l’article, il n’y a aucune raison d’isoler l’agent sur du matériel réel. J’ai écrit un script qui crée avec libvirt un bureau graphique dédié à Claude, jusqu’à effectuer des tests d’acceptation utilisateur dans Chrome
Même en lui donnant tous les droits root, en cas de problème on peut le jeter et le réinstaller en quelques secondes
sudo useradd agent,sudo su agent, afin que l’agent ne puisse casser que ses propres fichiers. J’ai aussi pris des captures d’écran avec Chrome headless et configuré VNC, mais ça ne valait pas vraiment le coupMême sur un VPS à 3 dollars, s’il est cassé, on peut le réinstaller aussitôt, ce qui rend amusant le fait de donner root à l’agent
J’ai beau chercher, je ne trouve vraiment pas d’usage où une IA pourrait réellement aider en continu 24 h/24, mais j’aimerais moi aussi en ressentir le besoin
Concrètement, si des alertes Datadog, des logs cloud et des alertes GitHub s’accumulent pendant qu’on est dehors, on peut confier l’enquête à Claude Code et lui faire classer le problème du type : « des timeouts de l’API de la banque partenaire surviennent depuis une heure sur environ 15 % des requêtes ». Il suffit ensuite de contacter la personne responsable et de retourner profiter de son week-end
Un vrai système d’astreinte serait préférable, mais vu la flexibilité offerte par le poste, des alertes Slack le week-end restent acceptables
Le matériel devient plus souvent le goulot d’étranglement que la limite de l’abonnement
Plutôt que d’installer Claude sur un troisième PC pour lui faire halluciner en boucle du code dont personne ne veut, juste pour essayer de ne pas prendre du retard, je préfère coder moi-même, parce que j’aime coder
Je l’ai configuré de manière similaire sur un vieux Mac comme alternative gratuite au bot OpenClaw. La connexion se coupe parfois et je dois reprendre la main depuis le téléphone, mais j’y fais aussi tourner Homebridge, que Claude peut manipuler, donc c’est plutôt utile
J’ai installé Claude Desktop sur un Mac mini M4 séparé et je le contrôle avec Dispatch. Comme il peut déjà contrôler entièrement le compte local que je lui ai donné, je me demande s’il y a une raison de passer à cette méthode
J’aimerais que Claude puisse utiliser mon ordinateur comme hôte de bac à sable, au lieu de lancer RC pour chaque session hôte. Pour l’instant, j’utilise une configuration provisoire où une session RC maître crée une nouvelle fenêtre tmux et une nouvelle session Claude RC pour chaque tâche de codage
En cas de bug de RC, je peux utiliser directement Code dans Termux, mais l’interface de permissions d’iOS était assez instable
curletwgetsans problèmeCela ne résout pas toutes les contraintes, mais avec UTM, on peut installer macOS et Claude Code dans une machine virtuelle sur Mac. UTM fonctionne même avec un compte non administrateur et permet d’utiliser la plupart des outils natifs Mac
Cela dit, l’UI de Claude Code dans la machine virtuelle n’est pas très performante en interaction, et je ne sais pas si l’on peut contourner cela en s’y connectant via le terminal depuis un compte non administrateur de l’hôte
J’ai reconstruit mon homelab et serveur multimédia avec un HP EliteDesk équipé d’un i5, à la place d’un vieux NUC dont je n’avais jamais réglé les problèmes de surchauffe. Je pense créer des machines virtuelles d’isolation sur Ubuntu de base, y exécuter Claude et tester Dispatch, ou installer directement Claude Code puis utiliser l’app Moshi sur iPhone et iPad
J’ai une configuration similaire avec un vieux M2. Il n’est pas suffisant pour faire tourner des modèles locaux assez performants, mais il est parfait pour OpenClaw et Claude
Je suis aussi surpris de voir que les prix des MacBook M1 et M2 sont désormais plutôt bas comparés au Mac mini