SSD Nodes Learn Hosting plans →
Guide Matt ConnorDi Matt Connor · Aggiornato 2026-10-30

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

Questa guida utilizza un'app terminale sul telefono. Claude Code viene eseguito su un VPS (virtual private server), all'interno di una sessione tmux che rimane aperta; il telefono stabilisce una connessione SSH (secure shell) verso tale sessione per tutto il tempo in cui la si visualizza. Chiudendo l'app, l'agente continua a lavorare poiché il processo non è mai stato eseguito sul telefono.

Claude Code offre anche il controllo remoto: esegui /remote-control all'interno di una sessione per utilizzarlo tramite l'app mobile Claude o un browser, mentre il processo rimane sul server.

Questa separazione è il fulcro del design. Il sistema operativo di un telefono sospende un'app pochi secondi dopo che l'utente passa ad altro, interrompendo qualsiasi operazione lunga avviata dal dispositivo. Inoltre, il telefono ottiene un nuovo indirizzo di rete ogni volta che passa dal Wi-Fi ai dati mobili. Entrambi i problemi vengono risolti eseguendo il processo su un server e limitando il telefono alla sola visualizzazione dello schermo.

Sul server sono necessari quattro elementi: tmux per mantenere la sessione, chiavi SSH per l'accesso, mosh per gestire i cambi di rete e Claude Code stesso. Sul lato telefono è sufficiente un'app terminale dotata di una riga di tasti facilmente accessibile.

Requisiti per la VPS

Una piccola istanza Ubuntu 24.04 è sufficiente per le operazioni SSH e tmux. Claude Code richiede risorse superiori. I requisiti ufficiali, aggiornati a ottobre 2026, prevedono Ubuntu 20.04 o versioni successive su processore x64 o ARM64, con almeno 4 GB di RAM. Claude Code necessita inoltre di un account Claude a pagamento (Pro, Max, Team o Enterprise), di un account Console con accesso API o dell'accesso tramite un provider cloud supportato come Amazon Bedrock, poiché il piano gratuito Claude.ai non include questa funzionalità.

Configura il server utilizzando un utente standard con privilegi sudo, evitando di operare come root. Se il server è nuovo, completa prima i primi dieci minuti su una nuova VPS, poiché le modifiche SSH descritte in seguito in questa guida risultano più semplici una volta configurati l'utente e 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 posiziona il binario in ~/.local/bin/claude e claude --version stampa una riga simile a 2.1.211 (Claude Code). Se viene visualizzato command not found, quella directory non è ancora presente nel tuo PATH: esegui il logout, effettua nuovamente l'accesso e verifica con command -v claude. claude doctor stampa la diagnostica dell'installazione e delle impostazioni senza avviare una sessione.

Effettua l'accesso una prima volta da un laptop, prima di fare affidamento esclusivamente sul telefono. Esegui claude all'interno di una directory di progetto e segui le istruzioni di login. La procedura richiede di aprire un URL in un browser e di riportare un codice nel terminale; gestire due app contemporaneamente sullo schermo di uno smartphone è poco efficiente. Esegui questa operazione con una tastiera fisica: le credenziali rimarranno salvate 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 login

Digitare il comando di attach su una tastiera touch diventa presto noioso. Inserisci questo 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 chiamata claude se esiste e la crea se non esiste, quindi un solo comando copre entrambi i casi. exec sostituisce la shell di login con tmux, così uscendo da tmux si chiude la connessione invece di ritrovarsi a un prompt vuoto. Quando ti serve una shell semplice, salta il file: ssh you@server -t "bash --noprofile".

Inseriscilo in ~/.profile e non in ~/.bashrc. Bash legge anche ~/.bashrc per i comandi SSH non interattivi, ma la protezione [ -t 1 ] qui sopra impedisce a questo blocco di avviare tmux durante un trasferimento file. I comandi di avvio non protetti che stampano output interrompono i protocolli di trasferimento con errori come Received message too long. ~/.profile viene eseguito solo per le shell di login, che è ciò che rappresenta una sessione SSH interattiva.

~/.profile è anche il punto in cui Ubuntu aggiunge ~/.local/bin a PATH. Se claude funziona correttamente dopo il login ma una shell all'interno di tmux restituisce command not found, il motivo è l'ordine di esecuzione; avvia quindi tmux da una shell di login come indicato sopra, invece che da 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 dal Wi-Fi e cosa risolve mosh?

Una connessione SSH è una connessione TCP (transmission control protocol), identificata sia dagli indirizzi che dalle porte di entrambi i capi. Quando esci dal raggio d'azione del Wi-Fi, il telefono ottiene un nuovo indirizzo dalla rete mobile; di conseguenza, la vecchia connessione non corrisponde più a nulla su nessuno dei due lati. Nessun sistema notifica questo evento. Il terminale smette semplicemente di rispondere finché TCP non rinuncia, dopodiché ssh stampa client_loop: send disconnect: Broken pipe. Per terminare immediatamente una sessione bloccata, premi Enter, poi ~, quindi ..

mosh (mobile shell) elimina questa modalità di errore. Utilizza SSH una sola volta per autenticarsi e avviare un processo mosh-server, legge la porta UDP (user datagram protocol) selezionata dal server e chiude la connessione SSH. Successivamente, le due parti si scambiano datagrammi UDP autenticati tramite una chiave di sessione condivisa; la sessione è quindi identificata da tale chiave e non dal tuo indirizzo. Un nuovo indirizzo non interrompe la comunicazione. mosh inoltre replica localmente ciò che digiti e aggiorna la visualizzazione quando il server non è allineato, motivo per cui rimane utilizzabile anche su collegamenti mobili lenti.

mosh utilizza una porta UDP compresa tra 60000 e 61000, quindi apri questo intervallo:

sudo ufw allow 60000:61000/udp
sudo ufw status

Apertura delle porte con ufw contiene il resto delle informazioni sul firewall. Se il tuo provider offre un firewall di rete separato nel suo pannello di controllo, aggiungi lo stesso intervallo anche lì, poiché una regola ufw non può influenzare un filtro posizionato a monte della macchina.

Due errori di mosh sono comuni. Un login che ha successo ma poi si blocca, mostrando Nothing received from server on UDP port 60001., significa che mosh-server è stato avviato ma il client non riesce a raggiungerlo su quella porta UDP. Generalmente ciò indica che un firewall tra il telefono e il server sta bloccando il traffico UDP nell'intervallo di mosh. Una connessione che riporta mosh-server not found significa che il pacchetto manca sul server o non è presente nella PATH di login. Installalo o puntalo direttamente con mosh --server=/usr/bin/mosh-server you@server.

Se la locale di login del server non è UTF-8, mosh-server tenta di utilizzare le impostazioni della locale fornite dal client ed effettua un nuovo controllo. Si rifiuta di avviarsi solo se anche questo tentativo non fornisce UTF-8, riportando mosh-server needs a UTF-8 native locale to run.. Correggi prima la locale sul server.

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

Entrambe le estremità necessitano di una locale UTF-8 e mosh-server applica anche le impostazioni della locale inviate dal client. Se l'errore persiste dopo la correzione sul server, imposta LANG su un valore UTF-8 anche nell'app terminale del telefono, come indicato nelle FAQ di mosh mosh-client.

Ci sono due cose che mosh non fa. Il suo README dichiara che mosh non supporta l'X forwarding o gli utilizzi non interattivi di SSH, incluso il port forwarding; pertanto, per visualizzare in anteprima un'applicazione web avviata da Claude Code è ancora necessario utilizzare il normale ssh -L 8080:127.0.0.1:8080 you@server. Inoltre, sincronizza solo lo schermo visibile, quindi non dispone di uno scrollback proprio. Questo secondo limite non è un problema in questo contesto, poiché tmux mantiene lo scrollback: Ctrl-b seguito da [ attiva la modalità copia, il trascinamento o i tasti freccia permettono lo scorrimento, e q esce dalla modalità.

Rendere utilizzabile lo schermo di uno smartphone

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 tattile in uno scorrimento e il tocco in una selezione di riquadro o finestra, sostituendo la maggior parte dei tasti prefissi scomodi da digitare. status-position top sposta la riga di stato di tmux dal bordo inferiore, dove la tastiera a schermo e la barra dei suggerimenti la coprirebbero. default-terminal fissa il nome del terminale che tmux comunica a Claude Code. Senza questa riga, tmux annuncia il nome scelto durante la compilazione. Lo script di configurazione di tmux 3.4 parte da screen, quindi testa screen-256color, tmux e tmux-256color in quest'ordine; un test fallito mantiene la scelta precedente. Una build che non è riuscita a trovare la voce terminfo tmux-256color finisce quindi con tmux, screen-256color o il semplice screen, rendendo i colori e il disegno dei riquadri peggiori del necessario.

Impara quattro tasti e il resto sarà confortevole.

  • Esc interrompe Claude a metà risposta e mantiene il lavoro già svolto, quindi è il tasto da tenere più vicino al pollice.
  • Ctrl+C interrompe anche un'operazione in corso. Con il prompt inattivo, la prima pressione cancella l'input e una seconda pressione chiude Claude Code, rendendolo lo strumento più drastico.
  • Esc premuto due volte cancella una bozza di prompt; con un prompt vuoto, apre invece il menu di riavvolgimento.
  • Per un prompt su più righe, digita \ e poi Invio. Questa forma funziona in ogni terminale. Shift+Enter è nativo solo in un breve elenco di terminali desktop, di cui i client mobile non fanno parte.

Evita di dividere i riquadri. Uno smartphone in verticale ha una larghezza di circa 40 colonne, quindi una divisione verticale lascia 20 colonne per riquadro e ogni diff diventa illeggibile a causa degli a capo. Usa invece le finestre di tmux: Ctrl-b c ne crea una e Ctrl-b n passa alla successiva. Se una seconda finestra finisce per ospitare la propria sessione di Claude Code, le due sessioni possono passarsi il lavoro direttamente invece di dover copiare il testo tra le finestre su un touchscreen. Ruota lo smartphone in orizzontale quando devi leggere un diff correttamente.

La quantità di testo visualizzata sullo schermo merita di essere impostata deliberatamente, poiché uno stile di output modifica il prompt di sistema dietro ogni risposta e uno più conciso significa meno schermate da scorrere su uno smartphone.

Una sessione lunga su uno schermo piccolo è principalmente un problema di contesto, quindi gestire la finestra di contesto di Claude Code è una lettura consigliata prima di provare a lavorare un'intera giornata dal treno.

Protezione: solo chiavi, niente password

Il telefono ora contiene una chiave per una macchina che modifica il codice ed esegue comandi. Disabilita l'autenticazione tramite password. Un file drop-in è più sicuro rispetto alla modifica diretta di sshd_config, poiché il file sshd_config di Ubuntu include /etc/ssh/sshd_config.d/*.conf all'inizio e il primo valore trovato per un'impostazione è quello utilizzato.

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

I file drop-in vengono letti in ordine alfabetico. Controlla sudo sshd -T per passwordauthentication no, kbdinteractiveauthentication no, pubkeyauthentication yes e permitrootlogin no; un file precedente che imposta uno di questi parametri ha la precedenza e deve essere corretto in quel punto.

sshd -t analizza la configurazione e non stampa nulla se è valida. Saltare questo passaggio significa che un errore di battitura farà fallire sshd al ricaricamento. Mantieni aperta la sessione di lavoro ed esegui un test da una seconda connessione prima di chiudere qualsiasi cosa, poiché una chiave errata ora ti restituirà Permission denied (publickey). e, con le password disabilitate, non avrai alternative. Il percorso di ripristino a quel punto è la console del tuo provider. Se la connessione di test fallisce, riconnettiti con ssh -v e risolvi il problema mentre la prima sessione è ancora aperta, poiché quel messaggio di errore copre cinque guasti distinti e l'output dettagliato ti indica quale di questi hai riscontrato.

Assegna a ogni dispositivo la propria chiave. Perdere il telefono significherà quindi eliminare una sola riga da ~/.ssh/authorized_keys, e il tuo portatile continuerà a funzionare. Una chiave condivisa significa dover cambiare la chiave su ogni dispositivo in tuo possesso.

Se sposti SSH su un'altra porta su Ubuntu 24.04, tieni presente che il listener appartiene a ssh.socket. Un generatore systemd crea quel socket dalla riga Port nella tua configurazione SSH, quindi non serve un override ListenStream, ma riavviare ssh da solo lascia il server in ascolto sulla porta 22. Inserisci la riga Port in un file drop-in, abilita la nuova porta in ufw, quindi esegui sudo systemctl daemon-reload seguito da sudo systemctl restart ssh.socket. Hardening SSH su un VPS copre questo aspetto e il resto della superficie di attacco.

fail2ban per SSH aggiunge poca sicurezza una volta disabilitate le password, poiché una password indovinata non può essere accettata in alcun modo. Ciò che aggiunge è una riduzione del rumore nei log, il che rende facile individuare un vero tentativo di accesso.

L'opzione più solida è mantenere SSH lontano dalla rete Internet pubblica. Metti il server dietro una VPN WireGuard ospitata da te, attiva il tunnel sul telefono quando necessario e assegna a sshd un ListenAddress solo sul tunnel. mosh funziona tramite il tunnel perché entrambi i lati utilizzano UDP. Un avvertimento: il tunnel aggiunge overhead ai pacchetti, quindi se i trasferimenti di grandi dimensioni si bloccano, riduci l'MTU (maximum transmission unit) nella configurazione WireGuard del telefono.

Un'ultima osservazione sul lavorare in questo modo. Da un telefono approvi le richieste di autorizzazione su uno schermo che mostra poche righe di diff alla volta. Questo è un motivo per mantenere le protezioni piuttosto che disattivarle. Controlla anche in quale modalità di autorizzazione iniziano le tue sessioni, poiché la modalità automatica è ora la modalità predefinita per le sessioni di terminale interattive di Claude Code v2.1.283, e applica le modifiche ai file nella directory di lavoro senza fermarsi a chiedere. Eseguire Claude Code in sicurezza su un VPS copre i limiti di utente e directory che vale la pena impostare prima che il tuo metodo principale di accesso diventi un touchscreen.

Quando si riattacca una sessione e qualcosa non va

La stampa di tmux attach no server running on /tmp/tmux-1000/default significa che tmux non ha trovato alcun server su quel socket. Di solito il server non è più attivo, il che quasi sempre indica che la macchina è stata riavviata. Verificare con uptime. Se il sistema non è stato riavviato e pgrep tmux mostra ancora un server, ciò non significa necessariamente che il file socket sia stato eliminato, poiché i flag -L e -S consentono a un server di restare in ascolto su un socket differente. Se tmux è stato avviato con uno di essi, passare lo stesso flag a tmux attach. Se il socket è stato rimosso accidentalmente, pkill -USR1 tmux richiede al server di ricrearlo; il manuale di tmux specifica che l'operazione fallisce se manca una directory genitore. Gli aggiornamenti del kernel tramite aggiornamenti di sicurezza automatici richiedono un riavvio per essere applicati, ma unattended-upgrades riavvia automaticamente solo quando Unattended-Upgrade::Automatic-Reboot è abilitato; il valore predefinito è false. Un sistema riavviato non mantiene sessioni tmux, pertanto ogni esecuzione di Claude Code deve essere considerata come un processo riavviabile.

can't find session: claude è un caso diverso. Il server tmux è in esecuzione ma quel nome non esiste. tmux ls mostra cosa è effettivamente presente.

Se si effettua l'attach e si trova un prompt della shell standard dove prima c'era Claude Code, il processo è terminato senza che la sessione si chiudesse. Controllare dmesg -T | tail per una riga simile a Out of memory: Killed process 4821 (claude), che conferma un'interruzione dovuta a esaurimento della memoria (OOM kill). Controllare lo scrollback della shell sopra il prompt per altri messaggi di uscita.

Una finestra che riappare con dimensioni errate, tagliata ai bordi o con spazio inutilizzato attorno, indica che due client sono collegati con dimensioni differenti. Per impostazione predefinita, tmux 3.4 ridimensiona una finestra in base al client con l'attività più recente (window-size latest), quindi il portatile, ancora collegato con una larghezza di 200 colonne, e il telefono a 40 si alternano nel ridimensionarla. Scollegare gli altri client durante l'attach: tmux attach -d -t claude.

FAQ

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

La CLI da terminale non è supportata su Android o iOS. Le piattaforme supportate a ottobre 2026 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 in questo elenco. Inoltre, un telefono sospende le applicazioni e cambia costantemente indirizzo di rete, condizioni che un'esecuzione prolungata dell'agente non può tollerare. Eseguilo su un server e usa il telefono come display.

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

Sì, e due componenti distinti gestiscono questo compito. tmux mantiene il processo in esecuzione sul server, quindi nulla viene terminato quando la connessione si interrompe. mosh mantiene attiva la connessione stessa durante un cambio di indirizzo, quindi passare dal Wi-Fi ai dati mobili non richiede nemmeno una riconnessione. Con SSH standard senza tmux, una connessione interrotta invia un SIGHUP e Claude Code si arresta a metà operazione.

Perché mosh si connette ma non mostra nulla?

Un login che ha successo ma rimane bloccato con Nothing received from server on UDP port 60001. indica che il client non riesce a raggiungere mosh-server su quella porta UDP, il che solitamente significa che un firewall sta bloccando l'intervallo UDP da 60000 a 61000. Aggiungi l'intervallo in ufw e aggiungilo nuovamente nel firewall di rete del tuo provider, che è un controllo separato nella maggior parte dei pannelli di gestione. Se invece mosh segnala che mosh-server non è stato trovato, il pacchetto manca sul server o il suo login PATH non lo include: installalo con sudo apt install mosh, oppure usa mosh --server=/usr/bin/mosh-server you@server.

Come interrompo 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, mentre Termius e Blink includono entrambi una riga modificabile nelle impostazioni. Esc interrompe una risposta in corso e conserva il lavoro già svolto. Anche Ctrl+C interrompe l'esecuzione, ma premerlo due volte quando il prompt è inattivo chiude Claude Code, quindi utilizza prima Esc.

Esporre SSH a Internet è abbastanza sicuro per questo scopo?

Con l'autenticazione tramite password disabilitata, l'unica credenziale che può avere successo è una chiave che non lascia mai i tuoi dispositivi, il che rappresenta un rischio accettabile per una macchina che puoi ricostruire. Assegna a ogni dispositivo la sua chiave, così in caso di smarrimento del telefono dovrai solo eliminare una riga in authorized_keys. Se preferisci non rispondere affatto su una porta pubblica, inserisci il server dietro WireGuard e configura sshd affinché rimanga in ascolto sull'indirizzo del tunnel.

Questo articolo ti è stato utile?