SSD Nodes Learn Hosting plans →
Руководства Matt ConnorАвтор: Matt Connor

Claude Code с телефона через SSH и tmux

Claude Code работает не на телефоне, а в tmux на VPS: подключайтесь по SSH, используйте mosh при нестабильной сети и tmux attach; важна строка клавиш.

Claude Code с вашего телефона: как это работает на самом деле

В этом руководстве используется терминальное приложение на вашем телефоне. Claude Code работает на VPS (виртуальном выделенном сервере) внутри сессии tmux, которая остается активной, а ваш телефон устанавливает SSH-соединение (secure shell) с этой сессией на все время работы. Если вы закроете приложение, агент продолжит работу, так как процесс никогда не выполнялся на самом телефоне.

Claude Code также предлагает функцию Remote Control: запустите /remote-control внутри сессии, чтобы использовать её через мобильное приложение Claude или браузер, пока процесс остается на сервере.

Это разделение лежит в основе архитектуры. Операционная система телефона приостанавливает работу приложения через несколько секунд после того, как вы переключаетесь на другое, поэтому любая длительная задача, запущенная на телефоне, прерывается. Кроме того, телефон получает новый сетевой адрес каждый раз при переключении с Wi-Fi на мобильные данные. Обе проблемы исчезают, когда процесс выполняется на сервере, а телефон лишь отображает экран.

На сервере вам потребуются четыре компонента: tmux для удержания сессии, SSH-ключи для доступа, mosh для обработки изменений сети и сам Claude Code. На стороне телефона достаточно одного терминального приложения с удобным доступом к ряду клавиш.

Что потребуется на VPS

Для работы с SSH и tmux достаточно небольшого сервера с Ubuntu 24.04. Claude Code требует больше ресурсов. Официальные системные требования на октябрь 2026 года: Ubuntu 20.04 или новее, процессор x64 или ARM64 и не менее 4 GB оперативной памяти. Для Claude Code также необходима платная подписка Claude (Pro, Max, Team или Enterprise), аккаунт в Console с доступом к API или доступ через поддерживаемого облачного провайдера, например Amazon Bedrock, так как бесплатный тариф 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)] и вернёт вас в shell. Теперь можно закрыть приложение, потерять сигнал сети или убрать телефон в карман. Панель продолжит работать.

tmux ls
tmux attach -t claude

Команда tmux ls выводит по одной строке для каждой сессии, например claude: 1 windows (created Thu Jul 30 09:14:02 2026). Команда tmux attach -t claude возвращает вас точно туда, где вы остановились, включая незавершённое редактирование.

Это работает, потому что tmux запускает собственный серверный процесс, а ваш shell и Claude Code являются дочерними процессами этого сервера, а не sshd. Когда SSH-соединение завершается, kernel отправляет сигнал завершения, SIGHUP, процессам, подключённым к этому соединению. Сервер tmux к ним не относится. Без tmux блокировка экрана, из-за которой разрывается соединение, останавливает Claude Code в середине вызова инструмента. В разделе Запуск Claude Code на VPS внутри tmux схема сессии рассмотрена подробнее.

Запускайте tmux на сервере, а не на телефоне. Ввод tmux внутри уже подключённой сессии выводит sessions should be nested with care, unset $TMUX to force, а принудительный запуск создаёт две конфликтующие prefix-клавиши.

Автоматическое подключение при каждом входе в систему

Ввод команды подключения на сенсорной клавиатуре быстро утомляет. Добавьте это в конец файла ~/.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. Bash также считывает ~/.bashrc для неинтерактивных SSH-команд, но проверка [ -t 1 ] выше предотвращает запуск tmux во время передачи файлов. Незащищенные команды запуска, выводящие текст, нарушают работу протоколов передачи данных, вызывая ошибки вроде Received message too long. Файл ~/.profile выполняется только для оболочек входа, которыми и являются интерактивные SSH-сессии.

В файле ~/.profile Ubuntu также добавляет ~/.local/bin в PATH. Если claude работает сразу после входа, но оболочка внутри tmux выдает command not found, причина кроется в порядке выполнения. Поэтому запускайте tmux из оболочки входа, как показано выше, а не из скрипта, который пропускает профиль.

Оба приложения работают по 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.pub

Termux содержит 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, и ряд появится над клавиатурой. При той же перезагрузке Termux обнаружит моноширинный шрифт 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., это означает, что mosh-server запущен, но клиент не может связаться с ним по этому UDP-порту. Обычно это означает, что файрвол где-то между телефоном и сервером блокирует UDP в диапазоне mosh. Если при подключении сообщается, что mosh-server не найден, значит, пакет отсутствует на сервере или его нет в PATH для входа. Установите его или укажите путь напрямую с помощью mosh --server=/usr/bin/mosh-server you@server.

Если локаль входа на сервере не UTF-8, mosh-server пытается использовать настройки локали, предоставленные клиентом, и проверяет снова. Он отказывается работать, только если это также не обеспечивает 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

Оба конца должны использовать UTF-8 локаль, а mosh-server также применяет настройки локали, отправляемые клиентом. Если ошибка сохраняется после исправления на сервере, установите LANG в значение UTF-8 также в приложении терминала на телефоне, что, как отмечает FAQ самого mosh, mosh-client может потребоваться.

Есть две вещи, которые mosh не делает. В его README указано, что mosh не поддерживает X forwarding или неинтерактивное использование SSH, включая проброс портов (port forwarding), поэтому для предварительного просмотра веб-приложения, которое только что запустил Claude Code, по-прежнему нужен обычный ssh -L 8080:127.0.0.1:8080 you@server. Он также синхронизирует только видимую часть экрана, поэтому у него нет собственного буфера прокрутки. Это ограничение не является проблемой, так как tmux сохраняет историю: Ctrl-b, затем [ активирует режим копирования, прокрутка осуществляется перетаскиванием или клавишами со стрелками, а q выходит из режима.

Адаптация экрана телефона для работы

Четыре строки в ~/.tmux.conf на сервере выполняют основную часть работы:

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

mouse on превращает перетаскивание пальцем в прокрутку, а нажатие — в выбор панели или окна, что заменяет большинство неудобных для ввода префиксных клавиш. status-position top перемещает строку состояния tmux с нижнего края, где её перекрывают экранная клавиатура и панель подсказок. default-terminal фиксирует имя терминала, которое tmux сообщает Claude Code. Без этой строки tmux передает имя, выбранное при сборке. Скрипт конфигурации tmux 3.4 начинает с screen, затем последовательно проверяет screen-256color, tmux и tmux-256color; при неудачной проверке сохраняется предыдущий вариант. Сборка, которая не смогла найти запись terminfo tmux-256color, в итоге использует tmux, screen-256color или обычный screen, из-за чего цвета и отрисовка рамок могут выглядеть хуже, чем могли бы.

Выучите четыре клавиши, и остальное станет удобным.

  • Esc прерывает Claude в процессе ответа, сохраняя уже выполненную работу, поэтому эту клавишу стоит держать ближе всего к большому пальцу.
  • Ctrl+C также прерывает выполняемую операцию. В режиме ожидания ввода первое нажатие очищает строку, а второе завершает работу Claude Code, поэтому это более радикальный инструмент.
  • Esc при двойном нажатии очищает черновик запроса, а при пустой строке открывает меню отката.
  • Для многострочного запроса введите \ и нажмите Enter. Этот способ работает в любом терминале. Комбинация Shift+Enter поддерживается лишь в небольшом списке настольных терминалов, в который не входят мобильные клиенты.

Избегайте разделения панелей. Телефон в портретной ориентации имеет ширину около 40 символов, поэтому вертикальное разделение оставляет по 20 символов на панель, и любой diff превращается в нечитаемый набор символов. Используйте окна tmux: Ctrl-b c создает окно, а Ctrl-b n переключает на следующее. Если во втором окне запущена своя сессия Claude Code, две сессии могут напрямую передавать задачи друг другу, избавляя вас от копирования текста между окнами на сенсорном экране. Поворачивайте телефон горизонтально, когда нужно корректно прочитать diff.

Объем текста, помещающийся на экране, стоит настроить заранее, так как стиль вывода редактирует системный промпт для каждого ответа, а более лаконичный стиль означает меньше экранов для прокрутки на телефоне.

Длительная сессия на маленьком экране — это прежде всего вопрос контекста, поэтому стоит ознакомиться с разделом управление контекстным окном Claude Code, прежде чем пытаться полноценно работать в течение дня, например, в поезде.

Ограничение доступа: только ключи, без паролей

Теперь на телефоне хранится ключ от машины, которая редактирует ваш код и выполняет команды. Отключите аутентификацию по паролю. Использование файла-вставки (drop-in) безопаснее, чем прямое редактирование sshd_config, поскольку sshd_config в Ubuntu содержит /etc/ssh/sshd_config.d/*.conf в начале, а учитывается только первое найденное значение параметра.

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

Файлы-вставки считываются в алфавитном порядке имен. Проверьте sudo sshd -T на наличие passwordauthentication no, kbdinteractiveauthentication no, pubkeyauthentication yes и permitrootlogin no; если один из этих параметров задан в файле, который считывается раньше, он будет иметь приоритет, и исправить его нужно именно там.

sshd -t анализирует конфигурацию и ничего не выводит, если она корректна. Не пропускайте этот шаг: одна опечатка приведет к тому, что sshd не перезагрузится при попытке применения конфигурации. Оставьте текущую сессию открытой и протестируйте подключение со второго терминала, прежде чем закрывать что-либо, так как неверный ключ приведет к Permission denied (publickey)., а при отключенных паролях запасного варианта не будет. В этом случае единственным путем восстановления станет консоль вашего провайдера. Если тестовое соединение не удалось, переподключитесь с помощью ssh -v и устраните проблему, пока первая сессия еще активна, так как это сообщение об ошибке охватывает пять различных неисправностей, а подробный вывод укажет, какая именно возникла у вас.

Выдавайте каждому устройству свой собственный ключ. В случае потери телефона достаточно будет удалить одну строку из ~/.ssh/authorized_keys, и ваш ноутбук продолжит работать. Использование одного общего ключа означает необходимость замены ключа на всех ваших устройствах.

Если вы переносите SSH на другой порт в Ubuntu 24.04, учтите, что прослушивание порта относится к ssh.socket. Генератор systemd создает этот сокет на основе строки Port в вашей SSH-конфигурации, поэтому вам не нужен переопределяющий файл ListenStream, но перезапуск только ssh оставит сервер на 22 порту. Добавьте строку Port в файл-вставку, разрешите новый порт в ufw, затем выполните sudo systemctl daemon-reload, а следом sudo systemctl restart ssh.socket. Укрепление защиты SSH на VPS описывает этот процесс и остальные аспекты безопасности.

fail2ban для SSH дает мало преимуществ после отключения паролей, так как угаданный пароль в любом случае не будет принят. Его польза заключается в уменьшении шума в логах, что позволяет легко заметить реальную попытку входа.

Более надежный вариант — убрать SSH из публичного доступа. Разместите сервер за собственным VPN-сервером WireGuard, поднимайте туннель на телефоне по мере необходимости и настройте sshd на прослушивание ListenAddress только через туннель. mosh работает через туннель, так как обе стороны используют UDP. Важное замечание: туннель добавляет накладные расходы на пакеты, поэтому, если передача больших объемов данных зависает, уменьшите MTU (максимальный размер блока данных) в конфигурации WireGuard на телефоне.

Последний момент при такой работе. С телефона вы подтверждаете запросы разрешений на экране, отображающем лишь несколько строк diff за раз. Это повод сохранить защитные механизмы, а не отключать их. Также проверьте, в каком режиме разрешений запускаются ваши сессии, поскольку автоматический режим теперь является встроенным режимом по умолчанию для интерактивных терминальных сессий в Claude Code v2.1.283, и он вносит правки в файлы в рабочей директории без запроса подтверждения. Безопасный запуск Claude Code на VPS описывает ограничения для пользователей и директорий, которые стоит настроить до того, как основным способом доступа станет сенсорный экран.

Если при повторном подключении возникли проблемы

tmux attach printing no server running on /tmp/tmux-1000/default означает, что tmux не обнаружил сервер на этом сокете. Обычно сервер завершил работу, что почти всегда означает перезагрузку машины. Проверьте это с помощью uptime. Если сервер не перезагружался, а pgrep tmux всё ещё показывает сервер, это само по себе не означает, что файл сокета был удален, так как флаги -L и -S позволяют серверу прослушивать другой сокет. Если вы запускали tmux с одним из них, передайте тот же флаг в tmux attach. Если сокет действительно был случайно удален, pkill -USR1 tmux запрашивает у сервера его воссоздание, что, как указано в руководстве tmux, невозможно, если отсутствует какой-либо родительский каталог. Обновления ядра из автоматических обновлений безопасности требуют перезагрузки для вступления в силу, но unattended-upgrades выполняет автоматическую перезагрузку только при включенном Unattended-Upgrade::Automatic-Reboot; значение по умолчанию — false. После перезагрузки сервера сессия tmux отсутствует, поэтому рассматривайте любой запуск Claude Code как процесс, который можно перезапустить.

can't find session: claude — это другой случай. Сервер tmux запущен, но указанное имя отсутствует. tmux ls показывает, какие сессии существуют.

Если вы подключаетесь и видите обычную командную строку там, где должен быть Claude Code, значит, процесс завершился, а сессия — нет. Посмотрите в dmesg -T | tail строку наподобие Out of memory: Killed process 4821 (claude), которая подтверждает завершение процесса из-за нехватки памяти (OOM kill). Проверьте историю прокрутки оболочки над приглашением на наличие других сообщений о выходе.

Окно, которое возвращается в неверном размере, обрезанное по краям или с неиспользуемым пространством вокруг, означает, что подключены два клиента с разными размерами экрана. По умолчанию tmux 3.4 подстраивает размер окна под клиента с последней активностью (window-size latest), поэтому ваш ноутбук, подключенный с шириной 200 столбцов, и телефон с шириной 40 по очереди изменяют его размер. Отключайте другие клиенты при подключении: tmux attach -d -t claude.

FAQ

Можно ли запустить Claude Code на самом телефоне, а не на VPS?

CLI-интерфейс терминала не поддерживается в Android или iOS. По состоянию на октябрь 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., это означает, что клиент не может связаться с mosh-server по данному UDP-порту. Обычно это указывает на то, что брандмауэр блокирует диапазон UDP от 60000 до 61000. Добавьте этот диапазон в ufw, а также в сетевой брандмауэр вашего провайдера, который на большинстве панелей управления настраивается отдельно. Если вместо этого mosh сообщает, что mosh-server не найден, значит, на сервере отсутствует пакет или он не включен в путь входа PATH: установите его с помощью sudo apt install mosh или используйте mosh --server=/usr/bin/mosh-server you@server.

Как прервать работу Claude Code с клавиатуры, на которой нет клавиши Esc?

Добавьте панель клавиш. В Termux она настраивается через extra-keys в файле ~/.termux/termux.properties, а в Termius и Blink такая панель есть по умолчанию, и её можно настроить в параметрах. Esc прерывает выполнение текущего ответа, сохраняя уже проделанную работу. Ctrl+C также прерывает выполнение, но при двойном нажатии в режиме ожидания ввода эта команда завершает работу Claude Code, поэтому сначала попробуйте Esc.

Достаточно ли безопасно открывать SSH в интернет для этих целей?

Если аутентификация по паролю отключена, единственным способом входа остается ключ, который никогда не покидает ваши устройства. Это приемлемый уровень риска для машины, которую можно пересобрать. Выдайте каждому устройству отдельный ключ, чтобы в случае потери телефона вам потребовалось удалить всего одну строку в authorized_keys. Если вы не хотите, чтобы сервер отвечал на публичном порту, разместите его за WireGuard и настройте sshd на прослушивание адреса внутри туннеля.

Была ли эта статья полезной?