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

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. El teléfono abre una conexión SSH (shell seguro) a esa sesión mientras la estás viendo. Si cierras la aplicación, el agente sigue trabajando porque el proceso nunca se ejecutó en el teléfono.

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

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

Lo que necesita en el VPS

Un servidor Ubuntu 24.04 pequeño es suficiente para las partes de SSH y tmux. Claude Code necesita más recursos. Según los requisitos oficiales de octubre de 2026, se necesita Ubuntu 20.04 o una versión posterior en un procesador x64 o ARM64, con 4 GB de RAM o más. Un plan de 1 GB permite instalarlo, pero el kernel termina el proceso cuando aumenta la carga. Claude Code también requiere 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 el servidor con un usuario normal que tenga sudo, no como root. Si el servidor es nuevo, complete 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á en PATH: cierre la sesión, vuelva a iniciarla y compruébelo con command -v claude. claude doctor muestra diagnósticos de instalación y 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 instrucciones de inicio de sesión. El proceso le 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. 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 para conectar una sesión con un teclado táctil resulta tedioso. 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".

Añádalo 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 terminan con Received message too long. ~/.profile se ejecuta sólo en shells de inicio de sesión, que es el caso de una sesión SSH interactiva.

~/.profile también es donde Ubuntu añade ~/.local/bin a PATH. Si claude funciona justo después del inicio de sesión, pero un shell dentro de tmux muestra command not found, ese orden es la causa. 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 al salir 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 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 anterior ya no coincide con ningún extremo. Nadie informa de este cambio. El terminal simplemente deja de responder hasta que TCP abandona el intento; entonces ssh muestra client_loop: send disconnect: Broken pipe. Para cerrar de inmediato una sesión bloqueada, pulse Enter, después ~ y, por último, ..

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 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 tanto, la sesión se identifica mediante esa clave y no mediante la dirección. Una dirección nueva sólo continúa la sesión. mosh también muestra localmente lo que escribe y vuelve a dibujar la pantalla cuando el servidor no coincide con ese estado. Por eso sigue siendo utilizable mediante un enlace móvil lento.

mosh usa un puerto UDP entre 60000 y 61000, así que abra 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 su proveedor ofrece un firewall de red independiente en el panel de control, añada 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 funciona y después se bloquea, mostrando Nothing received from server on UDP port 60001., significa que se ha iniciado mosh-server, pero el cliente no puede alcanzarlo en ese puerto UDP. Normalmente, esto indica que algún firewall entre el teléfono y el servidor está bloqueando UDP en el rango de mosh. Si una conexión muestra mosh-server not found, significa que el paquete no está instalado en el servidor o que no está presente en el PATH del inicio de sesión. Instálelo o indique directamente su ubicación con mosh --server=/usr/bin/mosh-server you@server.

mosh tampoco se ejecuta cuando 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.. 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 continúa después de corregir el servidor, establezca LANG en un valor UTF-8 en la aplicación de terminal del teléfono. Las propias FAQ de mosh indican que mosh-client puede ser necesario.

mosh no hace dos cosas. Su README indica que mosh no admite el reenvío 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 se necesita ssh -L 8080:127.0.0.1:8080 you@server. Además, sólo sincroniza la pantalla visible, por lo que no tiene su propio historial de desplazamiento. Aquí esa segunda limitación no supone un problema porque tmux conserva el historial: Ctrl-b y después [ activa el modo de copia; puede desplazarse con un arrastre o con las teclas de flecha, y q permite salir.

Hacer usable la pantalla del teléfono

Cuatro líneas en ~/.tmux.conf del servidor hacen casi todo el 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 un 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 ocultan. 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 Claude durante una 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 tanto, es una herramienta más brusca.
  • 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. Esta forma funciona en todos los terminales. Shift+Enter sólo es nativo en una lista breve de terminales de escritorio, y los clientes móviles no están incluidos.

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. Si una segunda ventana termina alojando su propia sesión de Claude Code, las dos sesiones pueden intercambiar trabajo directamente en lugar de obligarle a copiar texto entre ventanas en una pantalla táctil. Gire el teléfono cuando necesite leer un diff correctamente.

La cantidad de texto que aparece en esa pantalla merece una configuración deliberada, porque un estilo de salida modifica el prompt del sistema que se aplica a cada respuesta y uno más conciso implica menos pantallas de texto que desplazar en un teléfono.

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

Bloquéelo: sólo claves, sin contraseñas

El teléfono ahora tiene una clave para acceder a una máquina que edita su código y ejecuta comandos. Desactive 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 utiliza el primer valor encontrado para una 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 omite este paso, un solo error tipográfico hará que sshd falle al recargar. Mantenga abierta la sesión de trabajo y pruebe desde una segunda conexión antes de cerrar nada, porque una clave incorrecta ahora le dará Permission denied (publickey). y, con las contraseñas desactivadas, no habrá alternativa. En ese punto, la vía de recuperación es la consola de su proveedor. Si la conexión de prueba falla, vuelva a conectarse con ssh -v y resuelva el problema mientras la primera sesión siga abierta, porque ese mensaje de error abarca cinco fallos distintos y la salida detallada indica cuál se ha producido.

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

Si cambia SSH a otro puerto en Ubuntu 24.04, tenga en cuenta que el proceso de escucha 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 necesita una anulación ListenStream, pero reiniciar ssh por sí solo deja el servidor escuchando en el puerto 22. Coloque la línea Port en un archivo de inclusión, permita el nuevo puerto en ufw y ejecute sudo systemctl daemon-reload seguido de sudo systemctl restart ssh.socket. Protección de SSH en un VPS cubre este procedimiento y el resto de la superficie de ataque.

fail2ban para SSH aporta poca seguridad adicional una vez desactivadas las contraseñas, porque una contraseña adivinada no se puede aceptar en ningún caso. Lo que sí aporta son registros más limpios, 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. Coloque el servidor detrás de una VPN WireGuard que aloje usted mismo, active el túnel en el teléfono cuando lo necesite y asigne a sshd un ListenAddress sólo en el túnel. mosh funciona sobre el 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, reduzca la MTU (unidad máxima de transmisión) en la configuración de WireGuard del teléfono.

Un último aspecto de este modo de trabajo. Desde un teléfono, aprueba solicitudes de permisos en una pantalla que muestra sólo unas pocas líneas del diff cada vez. Esto es un motivo para mantener las medidas de control, no para desactivarlas. Compruebe también en qué modo de permisos se inician sus sesiones, porque el modo automático es ahora el modo inicial integrado para las sesiones interactivas de terminal de Claude Code v2.1.283 y aplica las ediciones de archivos en el directorio de trabajo sin detenerse a pedir confirmación. Ejecución segura de Claude Code en un VPS explica los límites de usuario y directorio que conviene configurar antes de que su principal vía de acceso sea una pantalla táctil.

Qué hacer si algo falla al volver a conectarse

tmux attach muestra no server running on /tmp/tmux-1000/default cuando tmux no encuentra 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 equipo no se reinició y pgrep tmux todavía muestra un servidor, se eliminó el archivo de socket y pkill -USR1 tmux hace que el servidor lo vuelva a crear. Las actualizaciones de seguridad automáticas de actualizaciones de seguridad automáticas pueden reiniciar el equipo. Después de un reinicio no existe ninguna sesión de tmux, así que considere cualquier ejecución de Claude Code como una tarea que puede reiniciar.

can't find session: claude es diferente. El servidor de tmux está activo, 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. Busque en dmesg -T | tail una línea como Out of memory: Killed process 4821 (claude). Eso es lo que hace un equipo con menos de los 4 GB necesarios durante una edición grande. Si no aparece esa línea, Claude Code terminó por su cuenta y el historial desplazable del shell situado sobre el indicador contiene el motivo.

Si una ventana vuelve con un tamaño muy pequeño y queda espacio sin usar a su alrededor, significa que hay dos clientes conectados con tamaños diferentes. tmux ajusta el tamaño de la ventana al cliente conectado más pequeño. El portátil todavía mantiene la sesión con 200 columnas de ancho, mientras el teléfono solicita 40. 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?

No. 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 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í, y dos componentes independientes se encargan de ello. tmux mantiene el proceso en ejecución en el servidor, por lo que no se detiene cuando termina la conexión. mosh mantiene activa la propia conexión aunque cambie la dirección, de modo que pasar de wifi a datos móviles ni siquiera obliga a reconectarse. Con SSH 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 que después se bloquea con Nothing received from server on UDP port 60001. significa que el cliente no puede alcanzar mosh-server en ese puerto UDP. Por lo general, 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 suele ser un control independiente en la mayoría de los paneles. Si mosh informa en cambio de 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 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 editarse en la configuración. Esc interrumpe una respuesta en ejecución y conserva el trabajo ya realizado. Ctrl+C también interrumpe, pero si lo pulsa dos veces en un indicador inactivo, sale de Claude Code. Por eso, use 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 sus dispositivos. Es un riesgo razonable para una máquina que pueda reconstruir. Asigne a cada dispositivo su propia clave para que perder el teléfono sólo le obligue a eliminar una línea de authorized_keys. Si prefiere no responder en un puerto público, coloque el servidor detrás de WireGuard y haga que sshd escuche en la dirección del túnel.