Как запустить Claude Code на телефоне через SSH и tmux
Используйте Claude Code на VPS через mosh и tmux, чтобы избежать разрывов соединения. Узнайте, как настроить SSH и терминал для стабильной работы с агентом на смартфоне.
Claude Code с телефона: как это работает на самом деле
Claude Code с телефона — это не мобильное приложение. Claude Code работает на VPS (виртуальном выделенном сервере) внутри сессии tmux, которая остается активной. Ваш телефон устанавливает SSH (secure shell) соединение с этой сессией на все время, пока вы с ней работаете. Если закрыть приложение, агент продолжит работу, так как процесс никогда не запускался на самом телефоне.
Это разделение лежит в основе архитектуры. Операционная система телефона приостанавливает работу приложения через несколько секунд после переключения на другое, поэтому любая длительная задача, запущенная на телефоне, прерывается. Кроме того, при переключении с Wi-Fi на мобильную сеть устройство получает новый сетевой адрес. Обе проблемы решаются, когда процесс выполняется на сервере, а телефон лишь отображает интерфейс.
На сервере необходимо подготовить четыре компонента: tmux для удержания сессии, SSH-ключи для доступа, mosh для корректной обработки изменений сети и сам Claude Code. На стороне телефона достаточно одного терминального приложения с удобной панелью дополнительных клавиш.
Что потребуется на VPS
Небольшого сервера с Ubuntu 24.04 достаточно для работы SSH и tmux. Claude Code предъявляет более высокие требования. Согласно официальным данным на июль 2026 года, необходима Ubuntu 20.04 или новее на процессоре x64 или ARM64, а также 4 GB оперативной памяти или больше. На тарифе с 1 GB памяти установка проходит успешно, но при нагрузке процесс завершается ядром из-за нехватки ресурсов. Для Claude Code также требуется платная подписка (Pro, Max, Team или Enterprise) или аккаунт Console с доступом к API, так как бесплатный план Claude.ai не включает эту возможность.
Настройте сервер для работы под обычным пользователем с правами sudo, а не под root. Если сервер новый, сначала выполните первые десять минут настройки нового VPS, так как изменения SSH, описанные далее в этом руководстве, проще вносить, когда пользователь и межсетевой экран уже настроены.
sudo apt update && sudo apt install -y tmux mosh
curl -fsSL https://claude.ai/install.sh | bash
claude --versionУстановщик размещает исполняемый файл в ~/.local/bin/claude, а команда claude --version выводит строку вида 2.1.211 (Claude Code). Если выводится command not found, значит, этот каталог еще не добавлен в ваш PATH: завершите сеанс, войдите снова и проверьте результат с помощью command -v claude. Команда claude doctor выводит диагностику установки и настроек без запуска сессии.
Войдите в систему один раз с ноутбука, прежде чем переходить на телефон. Выполните claude в каталоге проекта и следуйте инструкциям для входа. Процесс требует открыть URL в браузере и ввести код в терминале; переключение между двумя приложениями на экране телефона замедляет работу. Сделайте это один раз с полноценной клавиатурой, и учетные данные сохранятся на сервере.
Запуск Claude Code внутри tmux, чтобы разрыв соединения не привел к завершению работы
tmux new -s claude
cd ~/projects/api
claudeОтсоединитесь с помощью Ctrl-b, а затем d. tmux выведет [detached (from session claude)] и вернет вас в оболочку. Теперь можно закрыть приложение, потерять сигнал или убрать телефон в карман. Панель продолжит работу.
tmux ls
tmux attach -t claudetmux ls выводит по одной строке на сессию, например claude: 1 windows (created Thu Jul 30 09:14:02 2026). tmux attach -t claude возвращает вас точно в то состояние, в котором вы остановились, включая незавершенное редактирование.
Это работает, потому что tmux запускает собственный серверный процесс, а ваша оболочка и Claude Code являются дочерними процессами этого сервера, а не sshd. Когда SSH-соединение разрывается, ядро отправляет сигнал завершения SIGHUP процессам, привязанным к этому соединению, но сервер tmux к ним не относится. Без tmux та же блокировка экрана, которая разрывает соединение, остановит Claude Code в процессе вызова инструмента. В Запуск Claude Code на VPS внутри tmux более подробно рассматривается компоновка сессии.
Запускайте tmux на сервере, а не на телефоне. Ввод tmux внутри сессии, к которой вы уже подключены, выведет sessions should be nested with care, unset $TMUX to force, а принудительный запуск приведет к конфликту двух префиксных клавиш.
Автоматическое подключение при каждом входе в систему
Ввод команды подключения на сенсорной клавиатуре быстро утомляет. Добавьте следующую строку в конец файла ~/.profile на сервере:
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 подключается к сессии с именем claude, если она существует, или создает её, если нет. Таким образом, одна команда покрывает оба случая. exec заменяет оболочку входа на tmux, поэтому выход из tmux закрывает соединение, а не оставляет вас в пустой командной строке. Если вам нужна обычная оболочка, пропустите этот файл: ssh you@server -t "bash --noprofile".
Размещайте этот код в ~/.profile, а не в ~/.bashrc. Файл ~/.bashrc выполняется также для неинтерактивных сессий, из-за чего передача файлов перестает работать: scp и sftp воспринимают неожиданный вывод как протокольные данные и завершаются с ошибкой Received message too long. Файл ~/.profile выполняется только для оболочек входа, которыми и являются интерактивные SSH-сессии.
В ~/.profile Ubuntu также добавляет ~/.local/bin в PATH. Если claude работает корректно сразу после входа, но оболочка внутри tmux сообщает command not found, причина кроется в порядке выполнения. Поэтому запускайте tmux из оболочки входа, как показано выше, а не из скрипта, который пропускает профиль.
iOS: Termius или Blink Shell
Оба приложения поддерживают SSH и mosh, а также хранят ключи внутри себя. Разница заключается в интерфейсе.
Blink Shell управляется командами. В командной строке вы вводите ssh you@server или mosh you@server, используя тот же синтаксис, что и в терминале на десктопе. Настройки открываются командой config, а раздел Keys позволяет создать пару ключей.
Termius управляется через формы. Вы заполняете данные хоста, а затем переключаете протокол с SSH на Mosh в настройках этого хоста. Termius поставляет собственную реализацию mosh и поддерживает версию mosh 1.3.0 и новее, поэтому на сервере всё ещё должен быть установлен пакет mosh.
В обоих случаях генерируйте ключ внутри приложения и никогда не копируйте существующий закрытый ключ на телефон. Приложение покажет вам открытую часть ключа — это одна строка, которую нужно добавить в ~/.ssh/authorized_keys на сервере. В разделе SSH-ключи для каждого устройства и их отзыв описаны правила именования и процедура отзыва, что для телефона важнее, чем для ноутбука.
Включите в терминальном приложении собственную блокировку по биометрии или паролю. Без этого разблокированный телефон становится открытой оболочкой к вашему серверу на всё время, пока экран активен.
Android: Termux
pkg upgrade
pkg install openssh mosh
ssh-keygen -t ed25519 -C "pixel"
cat ~/.ssh/id_ed25519.pubTermux предоставляет пакеты OpenSSH и mosh в собственном репозитории, поэтому ssh, ssh-keygen и mosh работают так же, как на настольных системах. Добавьте выведенную строку открытого ключа в ~/.ssh/authorized_keys на сервере, затем подключитесь с помощью mosh you@server.
Экранная клавиатура Android не содержит клавиш Esc и Ctrl, которые необходимы для Claude Code. Termux позволяет отобразить собственную панель клавиш. Добавьте одну строку в ~/.termux/termux.properties:
extra-keys = [['ESC','|','/','HOME','UP','END','PGUP'],['TAB','CTRL','ALT','LEFT','DOWN','RIGHT','PGDN']]Затем выполните termux-reload-settings, и панель появится над клавиатурой. Та же команда перезагрузки применит моноширинный шрифт TrueType, размещенный в ~/.termux/font.ttf.
Android может остановить работу Termux, когда приложение находится в фоновом режиме, но в данном случае это не влечет за собой потерю данных, кроме необходимости переподключения. Сессия и агент находятся на сервере.
Почему терминал зависает при отключении от Wi-Fi и что исправляет mosh?
SSH-соединение — это TCP-соединение (transmission control protocol), которое идентифицируется по обоим IP-адресам и обоим портам. Когда вы выходите из зоны действия Wi-Fi, телефон получает новый адрес в мобильной сети, поэтому старое соединение перестает соответствовать параметрам на обоих концах. Ни одна из сторон не получает уведомления об этом. Терминал просто перестает отвечать, пока TCP не завершит попытки соединения, после чего ssh выводит client_loop: send disconnect: Broken pipe. Чтобы немедленно прервать зависшую сессию, нажмите Enter, затем ~, затем ..
mosh (mobile shell) устраняет этот режим отказа. Он использует SSH один раз для входа в систему и запуска процесса mosh-server, считывает UDP-порт (user datagram protocol), выбранный сервером, и закрывает SSH-соединение. После этого стороны обмениваются UDP-датаграммами, аутентифицированными общим сессионным ключом, поэтому сессия идентифицируется по этому ключу, а не по вашему адресу. При смене адреса соединение просто продолжается. mosh также локально отображает ваш ввод и обновляет экран, если данные сервера отличаются, поэтому он остается работоспособным даже при медленном мобильном соединении.
mosh использует UDP-порты в диапазоне от 60000 до 61000, поэтому откройте этот диапазон:
sudo ufw allow 60000:61000/udp
sudo ufw statusВ Открытие портов с помощью ufw описаны остальные аспекты настройки межсетевого экрана. Если ваш провайдер предоставляет отдельный сетевой экран в панели управления, добавьте этот же диапазон и там, так как правило ufw не может повлиять на фильтр, расположенный перед машиной.
Часто встречаются две проблемы с mosh. Если вход в систему проходит успешно, но затем соединение зависает с сообщением Nothing received from server on UDP port 60001., это означает, что UDP-диапазон заблокирован где-то между телефоном и сервером. Если при подключении сообщается, что mosh-server не найден, значит пакет отсутствует на сервере или не указан в PATH для входа. Установите его или укажите путь напрямую с помощью mosh --server=/usr/bin/mosh-server you@server.
mosh также отказывается работать, если локаль входа не UTF-8, о чем он и сообщает: mosh-server needs a UTF-8 native locale to run. Исправьте локаль на сервере, а не на телефоне.
locale
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8Есть две вещи, которые mosh не умеет. В его README указано, что mosh не поддерживает X forwarding или неинтерактивное использование SSH, включая проброс портов (port forwarding), поэтому для предварительного просмотра веб-приложения, запущенного Claude Code, по-прежнему требуется обычный ssh -L 8080:127.0.0.1:8080 you@server. Он также синхронизирует только видимую часть экрана, поэтому у него нет собственного буфера прокрутки. Это ограничение не является проблемой, так как tmux сохраняет историю: Ctrl-b, затем [ активируют режим копирования, прокрутка выполняется перетаскиванием или клавишами со стрелками, а q — выход из режима.
Make a phone screen usable
Four lines in ~/.tmux.conf on the server do most of the work:
set -g mouse on
set -g status-position top
set -g default-terminal "tmux-256color"
set -g history-limit 20000mouse on turns a touch drag into a scroll and a tap into a pane or window selection, which replaces most of the prefix keys that are awkward to type. status-position top moves the tmux status line off the bottom edge, where the on-screen keyboard and its suggestion bar cover it. default-terminal matters because tmux otherwise announces a screen terminal to Claude Code, and colours and box drawing come out worse than they need to. If tmux then refuses to start with missing or unsuitable terminal: tmux-256color, the terminfo entry is missing: sudo apt install ncurses-term.
Learn four keys and the rest is comfortable.
Escinterrupts Claude mid-response and keeps the work already done, so it is the key you want closest to your thumb.Ctrl+Cinterrupts a running operation as well. At an idle prompt the first press clears the input and a second press exits Claude Code, so it is the blunter tool.Esctwice clears a draft prompt, and at an empty prompt it opens the rewind menu instead.- For a multi-line prompt, type
\and then Enter. That form works in every terminal. Shift+Enter is native only in a short list of desktop terminals, and the mobile clients are not in it.
Avoid split panes. A phone in portrait is around 40 columns wide, so a vertical split leaves 20 columns per pane and every diff wraps into noise. Use tmux windows instead: Ctrl-b c creates one and Ctrl-b n moves to the next. If a second window ends up holding its own Claude Code session, the two sessions can hand work to each other directly instead of you copying text between windows on a touchscreen. Turn the phone sideways when you need to read a diff properly.
Объём текста на этом экране стоит задать осознанно, поскольку стиль вывода изменяет системный промпт перед каждым ответом, а более краткий вариант оставляет меньше экранов для прокрутки на телефоне.
A long session on a small screen is mostly a context problem, so managing the Claude Code context window is worth reading before you try to run a full day of work from a train.
Ограничение доступа: только ключи, без паролей
Теперь на телефоне хранится ключ от машины, которая редактирует ваш код и выполняет команды. Отключите аутентификацию по паролю. Использование файла-вставки (drop-in file) безопаснее, чем прямое редактирование sshd_config, так как sshd_config в Ubuntu включает /etc/ssh/sshd_config.d/*.conf в начале файла, а приоритет имеет первое найденное значение параметра.
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 анализирует конфигурацию и ничего не выводит, если она корректна. Пропустите этот шаг, и одна опечатка приведет к тому, что sshd завершится с ошибкой при перезагрузке. Не закрывайте текущую сессию и протестируйте подключение из второго окна, прежде чем что-либо закрывать: неверный ключ приведет к Permission denied (publickey)., а при отключенных паролях пути назад не будет. В этом случае единственным способом восстановления станет консоль вашего провайдера. Если тестовое соединение не удалось, переподключитесь с помощью ssh -v и исправьте проблему, пока открыта первая сессия, так как это сообщение об ошибке охватывает пять разных неисправностей, а подробный вывод укажет, какая именно возникла у вас.
Выдайте каждому устройству свой собственный ключ. В случае потери телефона достаточно будет удалить одну строку из ~/.ssh/authorized_keys, и ваш ноутбук продолжит работать. Использование одного общего ключа означает необходимость замены ключа на всех ваших устройствах.
Если вы переносите SSH на другой порт в Ubuntu 24.04, учтите, что слушатель принадлежит ssh.socket, поэтому одна лишь строка Port ничего не изменит. Выполните sudo systemctl edit ssh.socket, очистите значение по умолчанию с помощью пустой директивы ListenStream=, а затем укажите свой порт на следующей строке. Укрепление защиты SSH на VPS описывает этот процесс и другие аспекты безопасности.
fail2ban для SSH почти не добавляет безопасности после отключения паролей, так как угаданный пароль всё равно не будет принят. Его польза заключается в очистке логов, что позволяет легко заметить реальную попытку входа.
Более надежный вариант — скрыть SSH от публичного интернета. Разместите сервер за собственным VPN-сервером WireGuard, поднимайте туннель на телефоне по мере необходимости и настройте sshd на прослушивание ListenAddress только через этот туннель. mosh работает через туннель, так как обе стороны используют UDP. Важное замечание: туннель добавляет накладные расходы на пакеты, поэтому, если передача больших объемов данных зависает, уменьшите MTU (максимальный размер передаваемого блока) в конфигурации WireGuard на телефоне.
Последний момент при работе в таком режиме. С телефона вы подтверждаете запросы разрешений на экране, где отображается лишь несколько строк diff за раз. Это повод сохранить защитные механизмы, а не отключать их. Также проверьте, в каком режиме разрешений запускаются ваши сессии, поскольку автоматический режим станет стандартом для Claude Code 14 августа 2026 года, и он будет вносить правки в файлы без запроса подтверждения. Безопасный запуск Claude Code на VPS описывает ограничения для пользователей и каталогов, которые стоит настроить до того, как основным инструментом управления станет сенсорный экран.
Действия при возникновении проблем с повторным подключением
tmux attach printing no server running on /tmp/tmux-1000/default означает, что сервер tmux завершил работу, что почти всегда указывает на перезагрузку машины. Проверьте это с помощью uptime. Обновления ядра, установленные через автоматические обновления безопасности, перезагружают сервер, а после перезагрузки сессии tmux не сохраняются, поэтому рассматривайте любой запуск Claude Code как процесс, который можно перезапустить.
can't find session: claude — это другой случай. Сервер tmux запущен, но указанное имя сессии отсутствует. tmux ls покажет, какие сессии существуют в данный момент.
Если при подключении вы видите обычную командную строку там, где должен быть Claude Code, значит, процесс завершился, но сессия осталась активной. Ищите в dmesg -T | tail строку вида Out of memory: Killed process 4821 (claude) — именно это происходит на серверах с объемом памяти менее 4 GB при выполнении масштабных правок. Если такой строки нет, значит, Claude Code завершился самостоятельно, и причина указана в истории вывода терминала выше командной строки.
Если окно открывается в уменьшенном виде с пустым пространством вокруг, это означает, что к сессии подключены два клиента с разными размерами экрана, так как tmux подстраивает размер окна под самого маленького клиента. Ваш ноутбук удерживает сессию с шириной 200 столбцов, в то время как телефон запрашивает 40. Отключайте других клиентов при входе: tmux attach -d -t claude.
FAQ
Можно ли запустить Claude Code прямо на телефоне, а не на VPS?
Нет. По состоянию на июль 2026 года поддерживаются платформы macOS, Windows, Ubuntu 20.04 или новее, Debian 10 или новее, а также Alpine 3.19 или новее с объемом оперативной памяти от 4 ГБ. Android и iOS в этот список не входят. Кроме того, телефон переводит приложения в спящий режим и постоянно меняет сетевой адрес, что недопустимо для длительной работы агента. Запускайте его на сервере, а телефон используйте только в качестве дисплея.
Сохранится ли сессия, если я закрою приложение или потеряю связь?
Да, за это отвечают два отдельных компонента. tmux поддерживает работу процесса на сервере, поэтому при разрыве соединения ничего не завершается. mosh поддерживает само соединение при смене IP-адреса, поэтому переключение с Wi-Fi на мобильный интернет не требует повторного подключения. При использовании обычного SSH без tmux разрыв соединения отправляет сигнал SIGHUP, и Claude Code останавливается в процессе выполнения задачи.
Почему mosh подключается, но ничего не отображает?
Если вход в систему проходит успешно, но затем соединение зависает с Nothing received from server on UDP port 60001., это означает, что порты UDP в диапазоне от 60000 до 61000 закрыты. Откройте этот диапазон в ufw, а также в сетевом файрволе вашего провайдера, который на большинстве панелей управления настраивается отдельно. Если mosh сообщает, что mosh-server не найдена, значит, на сервере отсутствует пакет: sudo apt install mosh.
Как прервать работу Claude Code с клавиатуры, на которой нет клавиши Esc?
Добавьте дополнительный ряд клавиш. В Termux он настраивается через extra-keys в файле ~/.termux/termux.properties, а в Termius и Blink такой ряд уже есть и его можно настроить в параметрах. Esc прерывает текущий ответ, сохраняя уже выполненную работу. Ctrl+C также прерывает выполнение, но при двукратном нажатии в режиме ожидания ввода эта команда завершает работу Claude Code, поэтому сначала используйте Esc.
Достаточно ли безопасно открывать SSH в интернет для этих целей?
Если аутентификация по паролю отключена, единственным способом входа остается ключ, который никогда не покидает ваши устройства. Это приемлемый риск для машины, которую можно пересобрать с нуля. Выдайте каждому устройству свой ключ, чтобы в случае потери телефона вам потребовалось лишь удалить одну строку в authorized_keys. Если вы не хотите открывать порт для публичного доступа, поместите сервер за WireGuard и настройте sshd на прослушивание только туннельного адреса.