SSD Nodes Learn Hosting plans →
Guías Matt ConnorPor Matt Connor · Actualizado 2026-08-27

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.

Qué necesita en el VPS

Un equipo pequeño con Ubuntu 24.04 es suficiente para las partes de SSH y tmux. Claude Code necesita más recursos. Según los requisitos oficiales de julio 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 cerrando el proceso cuando hay carga. Claude Code también necesita 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.

Configure el equipo 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 como 2.1.211 (Claude Code). Si muestra command not found, ese directorio todavía no está en su 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. Gestionar dos aplicaciones en la pantalla de un teléfono para hacerlo 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 congela el terminal cuando salgo del alcance de la Wi-Fi 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. Si sale del alcance de la Wi-Fi, el teléfono obtiene una dirección nueva de la red móvil, por lo que la conexión anterior ya no coincide con nada en ninguno de los extremos. Nadie anuncia este cambio. El terminal simplemente deja de responder hasta que TCP abandona el intento y, después, ssh muestra client_loop: send disconnect: Broken pipe. Para cerrar inmediatamente una sesión congelada, 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 lo que la sesión se identifica mediante esa clave y no mediante su dirección. Una dirección nueva puede continuar la sesión sin interrupciones. mosh también muestra localmente lo que escribe y vuelve a dibujar 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, así que abra ese intervalo:

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 el panel de control, añada allí el mismo intervalo, porque 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 intervalo UDP está bloqueado en algún punto entre el teléfono y el servidor. Si una conexión indica que no se encuentra mosh-server, el paquete falta en el servidor o no está incluido en el PATH de inicio de sesión. Instálelo o indique directamente su ubicación con mosh --server=/usr/bin/mosh-server you@server.

mosh también se niega a ejecutarse cuando la configuración regional del inicio de sesión no usa UTF-8, y lo indica con el mensaje mosh-server needs a UTF-8 native locale to run.. Corrija 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 lo que para previsualizar una aplicación web que Claude Code acaba de iniciar todavía necesita usar ssh -L 8080:127.0.0.1:8080 you@server sin mosh. Además, sólo sincroniza la pantalla visible, por lo que no tiene su propio historial de desplazamiento. Esta segunda limitación no supone un problema aquí, porque tmux conserva el historial: Ctrl-b y, después, [ activa el modo de copia; puede desplazarse arrastrando 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 una máquina que edita su código y ejecuta comandos. Desactive la autenticación mediante contraseña. Un archivo de inclusión adicional es más seguro que editar directamente sshd_config, porque sshd_config de Ubuntu incluye /etc/ssh/sshd_config.d/*.conf al principio y se utiliza el primer valor encontrado para cada opció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 recuperación depende de la consola de su proveedor. Si esa conexión de prueba falla, vuelva a conectarse con ssh -v y resuelva el problema mientras la primera sesión siga abierta, porque ese único mensaje de error abarca cinco fallos distintos y la salida detallada indica cuál se está produciendo.

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

Si cambia SSH a otro puerto en Ubuntu 24.04, tenga en cuenta que el listener pertenece a ssh.socket, por lo que una línea Port por sí sola no cambia nada. Ejecute sudo systemctl edit ssh.socket, elimine el valor predeterminado con un ListenStream= vacío y establezca el puerto en la línea siguiente. Refuerzo de la seguridad de SSH en un VPS cubre este tema 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 no se puede aceptar en ningún caso. 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. Coloque el servidor detrás de una VPN de 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 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, reduzca la 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, aprueba solicitudes de permisos en una pantalla que muestra sólo unas pocas líneas del diff cada vez. Esto es un motivo para conservar las barreras de seguridad, no para desactivarlas. Compruebe también en qué modo de permisos se inician sus sesiones, porque el modo automático se convierte en el predeterminado de Claude Code el 14 de agosto de 2026 y aplica las ediciones de archivos sin detenerse a pedir confirmación. Ejecución segura de Claude Code en un VPS explica los límites de usuario y directorios que conviene establecer antes de que su principal vía de acceso sea una pantalla táctil.

Qué hacer cuando se vuelve a adjuntar y algo no funciona

tmux attach al mostrar no server running on /tmp/tmux-1000/default significa que el servidor de tmux ya no existe. Casi siempre indica que la máquina se reinició. Compruébelo con uptime. Las actualizaciones de seguridad automáticas de actualizaciones de seguridad automáticas reinician el sistema. Tras un reinicio no existe 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 distinto. El servidor de tmux está en ejecución, pero ese nombre no existe. tmux ls muestra las sesiones disponibles.

Si se conecta y encuentra un indicador de shell normal donde antes estaba Claude Code, el proceso terminó sin que terminara la sesión. Consulte dmesg -T | tail para buscar una línea como Out of memory: Killed process 4821 (claude). Eso es lo que ocurre durante una edición grande en un sistema con menos de 4 GB. Si no aparece esa línea, Claude Code terminó por su cuenta y el desplazamiento anterior del shell contiene la causa.

Si una ventana vuelve con un tamaño muy pequeño y queda espacio sin utilizar alrededor, significa que hay dos clientes conectados con tamaños distintos. tmux ajusta la ventana al tamaño del cliente conectado más pequeño. Su portátil 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 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. Esto no es compatible con una ejecución prolongada de un agente. 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 nada se detiene cuando termina la conexión. mosh mantiene activa la conexión durante un cambio de dirección, de modo que pasar de wifi a datos móviles ni siquiera obliga a 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?

Si el inicio de sesión se completa y después se bloquea con Nothing received from server on UDP port 60001., el rango UDP 60000 a 61000 no está abierto. Añada el rango en ufw y vuelva a añadirlo en el firewall de red de su proveedor, que en la mayoría de los paneles es un control independiente. Si mosh indica 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ñ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 la respuesta en ejecución y conserva el trabajo ya realizado. Ctrl+C también interrumpe, pero si lo pulsa dos veces cuando el indicador está inactivo, sale de Claude Code. Por eso, use primero Esc.

¿Es suficientemente seguro abrir SSH a Internet?

Si desactiva la autenticación mediante contraseña, la única credencial que puede funcionar es una clave que nunca sale de sus dispositivos. Este nivel de riesgo es razonable para una máquina que puede reconstruir. Asigne una clave propia a cada dispositivo, de modo que perder un teléfono sólo requiera 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.