Como usar o Claude Code pelo celular com SSH e tmux
Execute o Claude Code no VPS dentro do tmux e use o celular apenas como terminal. Configure chaves SSH, mosh, tmux attach e corrija o teclado móvel.
Claude Code no celular: como realmente funciona
O Claude Code no celular não é um aplicativo móvel. O Claude Code é executado em um VPS (servidor virtual privado), dentro de uma sessão do tmux que permanece aberta. O celular abre uma conexão SSH (shell seguro) para essa sessão enquanto você a mantém aberta. Feche o aplicativo, e o agente continuará trabalhando, porque o processo nunca foi executado no celular.
Essa separação é a base de todo o projeto. Um sistema operacional de celular suspende um aplicativo segundos depois que você muda para outro aplicativo. Por isso, qualquer tarefa longa iniciada no celular é interrompida. O celular também recebe um novo endereço de rede sempre que você passa do wifi para os dados móveis. Os dois problemas desaparecem quando o processo é executado em um servidor e o celular apenas exibe a tela.
Você precisa de quatro componentes no servidor: tmux para manter a sessão, chaves SSH para acessar o servidor, mosh para lidar com mudanças de rede e o próprio Claude Code. No celular, basta um aplicativo de terminal com uma linha de teclas que você consiga acessar.
O que você precisa no VPS
Uma máquina Ubuntu 24.04 pequena é suficiente para as partes de SSH e tmux. O Claude Code exige mais recursos. Os requisitos oficiais em julho de 2026 são Ubuntu 20.04 ou mais recente em um processador x64 ou ARM64, com 4 GB ou mais de RAM. Um plano de 1 GB instala o programa, mas depois o kernel encerra o processo sob carga. O Claude Code também exige uma conta Claude paga (Pro, Max, Team ou Enterprise) ou uma conta Console com acesso à API, pois o plano gratuito do Claude.ai não o inclui.
Configure a máquina para usar um usuário comum com sudo, não root. Se o servidor for novo, siga primeiro os primeiros dez minutos em um VPS novo, pois as alterações de SSH posteriores neste guia são mais fáceis depois que o usuário e o firewall já existem.
sudo apt update && sudo apt install -y tmux mosh
curl -fsSL https://claude.ai/install.sh | bash
claude --versionO instalador coloca o binário em ~/.local/bin/claude, e claude --version exibe uma linha como 2.1.211 (Claude Code). Se ele exibir command not found, esse diretório ainda não está no seu PATH: saia da sessão, entre novamente e verifique com command -v claude. claude doctor exibe diagnósticos da instalação e das configurações sem iniciar uma sessão.
Faça login uma vez agora, usando um laptop, antes de depender do telefone. Execute claude em um diretório de projeto e siga o prompt de login. O fluxo solicita que você abra uma URL no navegador e informe um código no terminal. Alternar entre dois aplicativos na tela do telefone para fazer isso é demorado. Faça isso uma vez com um teclado físico, e as credenciais permanecerão no servidor.
Inicie o Claude Code dentro do tmux para que uma conexão interrompida não possa encerrá-lo
tmux new -s claude
cd ~/projects/api
claudeDesanexe com Ctrl-b e depois com d. O tmux imprime [detached (from session claude)] e devolve o shell para você. Agora feche o aplicativo, perca o sinal ou coloque o telefone no bolso. O painel continua em execução.
tmux ls
tmux attach -t claudetmux ls imprime uma linha por sessão, como claude: 1 windows (created Thu Jul 30 09:14:02 2026). tmux attach -t claude retorna exatamente ao ponto em que você parou, incluindo a edição parcialmente concluída.
Isso funciona porque o tmux executa seu próprio processo de servidor, e o shell e o Claude Code são filhos desse servidor, não de sshd. Quando a conexão SSH termina, o kernel envia o sinal de encerramento, SIGHUP, aos processos associados a essa conexão, e o servidor do tmux não é um deles. Sem o tmux, o mesmo bloqueio de tela que interrompe a conexão encerra o Claude Code no meio de uma chamada de ferramenta. Executar o Claude Code em um VPS dentro do tmux explica o layout da sessão com mais detalhes.
Execute o tmux no servidor, nunca no telefone. Digitar tmux dentro de uma sessão à qual você já está conectado imprime sessions should be nested with care, unset $TMUX to force, e forçar esse comando faz você ter duas teclas de prefixo para disputar o controle.
Anexar automaticamente a cada login
Digitar o comando de anexação em um teclado sensível ao toque fica cansativo. Adicione isto ao final de ~/.profile no servidor:
if command -v tmux >/dev/null 2>&1 && [ -z "$TMUX" ] && [ -t 1 ]; then
exec tmux new-session -A -s claude
finew-session -A -s claude anexa à sessão chamada claude se ela existir e a cria se não existir. Assim, um comando cobre os dois casos. exec substitui o shell de login pelo tmux. Portanto, sair do tmux encerra a conexão, em vez de deixar você em um prompt vazio. Quando precisar de um shell comum, ignore o arquivo: ssh you@server -t "bash --noprofile".
Coloque isso em ~/.profile, não em ~/.bashrc. ~/.bashrc também é executado em sessões não interativas, o que interrompe transferências de arquivos: scp e sftp interpretam a saída inesperada como dados de protocolo e falham com Received message too long. ~/.profile é executado somente em shells de login, que é o caso de uma sessão SSH interativa.
~/.profile também é onde o Ubuntu adiciona ~/.local/bin a PATH. Se claude funcionar logo após o login, mas um shell dentro do tmux informar command not found, essa ordem é a causa. Nesse caso, inicie o tmux a partir de um shell de login, como mostrado acima, em vez de iniciá-lo a partir de um script que ignore o profile.
iOS: Termius ou Blink Shell
Ambos os aplicativos usam SSH e mosh e armazenam as chaves no aplicativo. A diferença está na interface.
O Blink Shell é orientado por comandos. No prompt, você digita ssh you@server ou mosh you@server, usando a mesma sintaxe de um terminal de desktop. As configurações são abertas com config, e a seção Keys cria um par para você.
O Termius é orientado por formulários. Você preenche uma entrada de host e altera o protocolo desse host de SSH para Mosh nos detalhes do host. O Termius inclui sua própria implementação de mosh e oferece suporte a mosh 1.3.0 e versões mais recentes. Portanto, o servidor ainda precisa ter o pacote mosh instalado.
Gere a chave dentro do aplicativo nos dois casos. Nunca copie uma chave privada existente para o telefone. O aplicativo mostra a parte pública. Essa é a única linha que você adiciona a ~/.ssh/authorized_keys no servidor. Chaves SSH por dispositivo e como revogar uma delas explica a nomenclatura e a etapa de revogação. Isso é mais importante para um telefone do que para um laptop.
Ative o bloqueio biométrico ou por código de acesso do próprio aplicativo de terminal. Sem esse bloqueio, um telefone desbloqueado permite acessar o shell do seu servidor enquanto a tela permanecer ativa.
Android: Termux
pkg upgrade
pkg install openssh mosh
ssh-keygen -t ed25519 -C "pixel"
cat ~/.ssh/id_ed25519.pubO Termux fornece OpenSSH e mosh em seu próprio repositório, portanto ssh, ssh-keygen e mosh funcionam como em um desktop. Adicione a linha da chave pública exibida a ~/.ssh/authorized_keys no servidor e conecte-se com mosh you@server.
O teclado na tela do Android não tem as teclas Esc e Ctrl, e o Claude Code precisa das duas. O Termux pode exibir sua própria linha de teclas. Adicione uma linha a ~/.termux/termux.properties:
extra-keys = [['ESC','|','/','HOME','UP','END','PGUP'],['TAB','CTRL','ALT','LEFT','DOWN','RIGHT','PGDN']]Em seguida, execute termux-reload-settings para que a linha apareça acima do teclado. O mesmo recarregamento detecta uma fonte TrueType monoespaçada colocada em ~/.termux/font.ttf.
O Android pode encerrar o Termux quando ele fica em segundo plano. Nesse caso, isso não causa perda de dados: basta conectar-se novamente. A sessão e o agente estão no servidor.
Por que o terminal congela quando saio do wifi, e o que o mosh corrige?
Uma conexão SSH é uma conexão TCP (protocolo de controle de transmissão), e uma conexão TCP é identificada pelos dois endereços e pelas duas portas. Ao sair do alcance do wifi, o telefone recebe um novo endereço da rede móvel, então a conexão antiga não corresponde a nada em nenhuma das extremidades. Nada anuncia isso. O terminal simplesmente para de responder até o TCP desistir; então o ssh exibe client_loop: send disconnect: Broken pipe. Para encerrar uma sessão congelada imediatamente, pressione Enter, depois ~ e depois ..
O mosh (shell móvel) elimina essa falha. Ele usa o SSH uma vez para fazer login e iniciar um processo mosh-server, lê a porta UDP (protocolo de datagrama do usuário) escolhida pelo servidor e fecha a conexão SSH. Depois disso, os dois lados trocam datagramas UDP autenticados com uma chave de sessão compartilhada. Assim, a sessão é identificada por essa chave, e não pelo seu endereço. Um novo endereço apenas permite que a sessão continue. O mosh também exibe localmente o que você digita e redesenha a tela quando o servidor informa um estado diferente. Por isso, ele continua utilizável em uma conexão móvel lenta.
O mosh usa uma porta UDP entre 60000 e 61000. Abra esse intervalo:
sudo ufw allow 60000:61000/udp
sudo ufw statusAbrindo portas com ufw contém o restante da configuração do firewall. Se o provedor oferecer um firewall de rede separado no painel de controle, adicione o mesmo intervalo nele também, pois uma regra do ufw não pode afetar um filtro que esteja à frente da máquina.
Duas falhas do mosh são comuns. Um login que é concluído e depois trava, exibindo Nothing received from server on UDP port 60001., significa que o intervalo UDP está bloqueado em algum ponto entre o telefone e o servidor. Uma conexão que informa que mosh-server não foi encontrado significa que o pacote está ausente no servidor ou não está presente no PATH de login. Instale-o ou indique-o diretamente com mosh --server=/usr/bin/mosh-server you@server.
O mosh também se recusa a executar quando a localidade do login não é UTF-8 e informa isso: mosh-server needs a UTF-8 native locale to run.. Corrija a localidade no servidor, não no telefone.
locale
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8O mosh não faz duas coisas. O README informa que o mosh não oferece suporte ao encaminhamento de X nem aos usos não interativos do SSH, incluindo o encaminhamento de portas. Portanto, para visualizar um aplicativo web que o Claude Code acabou de iniciar, ainda é necessário usar o ssh -L 8080:127.0.0.1:8080 you@server comum. O mosh também sincroniza apenas a tela visível, portanto não tem seu próprio histórico de rolagem. Essa segunda limitação não causa problemas aqui, porque o tmux mantém o histórico: Ctrl-b; em seguida, [ entra no modo de cópia, e um arrasto ou as teclas de seta rolam a tela; q sai do modo.
Tornar uma tela de telefone utilizável
Quatro linhas em ~/.tmux.conf no servidor fazem a maior parte do trabalho:
set -g mouse on
set -g status-position top
set -g default-terminal "tmux-256color"
set -g history-limit 20000mouse on transforma um arraste na tela sensível ao toque em rolagem e um toque em seleção de painel ou janela. Isso substitui a maioria das teclas de prefixo difíceis de digitar. status-position top move a linha de status do tmux para fora da borda inferior, onde o teclado na tela e sua barra de sugestões a cobrem. default-terminal é importante porque, caso contrário, o tmux informa ao Claude Code que está usando um terminal screen. As cores e o desenho de caixas ficam piores do que deveriam. Se o tmux se recusar a iniciar com missing or unsuitable terminal: tmux-256color, a entrada terminfo está ausente: sudo apt install ncurses-term.
Aprenda quatro teclas. O restante fica confortável.
Escinterrompe o Claude no meio da resposta e preserva o trabalho já concluído. Essa é a tecla que deve ficar mais próxima do polegar.Ctrl+Ctambém interrompe uma operação em execução. Em um prompt ocioso, o primeiro pressionamento limpa a entrada e o segundo sai do Claude Code. Portanto, é a opção mais brusca.- Pressionar
Escduas vezes limpa um prompt em edição. Em um prompt vazio, abre o menu de reversão. - Para um prompt com várias linhas, digite
\e pressione Enter. Esse formato funciona em todos os terminais. Shift+Enter é nativo apenas em uma lista curta de terminais desktop, e os clientes móveis não fazem parte dela.
Evite painéis divididos. Um telefone na orientação retrato tem cerca de 40 colunas de largura. Portanto, uma divisão vertical deixa 20 colunas por painel, e cada diff quebra linhas até virar ruído. Use janelas do tmux: Ctrl-b c cria uma janela e Ctrl-b n passa para a próxima. Gire o telefone para a orientação paisagem quando precisar ler um diff corretamente.
Uma sessão longa em uma tela pequena é principalmente um problema de contexto. Por isso, vale a pena ler gerenciar a janela de contexto do Claude Code antes de tentar trabalhar um dia inteiro em um trem.
Bloqueie o acesso: somente chaves, sem senhas
O telefone agora guarda uma chave para uma máquina que edita seu código e executa comandos. Desative a autenticação por senha. Um arquivo complementar é mais seguro do que editar sshd_config diretamente, porque o sshd_config do Ubuntu inclui /etc/ssh/sshd_config.d/*.conf no início, e o primeiro valor encontrado para uma configuração é o que será usado.
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 sshsshd -t analisa a configuração e não imprime nada quando ela é válida. Se você ignorar essa etapa, um erro de digitação fará sshd falhar durante o recarregamento. Mantenha a sessão atual aberta e teste a partir de uma segunda conexão antes de fechar qualquer coisa, porque uma chave incorreta fará você receber Permission denied (publickey). e, com as senhas desativadas, não haverá alternativa. Nesse ponto, o caminho de recuperação é o console do seu provedor.
Dê a cada dispositivo sua própria chave. Se você perder o telefone, bastará excluir uma linha de ~/.ssh/authorized_keys, e o laptop continuará funcionando. Com uma chave compartilhada, será necessário alterar a chave em todos os dispositivos que você possui.
Se você mover o SSH para outra porta no Ubuntu 24.04, observe que o listener pertence a ssh.socket. Portanto, uma linha Port sozinha não altera nada. Execute sudo systemctl edit ssh.socket, limpe o valor padrão com um ListenStream= vazio e defina sua porta na linha seguinte. Protegendo o SSH em um VPS aborda esse procedimento e o restante da superfície de ataque.
fail2ban para SSH acrescenta pouca segurança depois que as senhas são desativadas, porque uma senha adivinhada não pode ser aceita. O que ele acrescenta são logs mais silenciosos, o que facilita identificar uma tentativa real de login.
A opção mais segura é manter o SSH fora da internet pública. Coloque o servidor atrás de uma VPN WireGuard hospedada por você, ative o túnel no telefone quando necessário e configure o sshd para usar ListenAddress somente no túnel. O mosh funciona pelo túnel porque os dois lados usam UDP. Há uma ressalva: o túnel acrescenta sobrecarga aos pacotes. Portanto, se transferências grandes travarem, reduza o MTU (maximum transmission unit) na configuração do WireGuard no telefone.
Um último ponto sobre trabalhar dessa forma. No telefone, você aprova solicitações de permissão em uma tela que mostra poucas linhas do diff por vez. Isso é um motivo para manter as proteções, não para desativá-las. Executando o Claude Code com segurança em um VPS aborda os limites de usuário e diretório que vale a pena definir antes que sua principal forma de acesso seja uma tela sensível ao toque.
Quando você se reconecta e há um problema
tmux attach exibindo no server running on /tmp/tmux-1000/default significa que o servidor tmux não está mais em execução, o que quase sempre significa que a máquina foi reiniciada. Verifique com uptime. As atualizações de segurança automáticas de atualizações de segurança automáticas reiniciam o sistema, e um sistema reiniciado não tem uma sessão tmux. Portanto, trate qualquer execução do Claude Code como algo que pode ser reiniciado.
can't find session: claude é diferente. O servidor tmux está em execução, mas esse nome não existe. tmux ls mostra o que existe.
Se você se conectar e encontrar um prompt de shell comum onde o Claude Code estava, o processo terminou sem que a sessão terminasse. Consulte dmesg -T | tail em busca de uma linha como Out of memory: Killed process 4821 (claude). Isso ocorre em um sistema com menos de 4 GB durante uma edição grande. A ausência dessa linha significa que o Claude Code foi encerrado por conta própria, e o scrollback do shell acima do prompt contém o motivo.
Uma janela que volta muito pequena, com espaço não utilizado ao redor, significa que dois clientes estão conectados com tamanhos diferentes, porque o tmux dimensiona uma janela para caber no menor cliente conectado. Seu laptop ainda mantém a sessão com 200 colunas de largura, enquanto o telefone solicita 40. Desconecte os outros clientes ao se conectar: tmux attach -d -t claude.
FAQ
Posso executar o Claude Code no próprio telefone em vez de executá-lo em um VPS?
Não. As plataformas compatíveis em julho de 2026 são macOS, Windows, Ubuntu 20.04 ou mais recente, Debian 10 ou mais recente e Alpine 3.19 ou mais recente, com 4 GB ou mais de RAM. Android e iOS não estão nessa lista. O telefone também suspende os aplicativos e altera o endereço de rede constantemente, algo que uma execução longa de um agente não tolera. Execute-o em um servidor e use o telefone como tela.
A sessão continua ativa se eu fechar o aplicativo ou perder o sinal?
Sim, e duas partes separadas cuidam disso. O tmux mantém o processo em execução no servidor, portanto nada é encerrado quando a conexão termina. O mosh mantém a própria conexão ativa durante uma alteração de endereço, portanto mudar do wifi para os dados móveis nem sequer exige uma nova conexão. Com SSH puro e sem tmux, uma conexão perdida envia SIGHUP e o Claude Code para no meio da tarefa.
Por que o mosh se conecta e depois não mostra nada?
Um login que é concluído e depois fica travado com Nothing received from server on UDP port 60001. significa que UDP 60000 a 61000 não está aberto. Adicione o intervalo ao ufw e adicione-o novamente ao firewall de rede do seu provedor, que é um controle separado na maioria dos painéis. Se o mosh informar que mosh-server não foi encontrado, o servidor não tem o pacote instalado: sudo apt install mosh.
Como interrompo o Claude Code usando um teclado sem a tecla Esc?
Adicione uma fileira de teclas. O Termux configura uma com extra-keys em ~/.termux/termux.properties, e o Termius e o Blink já incluem uma fileira que você pode editar nas configurações. Esc interrompe uma resposta em execução e preserva o trabalho já concluído. Ctrl+C também interrompe, mas pressioná-la duas vezes em um prompt ocioso encerra o Claude Code; portanto, use Esc primeiro.
É seguro o suficiente deixar o SSH aberto para a Internet?
Com a autenticação por senha desativada, a única credencial que pode ser aceita é uma chave que nunca sai dos seus dispositivos, o que representa um risco razoável para uma máquina que você pode reconstruir. Dê a cada dispositivo sua própria chave, para que a perda de um telefone custe apenas uma linha em authorized_keys. Se preferir não responder em uma porta pública, coloque a máquina atrás do WireGuard e faça o sshd escutar no endereço do túnel.