SSD Nodes Learn 8GB de RAM — $66/año
Guías Matt ConnorPor Matt Connor · Actualizado 2026-08-02

Usar Claude Code desde el teléfono con SSH y tmux

Ejecuta Claude Code en un VPS con tmux y usa el teléfono como terminal. Configura claves SSH, mosh para redes inestables y atajos de teclado útiles.

Claude Code desde el teléfono: cómo funciona realmente

Claude Code desde el teléfono no es una aplicación móvil. Claude Code se ejecuta en un VPS (servidor privado virtual), dentro de una sesión de tmux que permanece abierta, y el teléfono abre una conexión SSH (shell seguro) a esa sesión mientras la está usando. Si cierra la aplicación, el agente sigue trabajando porque el proceso nunca se ejecutó en el teléfono.

Esta separación es la base de todo el diseño. Un sistema operativo móvil suspende una aplicación segundos después de cambiar a otra, por lo que cualquier trabajo prolongado iniciado en el teléfono se detiene. Además, el teléfono obtiene una nueva dirección de red cada vez que cambia de wifi a datos móviles. Ambos problemas desaparecen cuando el proceso se ejecuta en un servidor y el teléfono solo muestra la pantalla.

Necesita cuatro elementos en el servidor: tmux para mantener la sesión, claves SSH para acceder, mosh para los cambios de red y Claude Code. En el teléfono solo necesita una aplicación de terminal con una fila de teclas accesible.

Qué necesitas en el VPS

Una máquina pequeña con Ubuntu 24.04 es suficiente para las partes de SSH y tmux. Claude Code requiere más recursos. Los requisitos oficiales en julio de 2026 son Ubuntu 20.04 o posterior en un procesador x64 o ARM64, con 4 GB o más de RAM. Un plan de 1 GB lo instala, pero el kernel termina eliminando el proceso cuando hay carga. Claude Code también requiere una cuenta de Claude de pago (Pro, Max, Team o Enterprise) o una cuenta de Console con acceso a la API, porque el plan gratuito de Claude.ai no lo incluye.

Configura la máquina con un usuario normal que tenga sudo, no como root. Si el servidor es nuevo, sigue primero los primeros diez minutos en un VPS nuevo, porque los cambios de SSH posteriores de esta guía son más sencillos cuando el usuario y el firewall ya existen.

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

El instalador coloca el binario en ~/.local/bin/claude, y claude --version muestra una línea como 2.1.211 (Claude Code). Si muestra command not found, ese directorio todavía no está incluido en PATH: cierra la sesión, vuelve a iniciarla y compruébalo con command -v claude. claude doctor muestra diagnósticos de instalación y configuración sin iniciar una sesión.

Inicia sesión una vez ahora desde un portátil, antes de depender del teléfono. Ejecuta claude en un directorio de proyecto y sigue las indicaciones de inicio de sesión. El proceso te pide abrir una URL en un navegador y devolver un código al terminal. Hacerlo alternando entre dos aplicaciones en la pantalla de un teléfono es lento. Hazlo una vez con un teclado real y las credenciales permanecerán en el servidor.

Inicia Claude Code dentro de tmux para que una conexión interrumpida no lo detenga

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

Desconéctate con Ctrl-b y después con d. tmux muestra [detached (from session claude)] y te devuelve al shell. Ahora cierra la aplicación, pierde la señal o guarda el teléfono. El panel seguirá ejecutándose.

tmux ls
tmux attach -t claude

tmux ls muestra una línea por sesión, como claude: 1 windows (created Thu Jul 30 09:14:02 2026). tmux attach -t claude te devuelve exactamente al punto donde lo dejaste, incluida la edición a medio terminar.

Esto funciona porque tmux ejecuta su propio proceso de servidor, y el shell y Claude Code son procesos secundarios de ese servidor, no de sshd. Cuando termina la conexión SSH, el kernel envía la señal de desconexión, SIGHUP, a los procesos asociados a esa conexión, pero el servidor de tmux no está entre ellos. Sin tmux, el mismo bloqueo de pantalla que interrumpe la conexión detiene Claude Code en mitad de una llamada a una herramienta. Ejecutar Claude Code en un VPS dentro de tmux explica con más detalle la disposición de la sesión.

Ejecuta tmux en el servidor, nunca en el teléfono. Escribir tmux dentro de una sesión a la que ya estás conectado muestra sessions should be nested with care, unset $TMUX to force, y forzar la ejecución te deja con dos teclas de prefijo que pueden entrar en conflicto.

Conectarse automáticamente en cada inicio de sesión

Escribir el comando de conexión en un teclado táctil resulta incómodo. Añada esto al final de ~/.profile en el servidor:

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 se conecta a la sesión llamada claude si existe y la crea si no existe, por lo que un comando cubre ambos casos. exec reemplaza el shell de inicio de sesión por tmux, de modo que salir de tmux cierra la conexión en lugar de dejar un indicador de shell sin entorno. Cuando necesite un shell normal, omita el archivo: ssh you@server -t "bash --noprofile".

Colóquelo en ~/.profile y no en ~/.bashrc. ~/.bashrc también se ejecuta en sesiones no interactivas, por lo que las transferencias de archivos fallan: scp y sftp interpretan la salida inesperada como datos del protocolo y fallan con Received message too long. ~/.profile se ejecuta solo en shells de inicio de sesión, que es lo que utiliza una sesión SSH interactiva.

~/.profile también es donde Ubuntu añade ~/.local/bin a PATH. Si claude funciona justo después de iniciar sesión, pero un shell dentro de tmux muestra command not found, ese orden es la causa. Por tanto, inicie tmux desde un shell de inicio de sesión como se indicó arriba y no desde un script que omita el perfil.

Ambas aplicaciones admiten SSH y mosh, y ambas almacenan las claves en la aplicación. La diferencia está en la interfaz.

Blink Shell funciona mediante comandos. En su indicador, escriba ssh you@server o mosh you@server, con la misma sintaxis que en un terminal de escritorio. Para abrir la configuración, escriba config. La sección Keys permite crear un par de claves.

Termius funciona mediante formularios. Rellene una entrada de host y, en los detalles del host, cambie la conexión de SSH a Mosh. Termius incluye su propia implementación de mosh y admite mosh 1.3.0 y versiones posteriores, por lo que el servidor todavía necesita tener instalado el paquete mosh.

Genere la clave dentro de la aplicación en ambos casos y nunca copie una clave privada existente al teléfono. La aplicación muestra la parte pública. Esa es la única línea que debe añadir a ~/.ssh/authorized_keys en el servidor. Claves SSH por dispositivo y cómo revocarlas explica cómo asignar nombres y revocar una clave. Esto es más importante en un teléfono que en un portátil.

Active el bloqueo biométrico o mediante código de acceso de la propia aplicación de terminal. Sin esta protección, un teléfono desbloqueado proporciona acceso directo al shell del servidor mientras la pantalla permanezca activa.

Android: Termux

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

Termux proporciona OpenSSH y mosh en su propio repositorio, por lo que ssh, ssh-keygen y mosh se comportan como en un equipo de escritorio. Añada la línea de la clave pública mostrada a ~/.ssh/authorized_keys en el servidor y, después, conéctese con mosh you@server.

El teclado en pantalla de Android no tiene teclas Esc ni Ctrl, y Claude Code necesita ambas. Termux puede mostrar su propia fila de teclas. Añada una línea a ~/.termux/termux.properties:

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

Después, ejecute termux-reload-settings y la fila aparecerá encima del teclado. La misma recarga detecta una fuente TrueType monoespaciada colocada en ~/.termux/font.ttf.

Android puede detener Termux cuando queda en segundo plano. En este caso, eso solo requiere volver a conectarse. La sesión y el agente están en el servidor.

¿Por qué se congela el terminal cuando salgo del alcance de la wifi y qué corrige mosh?

Una conexión SSH es una conexión TCP (protocolo de control de transmisión), y una conexión TCP se identifica mediante las dos direcciones y los dos puertos. Al salir del alcance de la wifi, el teléfono obtiene una dirección nueva de la red móvil, por lo que la conexión anterior deja de coincidir en ambos extremos. Ningún componente lo anuncia. El terminal simplemente deja de responder hasta que TCP abandona el intento y entonces ssh muestra client_loop: send disconnect: Broken pipe. Para cerrar de inmediato una sesión congelada, pulsa Enter, después ~ y después ..

mosh (mobile shell) elimina este modo de fallo. Usa SSH una vez para iniciar sesión y arrancar un proceso mosh-server, lee el puerto UDP (protocolo de datagramas de usuario) que seleccionó el servidor y cierra la conexión SSH. Después, ambos extremos intercambian datagramas UDP autenticados con una clave de sesión compartida, por lo que la sesión se identifica mediante esa clave y no mediante tu dirección. Una dirección nueva no interrumpe la sesión. mosh también muestra localmente lo que escribes y vuelve a dibujar la pantalla cuando el servidor indica un estado diferente. Por eso sigue siendo utilizable con una conexión móvil lenta.

mosh usa un puerto UDP entre 60000 y 61000. Abre ese rango:

sudo ufw allow 60000:61000/udp
sudo ufw status

Abrir puertos con ufw contiene el resto de la configuración del firewall. Si tu proveedor ofrece un firewall de red independiente en su panel de control, añade allí el mismo rango. Una regla de ufw no puede afectar a un filtro situado delante de la máquina.

Hay dos fallos habituales de mosh. Si el inicio de sesión se completa y después se bloquea, mostrando Nothing received from server on UDP port 60001., significa que el rango UDP está bloqueado en algún punto entre el teléfono y el servidor. Si la conexión indica que no se encontró mosh-server, el paquete falta en el servidor o no está incluido en el PATH de inicio de sesión. Instálalo o indica directamente su ubicación con mosh --server=/usr/bin/mosh-server you@server.

mosh tampoco se ejecuta si la configuración regional del inicio de sesión no usa UTF-8, y lo indica mediante mosh-server needs a UTF-8 native locale to run.. Corrige la configuración regional en el servidor, no en el teléfono.

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

mosh no hace dos cosas. Su README indica que mosh no admite el reenvío de X ni los usos no interactivos de SSH, incluido el reenvío de puertos. Por tanto, para previsualizar una aplicación web que Claude Code acaba de iniciar todavía necesitas usar ssh -L 8080:127.0.0.1:8080 you@server. Además, solo sincroniza la pantalla visible, por lo que no tiene su propio historial de desplazamiento. Esta segunda limitación no importa aquí porque tmux conserva el historial: Ctrl-b y después [ activa el modo de copia, el arrastre o las teclas de flecha desplazan el contenido y q permite salir.

Hacer usable la pantalla de un teléfono

Cuatro líneas en ~/.tmux.conf del servidor hacen la mayor parte del trabajo:

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

mouse on convierte un arrastre táctil en desplazamiento y un toque en la selección de un panel o una ventana. Esto sustituye la mayoría de las teclas de prefijo, que son difíciles de escribir. status-position top mueve la línea de estado de tmux desde el borde inferior, donde el teclado en pantalla y su barra de sugerencias la cubren. default-terminal es importante porque, de lo contrario, tmux anuncia un terminal screen a Claude Code, y los colores y los caracteres de dibujo de cuadros se muestran peor de lo necesario. Si tmux se niega a iniciarse con missing or unsuitable terminal: tmux-256color, falta la entrada de terminfo: sudo apt install ncurses-term.

Aprenda cuatro teclas y el resto será cómodo.

  • Esc interrumpe a Claude durante una respuesta y conserva el trabajo ya realizado. Por eso es la tecla que debe tener más cerca del pulgar.
  • Ctrl+C también interrumpe una operación en ejecución. En un indicador inactivo, la primera pulsación borra la entrada y la segunda sale de Claude Code. Por tanto, es una herramienta más drástica.
  • Esc dos veces borra un borrador de solicitud. En un indicador vacío, abre en su lugar el menú de rebobinado.
  • Para una solicitud de varias líneas, escriba \ y después pulse Enter. Este método funciona en cualquier terminal. Shift+Enter es nativo solo en una lista breve de terminales de escritorio, y los clientes móviles no forman parte de ella.

Evite los paneles divididos. Un teléfono en orientación vertical tiene unas 40 columnas de ancho, por lo que una división vertical deja 20 columnas por panel y cada diff se ajusta hasta convertirse en ruido. Use ventanas de tmux: Ctrl-b c crea una y Ctrl-b n pasa a la siguiente. Gire el teléfono a orientación horizontal cuando necesite leer un diff correctamente.

Una sesión larga en una pantalla pequeña es, sobre todo, un problema de contexto. Por eso conviene leer cómo administrar la ventana de contexto de Claude Code antes de intentar trabajar un día completo desde un tren.

Bloquéalo: solo claves, sin contraseñas

El teléfono ahora contiene una clave para una máquina que edita tu código y ejecuta comandos. Desactiva la autenticación mediante contraseña. Un archivo de inclusión es más seguro que editar sshd_config directamente, porque sshd_config de Ubuntu incluye /etc/ssh/sshd_config.d/*.conf al principio y se usa el primer valor encontrado para cada configuración.

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 analiza la configuración y no muestra nada cuando es válida. Si lo omites, un solo error tipográfico hace que sshd falle al recargar. Mantén abierta la sesión actual y prueba desde una segunda conexión antes de cerrar nada, porque una clave incorrecta ahora produce Permission denied (publickey). y, con las contraseñas desactivadas, no hay alternativa. En ese caso, la vía de recuperación es la consola de tu proveedor.

Asigna a cada dispositivo su propia clave. Si pierdes el teléfono, solo tendrás que eliminar una línea de ~/.ssh/authorized_keys y el portátil seguirá funcionando. Con una clave compartida, tendrías que cambiar la clave en todos los dispositivos que posees.

Si cambias SSH a otro puerto en Ubuntu 24.04, ten en cuenta que el listener pertenece a ssh.socket, por lo que una línea Port por sí sola no cambia nada. Ejecuta sudo systemctl edit ssh.socket, borra el valor predeterminado con un ListenStream= vacío y establece tu puerto en la línea siguiente. Refuerzo de la seguridad de SSH en un VPS cubre ese punto y el resto de la superficie de ataque.

fail2ban para SSH aporta poca seguridad cuando las contraseñas están desactivadas, porque una contraseña adivinada nunca puede aceptarse. Lo que sí aporta son registros más silenciosos, lo que facilita detectar un intento de inicio de sesión real.

La opción más segura es mantener SSH fuera de Internet pública. Coloca el servidor detrás de una VPN WireGuard que alojes tú mismo, activa el túnel en el teléfono cuando lo necesites y configura un ListenAddress para sshd únicamente en el túnel. mosh funciona a través del túnel porque ambos extremos usan UDP. Hay una consideración: el túnel añade sobrecarga a los paquetes. Si las transferencias grandes se bloquean, reduce el MTU (unidad máxima de transmisión) en la configuración de WireGuard del teléfono.

Un último punto sobre esta forma de trabajo. Desde un teléfono, apruebas solicitudes de permisos en una pantalla que muestra pocas líneas del diff cada vez. Eso es un motivo para mantener las barreras de seguridad, no para desactivarlas. Ejecutar Claude Code de forma segura en un VPS cubre los límites de usuario y directorios que conviene establecer antes de que tu principal vía de acceso sea una pantalla táctil.

Cuando vuelve a conectarse y algo falla

tmux attach muestra no server running on /tmp/tmux-1000/default significa que el servidor de tmux ya no existe. Esto casi siempre significa que la máquina se reinició. Compruébelo con uptime. Las actualizaciones de seguridad automáticas de actualizaciones de seguridad automáticas reinician el equipo. Un equipo reiniciado no tiene ninguna sesión de tmux. Por tanto, trate cualquier ejecución de Claude Code como un proceso que puede reiniciar.

can't find session: claude es diferente. El servidor de tmux está en ejecución, pero ese nombre no existe. tmux ls muestra qué sesiones existen.

Si se conecta y encuentra un indicador de shell normal donde antes estaba Claude Code, el proceso terminó sin que terminara la sesión. Revise dmesg -T | tail en busca de una línea como Out of memory: Killed process 4821 (claude). Eso ocurre durante una edición grande en un equipo que no cumple el requisito de 4 GB. Si no existe esa línea, Claude Code terminó por su cuenta. El historial desplazable del shell situado encima del indicador contiene el motivo.

Una ventana que vuelve con un tamaño muy pequeño y espacio sin usar alrededor indica que hay dos clientes conectados con tamaños diferentes. tmux ajusta el tamaño de la ventana al cliente conectado más pequeño. Su portátil todavía mantiene la sesión con 200 columnas de ancho, mientras que el teléfono solicita 40. Desconecte los demás clientes al conectarse: tmux attach -d -t claude.

FAQ

¿Puedo ejecutar Claude Code en el propio teléfono en lugar de hacerlo en un VPS?

No. Las plataformas compatibles en julio de 2026 son macOS, Windows, Ubuntu 20.04 o posterior, Debian 10 o posterior y Alpine 3.19 o posterior, con 4 GB de RAM o más. Android e iOS no aparecen en esa lista. Además, el teléfono suspende sus aplicaciones y cambia constantemente de dirección de red, algo que una ejecución prolongada del agente no puede tolerar. Ejecútalo en un servidor y usa el teléfono como pantalla.

¿La sesión continúa si cierro la aplicación o pierdo la señal?

Sí, y dos componentes independientes se encargan de ello. tmux mantiene el proceso en ejecución en el servidor, por lo que no termina cuando finaliza la conexión. mosh mantiene activa la propia conexión aunque cambie la dirección, por lo que pasar de wifi a datos móviles ni siquiera requiere volver a conectarse. Con SSH normal y sin tmux, una conexión interrumpida envía SIGHUP y Claude Code se detiene a mitad de la tarea.

¿Por qué mosh se conecta y después no muestra nada?

Un inicio de sesión correcto seguido de una espera indefinida con Nothing received from server on UDP port 60001. significa que UDP 60000 a 61000 no está abierto. Añade ese intervalo en ufw y vuelve a añadirlo en el firewall de red de tu proveedor, que en la mayoría de los paneles es un control independiente. Si mosh indica en cambio que no se encontró mosh-server, al servidor le falta el paquete: sudo apt install mosh.

¿Cómo interrumpo Claude Code desde un teclado que no tiene la tecla Esc?

Añade una fila de teclas. Termux configura una con extra-keys en ~/.termux/termux.properties, y Termius y Blink incluyen una fila que puedes editar en la configuración. Esc interrumpe una respuesta en ejecución y conserva el trabajo realizado hasta ese momento. Ctrl+C también interrumpe, pero si lo pulsas dos veces en un indicador inactivo sales de Claude Code, así que usa primero Esc.

¿Es suficientemente seguro abrir SSH a Internet?

Con la autenticación mediante contraseña desactivada, la única credencial que puede autenticarse correctamente es una clave que nunca sale de tus dispositivos, lo que supone un riesgo razonable para una máquina que puedes reconstruir. Asigna a cada dispositivo su propia clave, de modo que perder el teléfono solo requiera eliminar una línea de authorized_keys. Si prefieres no aceptar conexiones en un puerto público, coloca el equipo detrás de WireGuard y haz que sshd escuche en la dirección del túnel.