SSD Nodes Learn 8GB di RAM — $66/anno
Guide Matt ConnorDi Matt Connor · Aggiornato 2026-08-02

Come usare Claude Code dal telefono con SSH e tmux

Claude Code gira in tmux su un VPS: il telefono è solo la finestra. Configura chiavi SSH, mosh per reti instabili, tmux attach e una tastiera adatta.

Claude Code dal telefono: come funziona realmente

Claude Code dal telefono non è un'app mobile. Claude Code viene eseguito su un VPS (server privato virtuale), all'interno di una sessione tmux che rimane aperta. Il telefono apre una connessione SSH (secure shell) a quella sessione finché la stai visualizzando. Se chiudi l'app, l'agent continua a lavorare perché il processo non è mai stato eseguito sul telefono.

Questa separazione è alla base del design. Un sistema operativo mobile sospende un'app pochi secondi dopo che passi a un'altra app. Di conseguenza, qualsiasi attività lunga avviata sul telefono si interrompe. Inoltre, il telefono riceve un nuovo indirizzo di rete ogni volta che passi dal wifi alla rete dati mobile. Entrambi i problemi scompaiono quando il processo viene eseguito su un server e il telefono visualizza soltanto lo schermo.

Sul server servono quattro elementi: tmux per mantenere la sessione, le chiavi SSH per accedere, mosh per gestire i cambiamenti di rete e Claude Code. Sul telefono serve una sola terminal app con una riga di tasti facilmente accessibile.

Requisiti per il VPS

Per le sezioni su SSH e tmux è sufficiente una piccola macchina Ubuntu 24.04. Claude Code richiede risorse maggiori. I requisiti ufficiali, a luglio 2026, sono Ubuntu 20.04 o versioni successive su un processore x64 o ARM64, con almeno 4 GB di RAM. Un piano da 1 GB installa il programma, ma sotto carico il kernel termina il processo. Claude Code richiede anche un account Claude a pagamento (Pro, Max, Team o Enterprise) oppure un account Console con accesso API, perché il piano gratuito Claude.ai non lo include.

Configura la macchina con un utente normale dotato di sudo, non come root. Se il server è nuovo, completa prima i primi dieci minuti su un nuovo VPS, perché le modifiche SSH successive di questa guida sono più semplici dopo aver creato l'utente e configurato il firewall.

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

Il programma di installazione colloca il binario in ~/.local/bin/claude e claude --version stampa una riga simile a 2.1.211 (Claude Code). Se stampa command not found, quella directory non è ancora presente nel tuo PATH: esegui il logout, accedi di nuovo e verifica con command -v claude. claude doctor stampa le informazioni diagnostiche sull'installazione e sulle impostazioni senza avviare una sessione.

Accedi ora una volta, da un laptop, prima di affidarti al telefono. Esegui claude in una directory del progetto e segui la richiesta di accesso. La procedura chiede di aprire un URL nel browser e riportare un codice nel terminale; gestire due app sullo schermo del telefono per completare l'operazione è lento. Esegui questa procedura una volta con una tastiera reale: le credenziali rimarranno sul server.

Avviare Claude Code in tmux per impedire che una connessione interrotta lo termini

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

Scollegati con Ctrl-b e poi con d. tmux visualizza [detached (from session claude)] e restituisce il controllo alla shell. Ora puoi chiudere l'app, perdere il segnale o mettere il telefono in tasca. Il riquadro continua a essere eseguito.

tmux ls
tmux attach -t claude

tmux ls visualizza una riga per ogni sessione, ad esempio claude: 1 windows (created Thu Jul 30 09:14:02 2026). tmux attach -t claude riporta esattamente al punto in cui avevi interrotto il lavoro, inclusa la modifica parzialmente completata.

Questo funziona perché tmux esegue un processo server proprio. La shell e Claude Code sono processi figli di quel server, non di sshd. Quando la connessione SSH termina, il kernel invia il segnale di riaggancio, SIGHUP, ai processi associati a quella connessione. Il server tmux non è tra questi processi. Senza tmux, lo stesso blocco dello schermo che interrompe la connessione arresta Claude Code durante una chiamata a uno strumento. Eseguire Claude Code su un VPS all'interno di tmux tratta più approfonditamente la disposizione della sessione.

Esegui tmux sul server, mai sul telefono. Digitando tmux all'interno di una sessione a cui sei già collegato viene visualizzato sessions should be nested with care, unset $TMUX to force. Se lo esegui comunque, ti ritrovi con due tasti prefisso in conflitto.

Connessione automatica a ogni accesso

Digitare il comando attach su una tastiera touch diventa presto scomodo. Inserisci quanto segue alla fine di ~/.profile sul server:

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 si collega alla sessione denominata claude se esiste e la crea se non esiste, quindi un solo comando gestisce entrambi i casi. exec sostituisce la shell di accesso con tmux, quindi uscire da tmux chiude la connessione invece di lasciare un prompt vuoto. Quando ti serve una shell normale, ignora il file: ssh you@server -t "bash --noprofile".

Inseriscilo in ~/.profile, non in ~/.bashrc. ~/.bashrc viene eseguito anche per le sessioni non interattive, quindi i trasferimenti di file non funzionano: scp e sftp interpretano l'output imprevisto come dati del protocollo e terminano con Received message too long. ~/.profile viene eseguito solo per le shell di accesso, come avviene per una sessione SSH interattiva.

~/.profile è anche il file in cui Ubuntu aggiunge ~/.local/bin a PATH. Se claude funziona subito dopo l'accesso, ma una shell avviata all'interno di tmux restituisce command not found, il motivo è l'ordine di esecuzione. Avvia quindi tmux da una shell di accesso come indicato sopra, non da uno script che ignora il profilo.

Entrambe le app supportano SSH e mosh e archiviano le chiavi nell'app. La differenza riguarda l'interfaccia.

Blink Shell è basato sui comandi. Al prompt si digitano ssh you@server o mosh you@server, usando la stessa sintassi di un terminale desktop. Le impostazioni si aprono digitando config e la sezione Keys consente di creare una coppia di chiavi.

Termius è basato sui moduli. Si compila una voce host, quindi si imposta SSH o Mosh nei dettagli dell'host. Termius include una propria implementazione di mosh e supporta mosh 1.3.0 e versioni successive; sul server è quindi comunque necessario installare il pacchetto mosh.

In entrambi i casi, genera la chiave nell'app e non copiare mai una chiave privata esistente sul telefono. L'app mostra la parte pubblica, cioè l'unica riga da aggiungere a ~/.ssh/authorized_keys sul server. Chiavi SSH per dispositivo e come revocarne una illustra la convenzione per i nomi e la procedura di revoca, che è ancora più importante per un telefono che per un laptop.

Attiva il blocco biometrico o con codice dell'app terminale. Senza questa protezione, un telefono sbloccato lascia aperta una shell sul server finché lo schermo rimane acceso.

Android: Termux

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

Termux fornisce OpenSSH e mosh nel proprio repository, quindi ssh, ssh-keygen e mosh funzionano come su un computer desktop. Aggiungi la riga con la chiave pubblica visualizzata a ~/.ssh/authorized_keys sul server, quindi connettiti con mosh you@server.

La tastiera su schermo di Android non ha il tasto Esc né il tasto Ctrl, ma Claude Code richiede entrambi. Termux può visualizzare una riga di tasti propria. Inserisci una riga in ~/.termux/termux.properties:

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

Esegui quindi termux-reload-settings: la riga viene visualizzata sopra la tastiera. Lo stesso ricaricamento rileva anche un carattere TrueType monospaziato copiato in ~/.termux/font.ttf.

Android può arrestare Termux quando rimane in background. In questo caso perdi solo la connessione e devi riconnetterti. La sessione e l'agente sono sul server.

Perché il terminale si blocca quando esco dalla copertura Wi-Fi e che cosa risolve mosh?

Una connessione SSH è una connessione TCP (transmission control protocol) e una connessione TCP è identificata da entrambi gli indirizzi e da entrambe le porte. Quando esci dalla copertura Wi-Fi, il telefono riceve un nuovo indirizzo dalla rete mobile. Di conseguenza, la vecchia connessione non corrisponde più a nulla su nessuno dei due lati. Nessun componente lo segnala. Il terminale smette semplicemente di rispondere finché TCP non abbandona il tentativo; a quel punto ssh stampa client_loop: send disconnect: Broken pipe. Per terminare subito una sessione bloccata, premi Enter, poi ~, quindi ..

mosh (mobile shell) elimina questo tipo di errore. Usa SSH una volta per autenticarsi e avviare un processo mosh-server, legge la porta UDP (user datagram protocol) scelta dal server e chiude la connessione SSH. Dopodiché i due lati si scambiano datagrammi UDP autenticati con una chiave di sessione condivisa. La sessione viene quindi identificata da quella chiave e non dall'indirizzo. Un nuovo indirizzo non interrompe la sessione. mosh visualizza inoltre localmente ciò che digiti e aggiorna lo schermo quando il server restituisce un risultato diverso. Per questo rimane utilizzabile anche su una connessione mobile lenta.

mosh usa una porta UDP compresa tra 60000 e 61000. Apri quindi questo intervallo:

sudo ufw allow 60000:61000/udp
sudo ufw status

Apertura delle porte con ufw contiene il resto della configurazione del firewall. Se il provider offre un firewall di rete separato nel pannello di controllo, aggiungi anche lì lo stesso intervallo. Una regola ufw non può infatti influire su un filtro situato davanti alla macchina.

Due errori di mosh sono comuni. Se l'accesso riesce e poi si blocca, mostrando Nothing received from server on UDP port 60001., significa che l'intervallo UDP è bloccato in un punto tra il telefono e il server. Se una connessione segnala che mosh-server non è stato trovato, il pacchetto manca sul server oppure non è presente nel valore di accesso PATH. Installalo oppure specificalo direttamente con mosh --server=/usr/bin/mosh-server you@server.

mosh rifiuta inoltre di avviarsi quando la locale di accesso non è UTF-8 e lo segnala con: mosh-server needs a UTF-8 native locale to run.. Correggi la locale sul server, non sul telefono.

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

mosh non svolge due funzioni. Il README specifica che mosh non supporta il forwarding X né gli usi non interattivi di SSH, incluso il port forwarding. Per visualizzare in anteprima un'applicazione web appena avviata da Claude Code serve quindi ancora un normale ssh -L 8080:127.0.0.1:8080 you@server. Inoltre sincronizza solo la schermata visibile e non dispone di uno scrollback proprio. Questo secondo limite non crea problemi in questo caso, perché tmux conserva lo scrollback: Ctrl-b, quindi [ attiva la modalità di copia; puoi scorrere con il trascinamento o con i tasti freccia e premere q per uscire.

Rendere utilizzabile lo schermo di un telefono

Quattro righe in ~/.tmux.conf sul server svolgono la maggior parte del lavoro:

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

mouse on trasforma il trascinamento con il tocco in uno scorrimento e un tocco nella selezione di un riquadro o di una finestra. Questo sostituisce la maggior parte dei tasti prefisso, difficili da digitare. status-position top sposta la riga di stato di tmux dal bordo inferiore, dove la tastiera su schermo e la relativa barra dei suggerimenti la coprono. default-terminal è importante perché, altrimenti, tmux comunica a Claude Code di usare un terminale screen, causando una resa peggiore dei colori e dei caratteri per il disegno dei riquadri. Se tmux si rifiuta quindi di avviarsi con missing or unsuitable terminal: tmux-256color, manca la voce terminfo: sudo apt install ncurses-term.

Impara quattro tasti e il resto diventa semplice.

  • Esc interrompe Claude durante la risposta e conserva il lavoro già completato. È quindi il tasto che conviene tenere più vicino al pollice.
  • Ctrl+C interrompe anch'esso un'operazione in corso. A un prompt inattivo, la prima pressione cancella l'input e la seconda esce da Claude Code. È quindi lo strumento più drastico.
  • Esc premuto due volte cancella una bozza di prompt. A un prompt vuoto apre invece il menu di riavvolgimento.
  • Per un prompt su più righe, digita \ e poi premi Enter. Questa forma funziona in qualsiasi terminale. Shift+Enter è supportato nativamente solo da un breve elenco di terminali desktop, che non include i client mobili.

Evita i riquadri divisi. Un telefono in orientamento verticale è largo circa 40 colonne. Una divisione verticale lascia quindi 20 colonne per riquadro e ogni diff va a capo in modo difficile da leggere. Usa invece le finestre di tmux: Ctrl-b c ne crea una e Ctrl-b n passa a quella successiva. Ruota il telefono in orizzontale quando devi leggere correttamente un diff.

Una sessione lunga su uno schermo piccolo è soprattutto un problema di contesto. Per questo vale la pena leggere gestire la finestra di contesto di Claude Code prima di provare a svolgere un'intera giornata di lavoro da un treno.

Bloccalo: solo chiavi, nessuna password

Ora il telefono contiene una chiave per una macchina che modifica il codice ed esegue comandi. Disattiva l'autenticazione tramite password. Un file drop-in è più sicuro che modificare direttamente sshd_config, perché sshd_config di Ubuntu include /etc/ssh/sshd_config.d/*.conf all'inizio e viene usato il primo valore trovato per un'impostazione.

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

sshd -t analizza la configurazione e non stampa nulla quando è valida. Se lo ometti, un solo errore di battitura fa fallire sshd durante il ricaricamento. Mantieni aperta la sessione attiva e verifica da una seconda connessione prima di chiudere qualsiasi cosa, perché una chiave errata ora restituisce Permission denied (publickey). e, con le password disattivate, non hai alcun fallback. A quel punto, il percorso di ripristino è la console del provider.

Assegna a ogni dispositivo una chiave distinta. Se perdi il telefono, devi solo eliminare una riga da ~/.ssh/authorized_keys, mentre il laptop continua a funzionare. Con una chiave condivisa, devi sostituire la chiave su ogni dispositivo che possiedi.

Se sposti SSH su un'altra porta in Ubuntu 24.04, tieni presente che il listener appartiene a ssh.socket, quindi una riga Port da sola non modifica nulla. Esegui sudo systemctl edit ssh.socket, cancella il valore predefinito con un ListenStream= vuoto, quindi imposta la porta nella riga successiva. Rafforzare la sicurezza di SSH su un VPS descrive questa procedura e il resto della superficie di attacco.

fail2ban per SSH aggiunge poca sicurezza quando le password sono disattivate, perché una password indovinata non può essere accettata in alcun caso. Aggiunge però log più silenziosi, che rendono facile individuare un tentativo di accesso reale.

L'opzione più sicura consiste nel mantenere SSH fuori dalla rete internet pubblica. Metti il server dietro una VPN WireGuard che gestisci autonomamente, attiva il tunnel sul telefono quando necessario e assegna a sshd un ListenAddress solo sul tunnel. mosh funziona attraverso il tunnel perché entrambi i lati usano UDP. C'è un limite: il tunnel aggiunge overhead ai pacchetti. Se i trasferimenti di grandi dimensioni si bloccano, riduci l'MTU (maximum transmission unit) nella configurazione WireGuard del telefono.

Un ultimo aspetto riguarda questo modo di lavorare. Dal telefono approvi le richieste di autorizzazione su uno schermo che mostra poche righe di diff alla volta. Questo è un motivo per mantenere le protezioni, non per disattivarle. Eseguire Claude Code in sicurezza su un VPS descrive i limiti per utenti e directory che conviene impostare prima che il principale punto di accesso diventi un touchscreen.

Quando ti ricolleghi e qualcosa non funziona

tmux attach restituisce no server running on /tmp/tmux-1000/default: significa che il server tmux non è più attivo, cosa che quasi sempre indica il riavvio della macchina. Verifica con uptime. Gli aggiornamenti automatici del kernel tramite aggiornamenti automatici della sicurezza riavviano il sistema. Dopo un riavvio non esiste alcuna sessione tmux, quindi considera ogni esecuzione di Claude Code come un'attività che puoi riavviare.

can't find session: claude indica una situazione diversa. Il server tmux è in esecuzione, ma quella sessione non esiste. tmux ls mostra le sessioni effettivamente presenti.

Se, dopo il collegamento, trovi un semplice prompt della shell al posto di Claude Code, il processo si è terminato senza chiudere la sessione. Controlla dmesg -T | tail e cerca una riga come Out of memory: Killed process 4821 (claude). È ciò che accade durante una modifica di grandi dimensioni su una macchina con meno dei 4 GB richiesti. Se non trovi quella riga, Claude Code si è chiuso autonomamente. Il motivo è visibile nello scrollback della shell sopra il prompt.

Se una finestra torna molto piccola, con spazio inutilizzato intorno, significa che due client sono collegati con dimensioni diverse. tmux adatta la finestra al client collegato più piccolo. Il laptop mantiene ancora la sessione a 200 colonne, mentre il telefono richiede 40 colonne. Scollega gli altri client quando ti colleghi: tmux attach -d -t claude.

FAQ

Posso eseguire Claude Code direttamente sul telefono invece che su un VPS?

No. A luglio 2026, le piattaforme supportate sono macOS, Windows, Ubuntu 20.04 o versioni successive, Debian 10 o versioni successive e Alpine 3.19 o versioni successive, con almeno 4 GB di RAM. Android e iOS non sono inclusi nell'elenco. Inoltre, il telefono sospende le app e cambia continuamente indirizzo di rete, condizioni che un'esecuzione prolungata dell'agente non può tollerare. Esegui Claude Code su un server e usa il telefono come display.

La sessione rimane attiva se chiudo l'app o perdo il segnale?

Sì. Se ne occupano due componenti distinti. tmux mantiene il processo in esecuzione sul server, quindi la sessione non termina quando la connessione si interrompe. mosh mantiene attiva la connessione anche quando cambia l'indirizzo, quindi il passaggio dal wifi alla rete mobile non richiede nemmeno una nuova connessione. Con il solo SSH e senza tmux, una connessione interrotta invia SIGHUP e Claude Code si arresta a metà dell'attività.

Perché mosh si connette e poi non mostra nulla?

Se il login riesce e poi si blocca con Nothing received from server on UDP port 60001., significa che UDP 60000-61000 non è aperto. Aggiungi l'intervallo in ufw e aggiungilo anche nel firewall di rete del provider, che nella maggior parte dei pannelli è un controllo separato. Se invece mosh segnala che mosh-server non è stato trovato, sul server manca il pacchetto: sudo apt install mosh.

Come posso interrompere Claude Code dalla tastiera se non c'è il tasto Esc?

Aggiungi una riga di tasti. Termux ne configura una con extra-keys in ~/.termux/termux.properties, mentre Termius e Blink includono entrambi una riga modificabile nelle impostazioni. Esc interrompe una risposta in esecuzione e conserva il lavoro già completato. Anche Ctrl+C interrompe l'esecuzione, ma se lo premi due volte quando il prompt è inattivo, esce da Claude Code. Usa quindi prima Esc.

È sufficientemente sicuro esporre SSH a Internet?

Con l'autenticazione tramite password disattivata, l'unica credenziale che può avere esito positivo è una chiave che non lascia mai i tuoi dispositivi. Per una macchina che puoi ricreare, questo rappresenta un rischio ragionevole. Assegna a ogni dispositivo una chiave distinta, così in caso di perdita del telefono devi rimuovere una sola riga da authorized_keys. Se preferisci non rispondere affatto su una porta pubblica, colloca il server dietro WireGuard e configura sshd perché ascolti sull'indirizzo del tunnel.