Как запустить Claude Code на телефоне через SSH и tmux
Используйте Claude Code на VPS через SSH и mosh для стабильной работы при смене сети. Узнайте, как настроить tmux и терминал для управления агентом с мобильного устройства.
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 ГБ оперативной памяти или больше. На тарифах с 1 ГБ памяти установка проходит успешно, но при нагрузке процесс завершается ядром. Для Claude Code также необходима платная подписка Claude (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, а принудительный запуск приведет к конфликту двух префиксных клавиш.
Автоматическое подключение при каждом входе
Ввод команды attach на сенсорной клавиатуре быстро утомляет. Добавьте следующий код в конец файла ~/.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-8mosh не выполняет две функции. В его 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. 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.
Ограничение доступа: только ключи, без паролей
Теперь на вашем телефоне хранится ключ для доступа к машине, на которой вы редактируете код и выполняете команды. Отключите аутентификацию по паролю. Использование отдельного файла конфигурации безопаснее, чем прямое редактирование 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/authorized_keys, при этом доступ с ноутбука сохранится. Использование одного общего ключа потребует замены ключа на всех ваших устройствах.
Если вы переносите SSH на другой порт в Ubuntu 24.04, учтите, что прослушивание порта закреплено за ssh.socket, поэтому одна лишь строка Port ничего не изменит. Выполните sudo systemctl edit ssh.socket, очистите значение по умолчанию с помощью пустой директивы ListenStream=, а затем укажите свой порт на следующей строке. В статье Укрепление безопасности SSH на VPS рассматривается этот и другие аспекты защиты.
fail2ban для SSH дает мало преимуществ после отключения паролей, так как угаданный пароль в любом случае не будет принят. Его польза заключается в очистке логов от лишнего шума, что позволяет легче заметить реальную попытку входа.
Более надежный вариант — скрыть SSH от публичного интернета. Разместите сервер за собственным VPN-шлюзом WireGuard, активируйте туннель на телефоне при необходимости и настройте ListenAddress в sshd только для интерфейса туннеля. mosh работает через туннель, так как обе стороны используют UDP. Важное примечание: туннель добавляет накладные расходы на пакеты, поэтому если передача больших объемов данных зависает, уменьшите MTU (максимальный размер передаваемого блока) в конфигурации WireGuard на телефоне.
Последний момент при работе в таком режиме. С телефона вы подтверждаете запросы на доступ, видя на экране лишь несколько строк diff за раз. Это повод сохранить защитные механизмы, а не отключать их. В статье Безопасный запуск Claude Code на VPS описаны ограничения для пользователей и каталогов, которые стоит настроить до того, как основным способом управления станет сенсорный экран.
Что делать, если при повторном подключении возникли проблемы
tmux attach при выводе 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 поддерживает само соединение при смене сетевого адреса, поэтому переключение с 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 на прослушивание адреса внутри туннеля.