SSD Nodes Learn Hosting plans →
Guides Matt ConnorPar Matt Connor

Utiliser Claude Code depuis votre téléphone

Claude Code tourne dans tmux sur un VPS, pas sur votre téléphone. Configurez les clés SSH, mosh, tmux attach et le clavier pour une connexion mobile fiable.

Claude Code depuis votre téléphone : fonctionnement réel

Ce guide utilise une application de terminal sur votre téléphone. Claude Code s'exécute sur un VPS (serveur privé virtuel), au sein d'une session tmux qui reste ouverte. Votre téléphone établit une connexion SSH (secure shell) vers cette session tant que vous la consultez. Fermez l'application et l'agent continue de travailler, car le processus n'a jamais résidé sur le téléphone.

Claude Code propose également le contrôle à distance : exécutez /remote-control au sein d'une session pour l'utiliser via l'application mobile Claude ou un navigateur, tandis que le processus reste sur le serveur.

Cette séparation constitue l'intégralité de la conception. Le système d'exploitation d'un téléphone suspend une application quelques secondes après que vous l'avez quittée ; par conséquent, toute tâche longue lancée sur le téléphone s'interrompt. Il obtient également une nouvelle adresse réseau à chaque passage du Wi-Fi aux données mobiles. Ces deux problèmes disparaissent lorsque le processus s'exécute sur un serveur et que le téléphone se contente d'afficher l'interface.

Vous avez besoin de quatre éléments sur le serveur : tmux pour maintenir la session, des clés SSH pour vous connecter, mosh pour gérer les changements de réseau, et Claude Code lui-même. Côté téléphone, il vous faut une application de terminal dotée d'une rangée de touches accessibles.

Ce dont vous avez besoin sur le VPS

Une petite instance Ubuntu 24.04 suffit pour les parties SSH et tmux. Claude Code demande davantage. Les prérequis officiels en octobre 2026 sont Ubuntu 20.04 ou une version ultérieure sur un processeur x64 ou ARM64, avec 4 Go de RAM ou plus. Claude Code nécessite également un compte Claude payant (Pro, Max, Team ou Enterprise), un compte Console avec accès API, ou un accès via un fournisseur cloud pris en charge comme Amazon Bedrock, car le plan gratuit Claude.ai ne l'inclut pas.

Configurez l'instance avec un utilisateur standard disposant des droits sudo, et non en tant que root. Si le serveur est neuf, effectuez d'abord les dix premières minutes sur un nouveau VPS, car les modifications SSH prévues plus loin dans ce guide sont plus simples une fois l'utilisateur et le pare-feu en place.

sudo apt update && sudo apt install -y tmux mosh
curl -fsSL https://claude.ai/install.sh | bash
claude --version

L'installateur place le binaire dans ~/.local/bin/claude, et claude --version affiche une ligne telle que 2.1.211 (Claude Code). S'il affiche command not found, ce répertoire n'est pas encore dans votre PATH : déconnectez-vous, reconnectez-vous, puis vérifiez avec command -v claude. claude doctor affiche les diagnostics d'installation et de configuration sans démarrer de session.

Connectez-vous une première fois maintenant, depuis un ordinateur portable, avant de dépendre du téléphone. Exécutez claude dans un répertoire de projet et suivez l'invite de connexion. Le processus vous demande d'ouvrir une URL dans un navigateur et de rapporter un code dans le terminal ; jongler entre deux applications sur l'écran d'un téléphone pour effectuer cette opération est fastidieux. Faites-le une fois avec un vrai clavier et les identifiants resteront sur le serveur.

Lancez Claude Code dans tmux pour qu’une connexion interrompue ne l’arrête pas

tmux new -s claude
cd ~/projects/api
claude

Détachez-vous avec Ctrl-b, puis avec d. tmux affiche [detached (from session claude)] et vous rend la main dans le shell. Vous pouvez maintenant fermer l’application, perdre le signal ou mettre le téléphone dans votre poche. Le panneau continue de fonctionner.

tmux ls
tmux attach -t claude

tmux ls affiche une ligne par session, par exemple claude: 1 windows (created Thu Jul 30 09:14:02 2026). tmux attach -t claude vous replace exactement là où vous étiez, y compris dans la modification inachevée.

Cela fonctionne parce que tmux exécute son propre processus serveur. Votre shell et Claude Code sont des processus enfants de ce serveur, et non de sshd. Lorsque la connexion SSH se termine, le kernel envoie le signal de raccrochage, SIGHUP, aux processus attachés à cette connexion. Le serveur tmux n’en fait pas partie. Sans tmux, le même verrouillage de l’écran qui interrompt votre connexion arrête Claude Code au milieu d’un appel d’outil. Exécuter Claude Code sur un VPS dans tmux présente plus en détail l’organisation des sessions.

Exécutez tmux sur le serveur, jamais sur le téléphone. Saisir tmux dans une session à laquelle vous êtes déjà attaché affiche sessions should be nested with care, unset $TMUX to force. Forcer cette commande vous donne deux touches préfixes qui se font concurrence.

Attachement automatique à chaque connexion

Saisir la commande attach sur un clavier tactile devient vite fastidieux. Ajoutez ceci à la fin de ~/.profile sur le serveur :

if command -v tmux >/dev/null 2>&1 && [ -z "$TMUX" ] && [ -t 1 ]; then
  exec tmux new-session -A -s claude
fi

new-session -A -s claude s'attache à la session nommée claude si elle existe et la crée si ce n'est pas le cas ; une seule commande couvre donc les deux situations. exec remplace le shell de connexion par tmux, de sorte que quitter tmux ferme la connexion au lieu de vous laisser sur un prompt nu. Lorsque vous avez besoin d'un shell classique, ignorez le fichier : ssh you@server -t "bash --noprofile".

Placez ceci dans ~/.profile et non dans ~/.bashrc. Bash lit également ~/.bashrc pour les commandes SSH non interactives, mais la protection [ -t 1 ] ci-dessus empêche ce bloc de lancer tmux lors d'un transfert de fichier. Les commandes de démarrage non protégées qui génèrent une sortie interrompent les protocoles de transfert avec des erreurs telles que Received message too long. ~/.profile s'exécute uniquement pour les shells de connexion, ce qui correspond à une session SSH interactive.

~/.profile est également l'endroit où Ubuntu ajoute ~/.local/bin à PATH. Si claude fonctionne correctement après la connexion mais qu'un shell à l'intérieur de tmux indique command not found, cet ordre en est la raison. Lancez donc tmux depuis un shell de connexion comme indiqué ci-dessus plutôt que depuis un script qui ignore le profil.

Les deux applications prennent en charge SSH et mosh, et stockent les clés dans l’application. La différence concerne l’interface.

Blink Shell est piloté par des commandes. À son invite, saisissez ssh you@server ou mosh you@server, avec la même syntaxe que dans un terminal de bureau. Ouvrez les paramètres en saisissant config. La section Keys vous permet de créer une paire de clés.

Termius utilise des formulaires. Renseignez une entrée d’hôte, puis basculez cet hôte de SSH vers Mosh dans ses détails. Termius intègre sa propre implémentation de mosh et prend en charge mosh 1.3.0 et les versions ultérieures. Le serveur doit donc toujours disposer du paquet mosh.

Dans les deux cas, générez la clé dans l’application. Ne copiez jamais une clé privée existante sur le téléphone. L’application affiche la partie publique. C’est la seule ligne à ajouter dans ~/.ssh/authorized_keys sur le serveur. Clés SSH par appareil et révocation d’une clé explique le nommage et la procédure de révocation. Ces points sont plus importants pour un téléphone que pour un ordinateur portable.

Activez le verrouillage biométrique ou par code propre à l’application de terminal. Sans ce verrouillage, un téléphone déverrouillé donne accès à un shell ouvert sur votre serveur tant que l’écran reste allumé.

Android : Termux

pkg upgrade
pkg install openssh mosh
ssh-keygen -t ed25519 -C "pixel"
cat ~/.ssh/id_ed25519.pub

Termux fournit OpenSSH et mosh dans son propre dépôt de paquets. ssh, ssh-keygen et mosh se comportent donc comme sur un poste de travail. Ajoutez la ligne de clé publique affichée à ~/.ssh/authorized_keys sur le serveur, puis connectez-vous avec mosh you@server.

Le clavier à l’écran d’Android ne comporte ni touche Échap ni touche Ctrl, alors que Claude Code a besoin des deux. Termux peut afficher sa propre rangée de touches. Ajoutez une ligne dans ~/.termux/termux.properties :

extra-keys = [['ESC','|','/','HOME','UP','END','PGUP'],['TAB','CTRL','ALT','LEFT','DOWN','RIGHT','PGDN']]

Exécutez ensuite termux-reload-settings. La rangée apparaît au-dessus du clavier. Le même rechargement prend en compte une police TrueType à chasse fixe placée dans ~/.termux/font.ttf.

Android peut arrêter Termux lorsqu’il reste en arrière-plan. Dans ce cas, vous ne perdez que la connexion et devez vous reconnecter. La session et l’agent restent sur le serveur.

Pourquoi le terminal se fige-t-il quand je quitte le Wi-Fi, et que corrige mosh ?

Une connexion SSH est une connexion TCP (transmission control protocol), identifiée par les deux adresses et les deux ports. Si vous sortez de la portée du Wi-Fi, votre téléphone obtient une nouvelle adresse sur le réseau mobile ; l'ancienne connexion ne correspond plus à rien des deux côtés. Rien n'annonce ce changement. Le terminal cesse simplement de répondre jusqu'à ce que TCP abandonne, puis ssh affiche client_loop: send disconnect: Broken pipe. Pour terminer immédiatement une session figée, appuyez sur Enter, puis ~, puis ..

mosh (mobile shell) supprime ce mode de défaillance. Il utilise SSH une première fois pour se connecter et démarrer un processus mosh-server, lit le port UDP (user datagram protocol) choisi par le serveur, puis ferme la connexion SSH. Ensuite, les deux parties échangent des datagrammes UDP authentifiés par une clé de session partagée ; la session est donc identifiée par cette clé et non par votre adresse. Une nouvelle adresse permet de poursuivre la session sans interruption. mosh affiche également vos frappes localement et rafraîchit l'affichage si le serveur n'est pas synchronisé, ce qui le rend utilisable sur une connexion mobile lente.

mosh utilise un port UDP compris entre 60000 et 61000, vous devez donc ouvrir cette plage :

sudo ufw allow 60000:61000/udp
sudo ufw status

Ouvrir des ports avec ufw contient le reste des informations sur le pare-feu. Si votre fournisseur propose un pare-feu réseau séparé dans son panneau de contrôle, ajoutez-y également la même plage, car une règle ufw ne peut pas affecter un filtre situé en amont de la machine.

Deux échecs sont courants avec mosh. Une connexion qui réussit puis se bloque en affichant Nothing received from server on UDP port 60001. signifie que mosh-server a démarré mais que le client ne peut pas l'atteindre sur ce port UDP. Cela signifie généralement qu'un pare-feu entre le téléphone et le serveur bloque l'UDP dans la plage mosh. Une connexion qui signale mosh-server not found signifie que le paquet est manquant sur le serveur ou absent du PATH de connexion. Installez-le ou indiquez son chemin directement avec mosh --server=/usr/bin/mosh-server you@server.

Si la locale de connexion du serveur n'est pas UTF-8, mosh-server tente d'utiliser les paramètres de locale fournis par le client et vérifie à nouveau. Il refuse de s'exécuter uniquement si cela échoue également à fournir de l'UTF-8, en signalant mosh-server needs a UTF-8 native locale to run.. Corrigez d'abord la locale sur le serveur.

locale
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8

Les deux extrémités ont besoin d'une locale UTF-8, et mosh-server applique également les paramètres de locale envoyés par le client. Si l'erreur persiste après la correction sur le serveur, réglez LANG sur une valeur UTF-8 dans l'application de terminal du téléphone, comme le note la FAQ de mosh mosh-client.

Il y a deux choses que mosh ne fait pas. Son README indique que mosh ne prend pas en charge le transfert X (X forwarding) ou les utilisations non interactives de SSH, y compris le transfert de port (port forwarding) ; la prévisualisation d'une application web lancée par Claude Code nécessite donc toujours ssh -L 8080:127.0.0.1:8080 you@server. Il synchronise également uniquement l'écran visible, il n'a donc pas de tampon de défilement (scrollback) propre. Cette seconde limite n'est pas gênante ici, car tmux conserve le défilement : Ctrl-b puis [ active le mode copie, un glisser ou les touches fléchées permettent de faire défiler, et q permet de quitter.

Rendre un écran de téléphone utilisable

Quatre lignes dans ~/.tmux.conf sur le serveur effectuent la majeure partie du travail :

set -g mouse on
set -g status-position top
set -g default-terminal "tmux-256color"
set -g history-limit 20000

mouse on transforme un glissement tactile en défilement et un appui en sélection de volet ou de fenêtre, ce qui remplace la plupart des touches de préfixe difficiles à saisir. status-position top déplace la ligne d'état de tmux loin du bord inférieur, là où le clavier virtuel et sa barre de suggestions la masquent. default-terminal fixe le nom du terminal que tmux annonce à Claude Code. Sans cette ligne, tmux annonce le nom choisi lors de sa compilation. Le script de configuration de tmux 3.4 commence par screen, puis teste screen-256color, tmux et tmux-256color dans cet ordre ; un test échoué conserve le choix précédent. Une compilation qui n'a pas pu trouver l'entrée terminfo tmux-256color se retrouve donc avec tmux, screen-256color ou simplement screen, ce qui peut dégrader le rendu des couleurs et du tracé des boîtes.

Apprenez quatre touches et le reste sera confortable.

  • Esc interrompt Claude en pleine réponse tout en conservant le travail déjà effectué ; c'est donc la touche que vous voulez placer au plus près de votre pouce.
  • Ctrl+C interrompt également une opération en cours. À une invite inactive, la première pression efface la saisie et une seconde pression quitte Claude Code ; c'est donc l'outil le plus radical.
  • Esc pressé deux fois efface une ébauche de prompt, et sur un prompt vide, il ouvre le menu de retour en arrière.
  • Pour un prompt sur plusieurs lignes, tapez \ puis Entrée. Cette forme fonctionne dans tous les terminaux. Shift+Entrée n'est natif que dans une courte liste de terminaux de bureau, dont les clients mobiles ne font pas partie.

Évitez les volets divisés. Un téléphone en mode portrait fait environ 40 colonnes de large, donc une division verticale laisse 20 colonnes par volet et chaque diff devient illisible à cause des retours à la ligne. Utilisez plutôt les fenêtres tmux : Ctrl-b c en crée une et Ctrl-b n permet de passer à la suivante. Si une seconde fenêtre finit par héberger sa propre session Claude Code, les deux sessions peuvent se transmettre le travail directement au lieu que vous ayez à copier du texte entre les fenêtres sur un écran tactile. Tournez le téléphone en mode paysage lorsque vous devez lire un diff correctement.

La quantité de texte qui s'affiche sur cet écran mérite d'être définie délibérément, car un style de sortie modifie le prompt système derrière chaque réponse et un style plus concis signifie moins d'écrans à faire défiler sur un téléphone.

Une longue session sur un petit écran est principalement un problème de contexte, donc gérer la fenêtre de contexte de Claude Code mérite d'être lu avant d'essayer de travailler une journée entière depuis un train.

Sécurisation : clés uniquement, sans mots de passe

Votre téléphone contient désormais une clé pour accéder à une machine qui modifie votre code et exécute des commandes. Désactivez l'authentification par mot de passe. Un fichier de configuration « drop-in » est plus sûr que de modifier directement sshd_config, car le sshd_config d'Ubuntu inclut /etc/ssh/sshd_config.d/*.conf au début, et la première valeur trouvée pour un paramètre est celle qui est utilisée.

sudo tee /etc/ssh/sshd_config.d/00-phone.conf >/dev/null <<'EOF'
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
EOF
sudo sshd -t && sudo systemctl reload ssh

Les fichiers « drop-in » sont lus dans l'ordre alphabétique des noms de fichiers. Vérifiez sudo sshd -T pour passwordauthentication no, kbdinteractiveauthentication no, pubkeyauthentication yes et permitrootlogin no ; un fichier précédent qui définit l'une de ces valeurs est prioritaire et doit être corrigé à cet endroit.

sshd -t analyse la configuration et n'affiche rien si elle est valide. Si vous ignorez cette étape et qu'une faute de frappe est présente, sshd échouera lors du rechargement. Gardez votre session active et testez depuis une seconde connexion avant de fermer quoi que ce soit, car une mauvaise clé vous renverra Permission denied (publickey). et, sans mot de passe, vous n'aurez aucune solution de secours. La procédure de récupération consiste alors à utiliser la console de votre fournisseur. Si ce test de connexion échoue, reconnectez-vous avec ssh -v et corrigez le problème pendant que la première session est toujours ouverte, car ce message d'erreur couvre cinq défauts distincts et la sortie détaillée vous indiquera lequel vous concerne.

Attribuez une clé unique à chaque appareil. Perdre le téléphone signifie alors simplement supprimer une ligne de ~/.ssh/authorized_keys, et votre ordinateur portable continuera de fonctionner. Une clé partagée vous obligerait à changer la clé sur tous vos appareils.

Si vous déplacez SSH sur un autre port sous Ubuntu 24.04, notez que l'écouteur appartient à ssh.socket. Un générateur systemd construit ce socket à partir de la ligne Port dans votre configuration SSH, vous n'avez donc pas besoin d'un remplacement ListenStream, mais redémarrer ssh seul laisse le serveur à l'écoute sur le port 22. Placez la ligne Port dans un fichier « drop-in », autorisez le nouveau port dans ufw, puis exécutez sudo systemctl daemon-reload suivi de sudo systemctl restart ssh.socket. Sécuriser SSH sur un VPS couvre ce point ainsi que le reste de la surface d'exposition.

fail2ban pour SSH apporte peu de sécurité une fois les mots de passe désactivés, car un mot de passe deviné ne peut de toute façon pas être accepté. Ce qu'il apporte, ce sont des journaux plus propres, ce qui permet de repérer facilement une tentative de connexion réelle.

L'option la plus robuste consiste à garder SSH hors de l'internet public. Placez le serveur derrière un VPN WireGuard auto-hébergé, activez le tunnel sur le téléphone à la demande, et configurez sshd avec un ListenAddress sur le tunnel uniquement. mosh fonctionne via le tunnel car les deux extrémités utilisent l'UDP. Une mise en garde : le tunnel ajoute une surcharge de paquets ; si les transferts volumineux bloquent, réduisez le MTU (maximum transmission unit) dans la configuration WireGuard du téléphone.

Un dernier point sur cette méthode de travail. Depuis un téléphone, vous validez des demandes de permission sur un écran qui n'affiche que quelques lignes de diff à la fois. C'est une raison de conserver les garde-fous plutôt que de les désactiver. Vérifiez également dans quel mode de permission vos sessions démarrent, car le mode automatique est désormais le mode par défaut pour les sessions de terminal interactives depuis Claude Code v2.1.283, et il applique les modifications de fichiers dans le répertoire de travail sans demander confirmation. Exécuter Claude Code en toute sécurité sur un VPS détaille les limites d'utilisateur et de répertoire à définir avant que votre accès principal ne soit un écran tactile.

En cas de problème lors d'une reconnexion

tmux attach printing no server running on /tmp/tmux-1000/default signifie que tmux n'a trouvé aucun serveur sur ce socket. Le serveur a généralement disparu, ce qui indique presque toujours que la machine a redémarré. Vérifiez avec uptime. Si la machine n'a pas redémarré et que pgrep tmux affiche toujours un serveur, cela ne signifie pas nécessairement que le fichier socket a été supprimé, car les flags -L et -S permettent à un serveur d'écouter sur un socket différent. Si vous avez lancé tmux avec l'un d'eux, passez le même flag à tmux attach. Si le socket a réellement été supprimé par erreur, pkill -USR1 tmux demande au serveur de le recréer, ce qui, comme le précise le manuel de tmux, échoue si un répertoire parent est manquant. Les mises à jour du noyau via les mises à jour de sécurité automatiques nécessitent un redémarrage pour être effectives, mais unattended-upgrades ne redémarre automatiquement que si Unattended-Upgrade::Automatic-Reboot est activé ; sa valeur par défaut est false. Une machine redémarrée ne contient aucune session tmux, considérez donc toute exécution de Claude Code comme un processus que vous pouvez relancer.

can't find session: claude est différent. Le serveur tmux est en cours d'exécution mais ce nom n'existe pas. tmux ls affiche ce qui existe réellement.

Si vous vous reconnectez et que vous trouvez un shell classique là où se trouvait Claude Code, le processus s'est terminé sans que la session ne soit close. Consultez dmesg -T | tail pour une ligne telle que Out of memory: Killed process 4821 (claude), ce qui confirme une interruption par l'OOM Killer (Out-Of-Memory). Vérifiez le scrollback du shell au-dessus de l'invite pour d'autres messages de sortie.

Une fenêtre qui réapparaît avec une taille incorrecte, tronquée sur le bord ou avec de l'espace inutilisé autour, signifie que deux clients sont connectés avec des tailles différentes. Par défaut, tmux 3.4 ajuste la taille d'une fenêtre au client ayant eu l'activité la plus récente (window-size latest), ainsi votre ordinateur portable, toujours connecté avec 200 colonnes de large, et votre téléphone avec 40 colonnes, redimensionnent la fenêtre à tour de rôle. Déconnectez les autres clients lors de votre connexion : tmux attach -d -t claude.

FAQ

Puis-je exécuter Claude Code directement sur mon téléphone plutôt que sur un VPS ?

L'interface en ligne de commande (CLI) n'est pas prise en charge sur Android ou iOS. Les plateformes supportées en octobre 2026 sont macOS, Windows, Ubuntu 20.04 ou version ultérieure, Debian 10 ou version ultérieure, et Alpine 3.19 ou version ultérieure, avec au moins 4 Go de RAM. Android et iOS ne figurent pas dans cette liste. De plus, un téléphone met ses applications en veille et change constamment d'adresse réseau, ce qu'une exécution longue d'un agent ne peut tolérer. Exécutez-le sur un serveur et utilisez le téléphone comme simple écran.

La session survit-elle si je ferme l'application ou si je perds le signal ?

Oui, et deux composants distincts assurent cette fonction. tmux maintient le processus actif sur le serveur, empêchant toute interruption lors de la coupure de la connexion. mosh maintient la connexion elle-même active lors d'un changement d'adresse, de sorte que le passage du Wi-Fi aux données mobiles ne nécessite même pas de reconnexion. Avec un SSH classique sans tmux, une coupure de connexion envoie un signal SIGHUP et Claude Code s'arrête en pleine tâche.

Pourquoi mosh se connecte-t-il mais n'affiche rien ?

Une connexion qui réussit mais reste bloquée avec Nothing received from server on UDP port 60001. signifie que le client ne peut pas atteindre mosh-server sur ce port UDP, ce qui indique généralement qu'un pare-feu bloque la plage UDP 60000 à 61000. Ajoutez cette plage dans ufw, et ajoutez-la également dans le pare-feu réseau de votre fournisseur, qui constitue un contrôle distinct sur la plupart des interfaces de gestion. Si mosh signale plutôt que mosh-server est introuvable, le paquet est absent du serveur ou votre shell de connexion PATH ne l'inclut pas : installez-le avec sudo apt install mosh, ou utilisez mosh --server=/usr/bin/mosh-server you@server.

Comment interrompre Claude Code depuis un clavier sans touche Esc ?

Ajoutez une ligne de touches. Termux permet d'en configurer une avec extra-keys dans ~/.termux/termux.properties, tandis que Termius et Blink proposent tous deux une ligne personnalisable dans leurs paramètres. Esc interrompt une réponse en cours tout en conservant le travail déjà effectué. Ctrl+C interrompt également, mais une double pression sur cette touche alors que l'invite est inactive ferme Claude Code ; privilégiez donc Esc.

Est-il suffisamment sûr d'exposer SSH sur Internet pour cet usage ?

Si l'authentification par mot de passe est désactivée, le seul identifiant pouvant réussir est une clé qui ne quitte jamais vos appareils, ce qui représente un risque acceptable pour une machine que vous pouvez reconstruire. Attribuez une clé unique à chaque appareil afin qu'en cas de perte du téléphone, il suffise de supprimer une ligne dans authorized_keys. Si vous préférez ne pas répondre sur un port public, placez la machine derrière WireGuard et configurez sshd pour qu'il écoute sur l'adresse du tunnel.

Cet article vous a-t-il été utile ?