SSD Nodes Learn Hosting plans →
Guías Matt ConnorPor Matt Connor

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

Claude Code se ejecuta en tmux dentro de un VPS, no en el teléfono. Configura claves SSH, mosh para redes inestables y los ajustes de teclado que sí importan.

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

Esta guía usa una aplicación de terminal en el teléfono. 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) con esa sesión mientras la tiene en pantalla. Si cierra la aplicación, el agente sigue trabajando porque el proceso nunca se ejecutó en el teléfono.

Claude Code también ofrece Remote Control: ejecute /remote-control dentro de una sesión para usarlo desde la aplicación móvil de Claude o desde un navegador, mientras el proceso permanece en el servidor.

Esa separación es la base del diseño. El sistema operativo del teléfono suspende una aplicación unos segundos después de cambiar a otra, por lo que cualquier tarea larga iniciada en el teléfono se detiene. Además, el teléfono obtiene una dirección de red nueva cada vez que pasa de Wi-Fi a datos móviles. Ambos problemas desaparecen cuando el proceso se ejecuta en un servidor y el teléfono sólo muestra la pantalla.

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

Qué necesita en el VPS

Una instancia pequeña de Ubuntu 24.04 es suficiente para las partes de SSH y tmux. Claude Code necesita más recursos. Los requisitos oficiales a fecha de octubre de 2026 son Ubuntu 20.04 o posterior en un procesador x64 o ARM64, con 4 GB de RAM o más. Claude Code también necesita una cuenta de Claude de pago (Pro, Max, Team o Enterprise), una cuenta de Console con acceso a la API o acceso mediante un proveedor de nube compatible, como Amazon Bedrock, porque el plan gratuito de Claude.ai no lo incluye.

Configure la instancia con un usuario normal que tenga sudo, no como root. Si el servidor es nuevo, siga 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 similar a 2.1.211 (Claude Code). Si muestra command not found, ese directorio todavía no está incluido en PATH: cierre la sesión, vuelva a iniciarla y compruébelo con command -v claude. claude doctor muestra diagnósticos de la instalación y la configuración sin iniciar una sesión.

Inicie sesión una vez ahora, desde un portátil, antes de depender del teléfono. Ejecute claude en un directorio de proyecto y siga las indicaciones de inicio de sesión. El proceso le pide abrir una URL en un navegador y devolver un código al terminal, y cambiar entre dos aplicaciones en la pantalla de un teléfono para hacerlo resulta lento. Hágalo una vez con un teclado físico y las credenciales permanecerán en el servidor.

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

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

Desconéctese con Ctrl-b y después con d. tmux muestra [detached (from session claude)] y le devuelve el shell. Ahora cierre la aplicación, pierda la señal o guarde el teléfono en el bolsillo. 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 le devuelve exactamente al punto donde lo dejó, 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 cierre, SIGHUP, a los procesos asociados a esa conexión, y el servidor de tmux no es uno de 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.

Ejecute tmux en el servidor, nunca en el teléfono. Escribir tmux dentro de una sesión a la que ya está conectado muestra sessions should be nested with care, unset $TMUX to force, y forzarlo hace que tenga que elegir entre dos teclas de prefijo.

Conectar automáticamente en cada inicio de sesión

Escribir el comando de conexión en un teclado táctil acaba resultando molesto. 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 solo 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 dejarle en un prompt vacío. Cuando necesite un shell normal, omita el archivo: ssh you@server -t "bash --noprofile".

Póngalo en ~/.profile y no en ~/.bashrc. Bash también lee ~/.bashrc para los comandos SSH no interactivos, pero la protección [ -t 1 ] anterior impide que este bloque inicie tmux durante una transferencia de archivos. Los comandos de inicio sin protección que muestran contenido interrumpen los protocolos de transferencia con errores como Received message too long. ~/.profile se ejecuta sólo para los 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 indica 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 se controla mediante comandos. En su indicador, escriba ssh you@server o mosh you@server, con la misma sintaxis que en un terminal de escritorio. Abra la configuración escribiendo config. La sección Keys permite crear un par de claves.

Termius se controla mediante formularios. Rellene una entrada de host y cambie ese host de SSH a Mosh en los detalles del host. Termius incluye su propia implementación de mosh y admite mosh 1.3.0 y posteriores, por lo que el servidor sigue necesitando tener instalado el paquete mosh.

Genere la clave dentro de la aplicación en ambos casos y no copie nunca una clave privada existente al teléfono. La aplicación muestra la clave pública, que es la única línea que debe añadir a ~/.ssh/authorized_keys en el servidor. Claves SSH por dispositivo y cómo revocar una 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 propio de la aplicación de terminal. Sin esta protección, un teléfono desbloqueado deja abierto un shell en el servidor mientras la pantalla permanezca encendida.

Android: Termux

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

Termux incluye OpenSSH y mosh en su propio repositorio, por lo que ssh, ssh-keygen y mosh funcionan igual que en un equipo de escritorio. Añada la línea de 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 mientras está en segundo plano. En este caso, eso sólo obliga a volver a conectarse. La sesión y el agente se ejecutan en el servidor.

¿Por qué se bloquea el terminal cuando salgo 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 ambas direcciones y ambos 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 antigua ya no coincide con nada en ninguno de los extremos. No se anuncia nada. El terminal simplemente deja de responder hasta que TCP abandona el intento, y entonces ssh muestra client_loop: send disconnect: Broken pipe. Para cerrar una sesión bloqueada de inmediato, pulse Enter, después ~ y después ..

mosh (shell móvil) elimina ese 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 ha elegido 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 su dirección. Una dirección nueva simplemente permite continuar. mosh también muestra localmente lo que escribe y redibuja la pantalla cuando el servidor no coincide, por eso sigue siendo utilizable con una conexión móvil lenta.

mosh usa un puerto UDP entre 60000 y 61000, por lo que debe abrir ese rango:

sudo ufw allow 60000:61000/udp
sudo ufw status

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

Dos fallos de mosh son frecuentes. Un inicio de sesión que funciona y después se bloquea, mostrando Nothing received from server on UDP port 60001., significa que mosh-server se ha iniciado, pero el cliente no puede alcanzarlo en ese puerto UDP. Por lo general, esto significa que algún firewall entre el teléfono y el servidor está bloqueando UDP en el rango de mosh. Una conexión que indica que no se ha encontrado mosh-server significa que el paquete falta en el servidor o no está presente en el PATH de inicio de sesión. Instálelo o indíquelo directamente mediante mosh --server=/usr/bin/mosh-server you@server.

Si la configuración regional del inicio de sesión del servidor no es UTF-8, mosh-server intenta usar la configuración regional proporcionada por el cliente y vuelve a comprobarla. Solo se niega a ejecutarse si eso tampoco proporciona UTF-8, e indica mosh-server needs a UTF-8 native locale to run.. Corrija primero la configuración regional en el servidor.

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

Ambos extremos necesitan una configuración regional UTF-8, y mosh-server también aplica la configuración regional que envía el cliente. Si el error persiste después de corregir el servidor, establezca LANG en un valor UTF-8 también en la aplicación de terminal del teléfono; la propia FAQ de mosh señala que mosh-client puede necesitarlo.

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 lo que para previsualizar una aplicación web que Claude Code acaba de iniciar todavía se necesita ssh -L 8080:127.0.0.1:8080 you@server sin modificaciones. Además, solo sincroniza la pantalla visible, por lo que no tiene su propio historial de desplazamiento. Esa segunda limitación no supone un problema aquí, porque tmux conserva el historial: Ctrl-b y después [ activa el modo de copia, un arrastre o las teclas de flecha permiten desplazarse, y q permite salir.

Haz usable la pantalla de un teléfono

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

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 un desplazamiento y un toque en una selección de panel o 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 fija el nombre del terminal que tmux anuncia a Claude Code. Sin esa línea, tmux anuncia el nombre que haya elegido su compilación. El script configure de tmux 3.4 parte de screen y después prueba screen-256color, tmux y tmux-256color en ese orden. Si una prueba falla, conserva la selección anterior. Por tanto, una compilación que no pudo encontrar la entrada terminfo tmux-256color termina con tmux, screen-256color o simplemente screen. En ese caso, los colores y los caracteres de dibujo de cuadros pueden verse peor de lo necesario.

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

  • Esc interrumpe Claude a mitad de la respuesta y conserva el trabajo ya realizado. Es la tecla que conviene tener más cerca del pulgar.
  • Ctrl+C también interrumpe una operación en curso. En un indicador inactivo, la primera pulsación borra la entrada y la segunda sale de Claude Code. Por eso es una herramienta más brusca.
  • Esc dos veces borra un borrador de la solicitud. En un indicador vacío, abre el menú de rebobinado.
  • Para una solicitud de varias líneas, escribe \ y después pulsa Enter. Esta forma funciona en cualquier terminal. Shift+Enter sólo es nativo en una lista breve de terminales de escritorio, y los clientes móviles no forman parte de ella.

Evita dividir los paneles. 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 en varias líneas hasta convertirse en ruido. Usa ventanas de tmux: Ctrl-b c crea una y Ctrl-b n pasa a la siguiente. Si una segunda ventana termina alojando su propia sesión de Claude Code, las dos sesiones pueden intercambiarse trabajo directamente en lugar de copiar texto entre ventanas en una pantalla táctil. Gira el teléfono cuando necesites leer correctamente un diff.

Conviene configurar deliberadamente cuánto texto aparece en esa pantalla, porque un estilo de salida modifica el prompt del sistema detrás de cada respuesta y uno más conciso implica menos pantallas que desplazar en el teléfono.

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

Bloquéalo: sólo 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 drop-in 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 utiliza el primer valor encontrado para una configuración.

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

Los archivos drop-in se leen en orden de nombre. Comprueba sudo sshd -T para passwordauthentication no, kbdinteractiveauthentication no, pubkeyauthentication yes y permitrootlogin no; si un archivo anterior define uno de estos valores, tiene prioridad y debes corregirlo allí.

sshd -t analiza la configuración y no muestra nada cuando es válida. Si omites este paso, un error tipográfico hará que sshd falle al recargar. Mantén abierta la sesión de trabajo 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 momento, la vía de recuperación es la consola de tu proveedor. Si esa conexión de prueba falla, vuelve a conectarte con ssh -v y corrígelo mientras la primera sesión siga abierta, porque ese único mensaje de error corresponde a cinco fallos distintos y la salida detallada indica cuál tienes.

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

Si cambias SSH a otro puerto en Ubuntu 24.04, ten en cuenta que el listener pertenece a ssh.socket. Un generador de systemd crea ese socket a partir de la línea Port de la configuración de SSH, por lo que no necesitas una sobreescritura de ListenStream, pero reiniciar ssh por sí solo deja el servidor escuchando en el puerto 22. Añade la línea Port a un archivo drop-in, permite el nuevo puerto en ufw y ejecuta sudo systemctl daemon-reload seguido de sudo systemctl restart ssh.socket. Refuerzo de la seguridad de SSH en un VPS cubre esto y el resto de la superficie de ataque.

fail2ban para SSH aporta poca seguridad una vez desactivadas las contraseñas, porque una contraseña adivinada no se puede aceptar. 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 la internet pública. Coloca el servidor detrás de una VPN WireGuard alojada por ti, activa el túnel en el teléfono cuando lo necesites y asigna a sshd un ListenAddress sólo en el túnel. mosh funciona a través del túnel porque ambos extremos usan UDP. Hay una salvedad: el túnel añade sobrecarga a los paquetes, por lo que, si las transferencias grandes se bloquean, reduce la MTU (unidad máxima de transmisión) en la configuración de WireGuard del teléfono.

Un último punto sobre esta forma de trabajar. Desde un teléfono, apruebas solicitudes de permisos en una pantalla que muestra sólo unas pocas líneas del diff cada vez. Esa es una razón para mantener las barreras de seguridad, no para desactivarlas. Comprueba también con qué modo de permisos se inician tus sesiones, porque el modo automático es ahora el modo inicial integrado para las sesiones de terminal interactivas desde Claude Code v2.1.283, y realiza ediciones de archivos en el directorio de trabajo sin detenerse a pedirte confirmación. Ejecución segura de Claude Code en un VPS cubre los límites de usuario y directorio que conviene establecer antes de que tu principal vía de acceso sea una pantalla táctil.

Cuando vuelve a adjuntar y algo falla

tmux attach printing no server running on /tmp/tmux-1000/default significa que tmux no encontró ningún servidor en ese socket. Normalmente, el servidor ya no existe, lo que casi siempre significa que la máquina se reinició. Compruébelo con uptime. Si el sistema no se reinició y pgrep tmux sigue mostrando un servidor, eso por sí solo no significa que se haya eliminado el archivo de socket, porque los flags -L y -S permiten que un servidor escuche en otro socket. Si inició tmux con uno de ellos, pase el mismo flag a tmux attach. Si el socket realmente se eliminó por accidente, pkill -USR1 tmux solicita al servidor que lo vuelva a crear; el manual de tmux indica que falla si falta algún directorio principal. Las actualizaciones del kernel de actualizaciones de seguridad automáticas requieren un reinicio para aplicarse, pero unattended-upgrades sólo reinicia automáticamente cuando Unattended-Upgrade::Automatic-Reboot está habilitado; su valor predeterminado es false. Un sistema reiniciado no tiene ninguna sesión de tmux, así que considere cualquier ejecución de Claude Code como algo 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 lo que sí existe.

Si se conecta y encuentra un prompt de shell normal donde antes estaba Claude Code, el proceso terminó sin que terminara la sesión. Busque en dmesg -T | tail una línea como Out of memory: Killed process 4821 (claude), que confirma una terminación por falta de memoria. Revise el historial desplazable del shell por encima del prompt para detectar otros mensajes de salida.

Si una ventana vuelve con un tamaño incorrecto, cortada en el borde o con espacio sin usar alrededor, significa que hay dos clientes conectados con tamaños diferentes. De forma predeterminada, tmux 3.4 ajusta el tamaño de la ventana al cliente con actividad más reciente (window-size latest), por lo que el portátil, todavía conectado con 200 columnas de ancho, y el teléfono, con 40, se turnan para cambiar su tamaño. Desconecte los demás clientes al conectarse: tmux attach -d -t claude.

FAQ

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

La CLI de terminal no es compatible con Android ni iOS. Las plataformas compatibles en octubre 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 están incluidos 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útelo en un servidor y use el teléfono como pantalla.

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

Sí. 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 cuando cambia la dirección, así que pasar de wifi a datos móviles no requiere reconectarse. 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 un bloqueo con Nothing received from server on UDP port 60001. significa que el cliente no puede acceder a mosh-server en ese puerto UDP. Normalmente, esto indica que un firewall está bloqueando UDP 60000 a 61000. Añada el rango en ufw y vuelva a añadirlo en el firewall de red de su proveedor, que es un control independiente en la mayoría de los paneles. Si mosh indica que no se encontró mosh-server, al servidor le falta el paquete o su PATH de inicio de sesión no lo incluye: instálelo con sudo apt install mosh o use mosh --server=/usr/bin/mosh-server you@server.

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

Añada una fila de teclas. Termux configura una con extra-keys en ~/.termux/termux.properties, y Termius y Blink incluyen una fila que puede 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 al pulsarla dos veces en un indicador inactivo se cierra Claude Code, así que use Esc primero.

¿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 sus dispositivos. Es un riesgo razonable para una máquina que puede reconstruir. Asigne a cada dispositivo su propia clave, de modo que perder el teléfono solo le obligue a eliminar una línea de authorized_keys. Si prefiere no responder en un puerto público, coloque el equipo detrás de WireGuard y haga que sshd escuche en la dirección del túnel.

¿Te resultó útil este artículo?