SSD Nodes Learn Hosting plans →
Guide Matt ConnorDi Matt Connor · Aggiornato 2026-08-27

Claude Code dal telefono: guida a SSH e tmux

Claude Code gira in tmux su un VPS, mentre il telefono mostra solo la sessione. Configura chiavi SSH, mosh e i comandi tmux per lavorare anche con rete instabile.

Claude Code dal telefono: come funziona realmente

Claude Code dal telefono non è un'app mobile. Claude Code viene eseguito su un VPS (virtual private server), all'interno di una sessione tmux che rimane aperta, mentre il telefono apre una connessione SSH (secure shell) a quella sessione finché la si visualizza. Se si chiude l'app, l'agente continua a lavorare, perché il processo non è mai stato eseguito sul telefono.

Questa separazione è l'intero progetto. Un sistema operativo mobile sospende un'app pochi secondi dopo che si passa a un'altra, quindi qualsiasi processo lungo avviato sul telefono si interrompe. Inoltre, il telefono riceve un nuovo indirizzo di rete ogni volta che si passa dal Wi-Fi 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 componenti: tmux per mantenere la sessione, chiavi SSH per accedere, mosh per gestire i cambi di rete e Claude Code. Sul telefono serve una sola app terminale con una riga di tasti facilmente accessibile.

Cosa serve sul VPS

Per le sezioni relative a 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 consente di installarlo, ma sotto carico il kernel termina il processo. Claude Code richiede inoltre un account Claude a pagamento (Pro, Max, Team o Enterprise) oppure un account Console con accesso API, perché il piano gratuito di Claude.ai non lo include.

Configura la macchina con un utente ordinario dotato di sudo, non come root. Se il server è nuovo, segui prima i primi dieci minuti su un nuovo VPS, perché le modifiche SSH descritte più avanti in 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 inserisce 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 inclusa in PATH: esegui il logout, accedi nuovamente, quindi verifica con command -v claude. claude doctor stampa la diagnostica dell'installazione e delle impostazioni senza avviare una sessione.

Accedi ora una volta da un portatile, prima di dipendere dal telefono. Esegui claude in una directory del progetto e segui la richiesta di accesso. La procedura chiede di aprire un URL in un browser e riportare un codice nel terminale; gestire due applicazioni sullo schermo di un telefono per completare questa procedura è lento. Eseguila una volta con una tastiera reale: le credenziali resteranno sul server.

Avviare Claude Code all’interno di tmux per evitare che una connessione interrotta termini il processo

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

Scollegati con Ctrl-b e poi con d. tmux stampa [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 stampa 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 ti eri fermato, inclusa la modifica lasciata a metà.

Questo funziona perché tmux esegue un processo server autonomo e 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 interruzione, SIGHUP, ai processi associati a quella connessione; il server tmux non fa parte di 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 illustra più dettagliatamente la struttura della sessione.

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

Collegamento automatico a ogni accesso

Digitare il comando di collegamento su una tastiera touch diventa presto scomodo. Aggiungi questo comando 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 copre entrambi i casi. exec sostituisce la shell di accesso con tmux; quando esci da tmux, la connessione viene quindi chiusa invece di lasciarti davanti a un prompt vuoto. Quando ti serve una shell normale, salta il file con: ssh you@server -t "bash --noprofile".

Inseriscilo in ~/.profile e non in ~/.bashrc. ~/.bashrc viene eseguito anche per le sessioni non interattive, quindi i trasferimenti di file si interrompono: 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 nel caso di 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 interna a tmux restituisce command not found, la causa è l'ordine di esecuzione. Avvia quindi tmux da una shell di accesso come descritto sopra, invece di usare uno script che salta il profilo.

Entrambe le applicazioni supportano SSH e mosh e memorizzano le chiavi nell'applicazione. La differenza riguarda l'interfaccia.

Blink Shell è basata 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, mentre la sezione Keys consente di creare una coppia di chiavi.

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

In entrambi i casi, genera la chiave all'interno dell'applicazione e non copiare mai una chiave privata esistente sul telefono. L'applicazione mostra la parte pubblica, cioè l'unica riga da aggiungere a ~/.ssh/authorized_keys sul server. Chiavi SSH per dispositivo e revoca di una chiave descrive la convenzione di denominazione e la procedura di revoca, che sono ancora più importanti per un telefono che per un laptop.

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

Android: Termux

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

Termux include OpenSSH e mosh nel proprio repository, quindi ssh, ssh-keygen e mosh si comportano come su un 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 dispone dei tasti Esc e Ctrl, ma Claude Code richiede entrambi. Termux può visualizzare una riga di tasti aggiuntiva. Inserisci una riga in ~/.termux/termux.properties:

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

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

Android può arrestare Termux quando resta in background. In questo caso perdi soltanto la connessione e devi ristabilirla. La sessione e l'agent restano 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 si esce dalla copertura Wi-Fi, il telefono riceve un nuovo indirizzo dalla rete mobile, quindi la vecchia connessione non corrisponde più a nulla su nessuno dei due endpoint. Nessun componente lo segnala. Il terminale smette semplicemente di rispondere finché TCP non abbandona il tentativo, quindi ssh stampa client_loop: send disconnect: Broken pipe. Per terminare subito una sessione bloccata, premere Enter, poi ~ e infine ..

mosh (mobile shell) elimina questo tipo di interruzione. Usa SSH una sola volta per autenticarsi e avviare un processo mosh-server, legge la porta UDP (user datagram protocol) scelta dal server e chiude la connessione SSH. Da quel momento, i due endpoint si scambiano datagrammi UDP autenticati con una chiave di sessione condivisa, quindi la sessione viene identificata da quella chiave e non dall'indirizzo. Quando l'indirizzo cambia, la sessione continua. mosh visualizza inoltre localmente i caratteri digitati e ridisegna il terminale quando lo stato ricevuto dal server è diverso. Per questo resta utilizzabile anche su una connessione mobile lenta.

mosh usa una porta UDP compresa tra 60000 e 61000. Aprire 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 relativo pannello di controllo, aggiungere lo stesso intervallo anche lì, perché una regola ufw non può modificare il comportamento di un filtro che si trova davanti alla macchina.

Due problemi di mosh sono comuni. Se l'accesso riesce ma poi si blocca e mostra Nothing received from server on UDP port 60001., l'intervallo UDP è bloccato in un punto qualsiasi tra il telefono e il server. Se la connessione segnala che mosh-server non è stato trovato, il pacchetto manca sul server oppure non è presente nel PATH dell'accesso. Installarlo oppure indicarlo direttamente con mosh --server=/usr/bin/mosh-server you@server.

mosh rifiuta inoltre di avviarsi quando la locale dell'accesso non usa UTF-8 e lo segnala con: mosh-server needs a UTF-8 native locale to run. Correggere 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 l'inoltro X né gli utilizzi 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 soltanto la schermata visibile, quindi non dispone di uno scrollback proprio. In questo caso il secondo limite non è rilevante, perché lo scrollback viene mantenuto da tmux: Ctrl-b, poi [ attiva la modalità di copia; per scorrere si può trascinare oppure usare i tasti freccia, mentre q consente di uscire.

Rendere utilizzabile lo schermo del telefono

Quattro righe in ~/.tmux.conf sul server svolgono quasi tutto il 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 dito in uno scorrimento e un tocco nella selezione di un pannello o di una finestra. Questo sostituisce la maggior parte dei tasti prefisso, scomodi 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 di disegno dei riquadri. Se tmux rifiuta quindi di avviarsi con missing or unsuitable terminal: tmux-256color, manca la voce terminfo: sudo apt install ncurses-term.

Impara quattro tasti; il resto diventa semplice.

  • Esc interrompe Claude durante la risposta e conserva il lavoro già completato. È quindi il tasto da tenere più vicino al pollice.
  • Anche Ctrl+C interrompe un'operazione in corso. Quando il prompt è inattivo, la prima pressione cancella l'input e la seconda chiude Claude Code. È quindi lo strumento più drastico.
  • Premendo due volte Esc si cancella una bozza di prompt; con il prompt vuoto apre invece il menu di ripristino.
  • Per un prompt su più righe, digita \ e poi premi Enter. Questa forma funziona in ogni terminale. Shift+Enter è supportato nativamente solo da un breve elenco di terminali desktop, tra cui non rientrano i client mobili.

Evita i pannelli divisi. Un telefono in modalità verticale è largo circa 40 colonne, quindi una divisione verticale lascia 20 colonne per pannello e ogni diff va a capo, diventando illeggibile. Usa invece le finestre tmux: Ctrl-b c ne crea una e Ctrl-b n passa a quella successiva. Se una seconda finestra finisce per contenere una propria sessione Claude Code, le due sessioni possono passarsi direttamente il lavoro invece di costringerti a copiare testo tra le finestre su uno schermo touch. Ruota il telefono in orizzontale quando devi leggere correttamente un diff.

La quantità di testo visualizzata merita di essere impostata deliberatamente, perché uno stile di output modifica il prompt di sistema alla base di ogni risposta e uno stile più conciso richiede meno schermate da scorrere sul telefono.

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.

Blocca tutto: 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é Ubuntu include /etc/ssh/sshd_config.d/*.conf all'inizio di sshd_config e usa il primo valore trovato per ogni 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 salti, un solo errore di battitura fa fallire sshd al reload. Lascia aperta la sessione attiva e verifica da una seconda connessione prima di chiudere qualsiasi cosa, perché una chiave errata ti dà Permission denied (publickey). e, con le password disattivate, non hai alcun fallback. A quel punto, per il ripristino devi usare la console del provider.

Assegna una chiave distinta a ogni dispositivo. Se perdi il telefono, devi eliminare una sola riga da ~/.ssh/authorized_keys e 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, considera che il listener appartiene a ssh.socket. Di conseguenza, una riga Port da sola non modifica nulla. Esegui sudo systemctl edit ssh.socket, azzera il valore predefinito con un ListenStream= vuoto, quindi imposta la porta nella riga successiva. Hardening 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. Riduce però il rumore nei log, facilitando l'individuazione di un vero tentativo di accesso.

L'opzione più sicura consiste nel tenere SSH fuori da Internet pubblico. Metti il server dietro una VPN WireGuard che gestisci autonomamente, attiva il tunnel sul telefono quando serve e assegna a sshd un ListenAddress soltanto sul tunnel. mosh funziona attraverso il tunnel perché entrambi i lati usano UDP. C'è però una limitazione: 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 solo 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 relativi a utente e directory che conviene impostare prima che il touchscreen diventi il principale punto di accesso.

Quando ti riconnetti e qualcosa non funziona

tmux attach che restituisce no server running on /tmp/tmux-1000/default significa che il server tmux non è più in esecuzione. Nella maggior parte dei casi, il computer è stato riavviato. Verificalo con uptime. Gli aggiornamenti di sicurezza automatici del kernel tramite aggiornamenti di sicurezza automatici riavviano il sistema. Dopo un riavvio non esiste alcuna sessione tmux. Considera quindi 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 il nome specificato non esiste. tmux ls mostra le sessioni disponibili.

Se, dopo il collegamento, trovi un normale prompt della shell nel punto in cui era in esecuzione Claude Code, il processo è 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 un sistema con meno di 4 GB di memoria. Se non trovi questa riga, Claude Code si è chiuso autonomamente. Il motivo è riportato nello scrollback della shell sopra il prompt.

Se una finestra torna molto piccola, con spazio vuoto intorno, significa che due client sono collegati con dimensioni diverse. tmux adatta infatti 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 durante il collegamento con 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 applicazioni e cambia continuamente indirizzo di rete. Questo non è compatibile con l'esecuzione prolungata di un agent. Esegui Claude Code su un server e usa il telefono come display.

La sessione sopravvive se chiudo l'applicazione o perdo il segnale?

Sì. Due componenti distinti gestiscono questo comportamento. tmux mantiene in esecuzione il processo sul server, quindi la fine della connessione non interrompe nulla. 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 durante l'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., le porte UDP da 60000 a 61000 non sono aperte. Aggiungi l'intervallo in ufw, quindi 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, nel server manca il pacchetto: sudo apt install mosh.

Come posso interrompere Claude Code da una tastiera priva del tasto Esc?

Aggiungi una riga di tasti. Termux ne configura una con extra-keys in ~/.termux/termux.properties; Termius e Blink includono entrambi una riga che puoi modificare nelle impostazioni. Esc interrompe la 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. Per prima cosa usa quindi Esc.

È sufficientemente sicuro esporre SSH a Internet?

Con l'autenticazione tramite password disabilitata, l'unica credenziale valida è 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ì la perdita del telefono richiede la rimozione di una sola riga da authorized_keys. Se preferisci non rispondere affatto su una porta pubblica, colloca il server dietro WireGuard e configura sshd in ascolto sull'indirizzo del tunnel.