Claude Code na telefonie: konfiguracja przez SSH i tmux
Uruchom Claude Code na VPS z wykorzystaniem tmux oraz mosh. Dowiedz się, jak skonfigurować sesję SSH, aby uniknąć przerywania pracy agenta przy zmianie sieci na telefonie.
Claude Code z telefonu: jak to działa w praktyce
Claude Code z telefonu nie jest aplikacją mobilną. Claude Code działa na serwerze VPS (virtual private server), wewnątrz sesji tmux, która pozostaje otwarta, a telefon nawiązuje połączenie SSH (secure shell) z tą sesją na czas korzystania z niej. Zamknięcie aplikacji nie przerywa pracy agenta, ponieważ proces nigdy nie był uruchomiony na telefonie.
Ten podział stanowi fundament projektu. System operacyjny telefonu zawiesza aplikację kilka sekund po przełączeniu się na inną, więc każde długotrwałe zadanie uruchomione bezpośrednio na telefonie zostałoby przerwane. Ponadto telefon otrzymuje nowy adres sieciowy przy każdym przejściu z sieci Wi-Fi na dane mobilne. Oba problemy znikają, gdy proces działa na serwerze, a telefon służy jedynie do wyświetlania obrazu.
Na serwerze wymagane są cztery elementy: tmux do utrzymania sesji, klucze SSH do autoryzacji, mosh do obsługi zmian sieciowych oraz sam Claude Code. Po stronie telefonu wystarczy jedna aplikacja terminalowa z dostępnym paskiem klawiszy funkcyjnych.
Wymagania dotyczące VPS
Mała instancja z Ubuntu 24.04 wystarczy do obsługi SSH i tmux. Claude Code wymaga jednak więcej zasobów. Oficjalne wymagania na lipiec 2026 to Ubuntu 20.04 lub nowsze na procesorze x64 lub ARM64 oraz co najmniej 4 GB pamięci RAM. Plan z 1 GB RAM pozwala na instalację, ale pod obciążeniem proces jest przerywany przez jądro systemu. Claude Code wymaga również płatnego konta Claude (Pro, Max, Team lub Enterprise) albo konta w konsoli z dostępem do API, ponieważ darmowy plan Claude.ai nie obejmuje tej usługi.
Skonfiguruj serwer jako zwykły użytkownik z uprawnieniami sudo, a nie jako root. Jeśli serwer jest nowy, najpierw wykonaj kroki opisane w pierwsze dziesięć minut na nowym VPS, ponieważ zmiany w SSH opisane w dalszej części poradnika są łatwiejsze do wdrożenia, gdy użytkownik i firewall już istnieją.
sudo apt update && sudo apt install -y tmux mosh
curl -fsSL https://claude.ai/install.sh | bash
claude --versionInstalator umieszcza plik binarny w ~/.local/bin/claude, a claude --version wyświetla linię w formacie 2.1.211 (Claude Code). Jeśli wyświetlony zostanie komunikat command not found, oznacza to, że dany katalog nie znajduje się jeszcze w zmiennej PATH: wyloguj się, zaloguj ponownie, a następnie sprawdź wynik za pomocą command -v claude. claude doctor wyświetla diagnostykę instalacji i ustawień bez uruchamiania sesji.
Zaloguj się teraz jednorazowo z laptopa, zanim zaczniesz polegać na telefonie. Uruchom claude w katalogu projektu i postępuj zgodnie z monitami logowania. Procedura wymaga otwarcia adresu URL w przeglądarce i wprowadzenia kodu w terminalu, co przy obsłudze dwóch aplikacji na ekranie telefonu jest mało wydajne. Wykonaj to raz na pełnowymiarowej klawiaturze, a poświadczenia pozostaną na serwerze.
Uruchamianie Claude Code wewnątrz tmux, aby uniknąć przerwania procesu przy zerwaniu połączenia
tmux new -s claude
cd ~/projects/api
claudeOdłącz się za pomocą Ctrl-b, a następnie d. tmux wyświetli [detached (from session claude)] i przywróci dostęp do powłoki. Można teraz zamknąć aplikację, stracić zasięg lub schować telefon do kieszeni. Panel będzie nadal działał.
tmux ls
tmux attach -t claudetmux ls wyświetla jedną linię na sesję, na przykład claude: 1 windows (created Thu Jul 30 09:14:02 2026). tmux attach -t claude przywraca dokładnie ten sam stan, włącznie z niedokończoną edycją.
Mechanizm ten działa, ponieważ tmux uruchamia własny proces serwera, a powłoka oraz Claude Code są procesami potomnymi tego serwera, a nie sshd. Gdy połączenie SSH zostaje zakończone, jądro wysyła sygnał SIGHUP do procesów powiązanych z tym połączeniem, a serwer tmux nie znajduje się na tej liście. Bez tmux, ta sama blokada ekranu, która przerywa połączenie, zatrzymuje Claude Code w trakcie wywołania narzędzia. Uruchamianie Claude Code na VPS wewnątrz tmux zawiera bardziej szczegółowe informacje na temat układu sesji.
Uruchamiaj tmux na serwerze, nigdy na telefonie. Wpisanie tmux wewnątrz sesji, do której jesteś już podłączony, wyświetli sessions should be nested with care, unset $TMUX to force, a wymuszenie tego działania spowoduje konflikt dwóch klawiszy prefiksu.
Automatyczne dołączanie przy każdym logowaniu
Wpisywanie polecenia dołączania na klawiaturze ekranowej staje się uciążliwe. Należy umieścić poniższy kod na końcu pliku ~/.profile na serwerze:
if command -v tmux >/dev/null 2>&1 && [ -z "$TMUX" ] && [ -t 1 ]; then
exec tmux new-session -A -s claude
fiPolecenie new-session -A -s claude dołącza do sesji o nazwie claude, jeśli ta istnieje, lub tworzy ją, jeśli nie istnieje – jedno polecenie obsługuje oba przypadki. exec zastępuje powłokę logowania przez tmux, dzięki czemu wyjście z tmux zamyka połączenie zamiast pozostawiać użytkownika w surowej powłoce. Gdy wymagana jest zwykła powłoka, należy pominąć ten plik: ssh you@server -t "bash --noprofile".
Kod należy umieścić w ~/.profile, a nie w ~/.bashrc. Plik ~/.bashrc jest wykonywany również dla sesji nieinteraktywnych, co powoduje błędy przesyłania plików: scp oraz sftp odczytują nieoczekiwane wyjście jako dane protokołu i kończą się błędem Received message too long. Plik ~/.profile jest wykonywany tylko dla powłok logowania, którymi są interaktywne sesje SSH.
W pliku ~/.profile Ubuntu dodaje również ~/.local/bin do PATH. Jeśli claude działa poprawnie zaraz po zalogowaniu, ale powłoka wewnątrz tmux zwraca command not found, przyczyną jest kolejność wykonywania skryptów. Dlatego tmux należy uruchamiać z powłoki logowania w sposób opisany powyżej, a nie ze skryptu, który pomija profil.
iOS: Termius lub Blink Shell
Obie aplikacje obsługują protokoły SSH oraz mosh i przechowują klucze wewnątrz aplikacji. Różnica polega na interfejsie.
Blink Shell jest sterowany poleceniami. W wierszu poleceń wpisuje się ssh you@server lub mosh you@server, używając składni identycznej jak w terminalu desktopowym. Ustawienia otwiera się poleceniem config, a sekcja Keys służy do generowania pary kluczy.
Termius jest sterowany formularzami. Należy wypełnić wpis hosta, a następnie w szczegółach hosta zmienić protokół z SSH na Mosh. Termius dostarcza własną implementację mosh i wspiera wersję 1.3.0 oraz nowsze, więc na serwerze nadal musi być zainstalowany pakiet mosh.
W obu przypadkach klucz należy wygenerować wewnątrz aplikacji; nigdy nie należy kopiować istniejącego klucza prywatnego na telefon. Aplikacja wyświetli część publiczną klucza, którą należy dodać do pliku ~/.ssh/authorized_keys na serwerze. Artykuł Klucze SSH dla poszczególnych urządzeń i sposób ich unieważniania opisuje nazewnictwo oraz procedurę unieważniania, co w przypadku telefonu jest ważniejsze niż w przypadku laptopa.
Należy włączyć w aplikacji terminala własną blokadę biometryczną lub kod dostępu. Bez tego odblokowany telefon stanowi otwartą powłokę do serwera przez cały czas, gdy ekran pozostaje aktywny.
Android: Termux
pkg upgrade
pkg install openssh mosh
ssh-keygen -t ed25519 -C "pixel"
cat ~/.ssh/id_ed25519.pubTermux udostępnia pakiety OpenSSH oraz mosh we własnym repozytorium, dzięki czemu ssh, ssh-keygen oraz mosh działają w sposób identyczny jak na komputerze stacjonarnym. Należy dodać wyświetlony wiersz klucza publicznego do pliku ~/.ssh/authorized_keys na serwerze, a następnie nawiązać połączenie za pomocą mosh you@server.
Ekranowa klawiatura systemu Android nie posiada klawiszy Esc oraz Ctrl, które są niezbędne do pracy z Claude Code. Termux pozwala na wyświetlenie własnego paska klawiszy. Należy umieścić poniższą linię w pliku ~/.termux/termux.properties:
extra-keys = [['ESC','|','/','HOME','UP','END','PGUP'],['TAB','CTRL','ALT','LEFT','DOWN','RIGHT','PGDN']]Następnie należy wykonać polecenie termux-reload-settings, aby pasek pojawił się nad klawiaturą. To samo przeładowanie pozwala na załadowanie czcionki o stałej szerokości znaków (TrueType) umieszczonej w ~/.termux/font.ttf.
System Android może zatrzymać proces Termux działający w tle, co w tym przypadku skutkuje jedynie koniecznością ponownego połączenia. Sesja oraz agent pozostają aktywne na serwerze.
Dlaczego terminal zawiesza się po wyjściu z zasięgu Wi-Fi i co naprawia mosh?
Połączenie SSH to połączenie TCP (transmission control protocol), które jest identyfikowane przez oba adresy oraz oba porty. Wyjście poza zasięg Wi-Fi powoduje, że telefon otrzymuje nowy adres w sieci komórkowej, przez co stare połączenie przestaje być rozpoznawane przez obie strony. Żaden mechanizm nie informuje o tym fakcie. Terminal po prostu przestaje odpowiadać, dopóki stos TCP nie zrezygnuje, a następnie ssh wyświetla client_loop: send disconnect: Broken pipe. Aby natychmiast przerwać zawieszoną sesję, należy nacisnąć Enter, następnie ~, a na końcu ..
mosh (mobile shell) eliminuje ten tryb awarii. Narzędzie to wykorzystuje SSH do zalogowania się i uruchomienia procesu mosh-server, odczytuje port UDP (user datagram protocol) wybrany przez serwer, a następnie zamyka połączenie SSH. Od tego momentu obie strony wymieniają datagramy UDP uwierzytelnione wspólnym kluczem sesji, więc sesja jest identyfikowana przez ten klucz, a nie przez adres IP. Zmiana adresu nie przerywa połączenia. mosh lokalnie wyświetla wpisywane znaki i odświeża ekran, gdy stan serwera jest inny, co zapewnia użyteczność połączenia nawet przy wolnym łączu mobilnym.
mosh korzysta z portów UDP z zakresu od 60000 do 61000, dlatego należy otworzyć ten zakres:
sudo ufw allow 60000:61000/udp
sudo ufw statusOtwieranie portów za pomocą ufw zawiera pozostałe informacje dotyczące zapory sieciowej. Jeśli dostawca oferuje oddzielną zaporę sieciową w panelu sterowania, należy dodać ten sam zakres również tam, ponieważ reguła ufw nie wpływa na filtr działający przed maszyną.
Często występują dwa problemy z mosh. Logowanie, które kończy się sukcesem, a następnie zawiesza, wyświetlając Nothing received from server on UDP port 60001., oznacza, że zakres UDP jest blokowany gdzieś pomiędzy telefonem a serwerem. Połączenie zgłaszające mosh-server not found oznacza, że pakiet nie jest zainstalowany na serwerze lub brakuje go w PATH logowania. Należy go zainstalować lub wskazać bezpośrednio za pomocą mosh --server=/usr/bin/mosh-server you@server.
mosh odmawia również uruchomienia, gdy locale logowania nie jest ustawione na UTF-8, o czym informuje komunikatem: mosh-server needs a UTF-8 native locale to run.. Locale należy naprawić na serwerze, a nie na telefonie.
locale
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8Istnieją dwie funkcje, których mosh nie obsługuje. Zgodnie z plikiem README, mosh nie wspiera przekierowania X ani nieinteraktywnych zastosowań SSH, w tym przekierowania portów, dlatego podgląd aplikacji webowej uruchomionej przez Claude Code nadal wymaga użycia standardowego ssh -L 8080:127.0.0.1:8080 you@server. Narzędzie synchronizuje również tylko widoczny obszar ekranu, więc nie posiada własnego bufora przewijania. To ograniczenie nie stanowi problemu, ponieważ tmux przechowuje historię: Ctrl-b, a następnie [ uruchamia tryb kopiowania, przewijanie odbywa się za pomocą myszy lub klawiszy strzałek, a q kończy pracę w tym trybie.
Dostosowanie ekranu telefonu do pracy
Cztery linie w ~/.tmux.conf na serwerze wykonują większość pracy:
set -g mouse on
set -g status-position top
set -g default-terminal "tmux-256color"
set -g history-limit 20000mouse on zmienia przeciągnięcie dotykiem w przewijanie, a stuknięcie w wybór panelu lub okna, co zastępuje większość niewygodnych w wpisywaniu klawiszy prefiksu. status-position top przesuwa linię statusu tmux z dolnej krawędzi, gdzie jest zasłaniana przez klawiaturę ekranową i pasek sugestii. default-terminal jest istotne, ponieważ w przeciwnym razie tmux zgłasza terminal screen do Claude Code, co pogarsza wyświetlanie kolorów i ramek. Jeśli tmux odmawia uruchomienia z błędem missing or unsuitable terminal: tmux-256color, oznacza to brak wpisu terminfo: sudo apt install ncurses-term.
Wystarczy opanować cztery klawisze, aby praca stała się komfortowa.
Escprzerywa działanie Claude w trakcie odpowiedzi, zachowując już wykonaną pracę, dlatego warto mieć ten klawisz najbliżej kciuka.Ctrl+Crównież przerywa bieżącą operację. W stanie oczekiwania pierwsze naciśnięcie czyści dane wejściowe, a drugie zamyka Claude Code, jest to więc bardziej radykalne narzędzie.Escnaciśnięty dwukrotnie czyści szkic zapytania, a przy pustym wierszu otwiera menu przewijania (rewind).- W przypadku zapytań wieloliniowych należy wpisać
\, a następnie nacisnąć Enter. Ta metoda działa w każdym terminalu. Skrót Shift+Enter jest natywnie obsługiwany tylko przez nieliczne terminale desktopowe, wśród których nie ma klientów mobilnych.
Należy unikać dzielenia paneli. Telefon w orientacji pionowej ma około 40 kolumn szerokości, więc podział pionowy pozostawia 20 kolumn na panel, co powoduje, że każdy diff staje się nieczytelny przez zawijanie wierszy. Zamiast tego należy używać okien tmux: Ctrl-b c tworzy nowe okno, a Ctrl-b n przełącza na kolejne. Jeśli w drugim oknie zostanie uruchomiona osobna sesja Claude Code, obie sesje mogą bezpośrednio przekazywać sobie zadania, co eliminuje konieczność kopiowania tekstu między oknami na ekranie dotykowym. W razie potrzeby dokładnego przeanalizowania diffa należy obrócić telefon do orientacji poziomej.
Warto świadomie określić, ile tekstu pojawia się na ekranie, ponieważ styl wyjściowy modyfikuje prompt systemowy przed każdą odpowiedzią, a bardziej zwięzły styl oznacza mniej ekranów do przewijania na telefonie.
Długa sesja na małym ekranie to przede wszystkim wyzwanie związane z kontekstem, dlatego warto przeczytać zarządzanie oknem kontekstu Claude Code przed próbą wykonywania całodniowej pracy w podróży.
Zabezpieczenie: tylko klucze, bez haseł
Telefon przechowuje teraz klucz do maszyny, która edytuje kod i wykonuje polecenia. Wyłącz uwierzytelnianie hasłem. Plik typu drop-in jest bezpieczniejszy niż bezpośrednia edycja sshd_config, ponieważ plik sshd_config w systemie Ubuntu zawiera na początku dyrektywę /etc/ssh/sshd_config.d/*.conf, a system przyjmuje pierwszą napotkaną wartość dla danego ustawienia.
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 sshNarzędzie sshd -t analizuje konfigurację i nie wyświetla żadnych komunikatów, jeśli jest ona poprawna. Pomiń ten krok, a jeden błąd w pisowni sprawi, że sshd nie przeładuje się poprawnie. Pozostaw aktywną bieżącą sesję i przetestuj połączenie z drugiego terminala przed zamknięciem czegokolwiek, ponieważ błędny klucz skutkuje błędem Permission denied (publickey)., a przy wyłączonych hasłach nie ma możliwości powrotu. Jedyną drogą odzyskania dostępu w takiej sytuacji jest konsola dostawcy usług.
Przypisz każdemu urządzeniu osobny klucz. Utrata telefonu oznacza wtedy usunięcie tylko jednej linii z pliku ~/.ssh/authorized_keys, podczas gdy laptop zachowuje dostęp. Współdzielenie jednego klucza wymusza jego zmianę na każdym posiadanym urządzeniu.
Jeśli przenosisz SSH na inny port w systemie Ubuntu 24.04, pamiętaj, że nasłuchiwanie należy do ssh.socket, więc sama linia Port nic nie zmieni. Uruchom sudo systemctl edit ssh.socket, wyczyść domyślne ustawienie za pomocą pustej linii ListenStream=, a następnie ustaw port w kolejnej linii. Artykuł Hardening SSH on a VPS omawia to zagadnienie oraz pozostałe aspekty bezpieczeństwa.
Narzędzie fail2ban for SSH zapewnia niewielki wzrost bezpieczeństwa po wyłączeniu haseł, ponieważ odgadnięte hasło i tak nie zostanie zaakceptowane. Jego główną zaletą jest ograniczenie liczby wpisów w logach, co ułatwia identyfikację rzeczywistych prób logowania.
Silniejszym rozwiązaniem jest ukrycie SSH przed publicznym Internetem. Umieść serwer za własnym serwerem VPN WireGuard, uruchamiaj tunel na telefonie w razie potrzeby i skonfiguruj sshd tak, aby nasłuchiwał na ListenAddress tylko wewnątrz tunelu. Narzędzie mosh działa przez tunel, ponieważ obie strony wykorzystują protokół UDP. Uwaga: tunel zwiększa narzut pakietów, więc jeśli duże transfery ulegają zawieszeniu, zmniejsz wartość MTU (maximum transmission unit) w konfiguracji WireGuard na telefonie.
Ostatnia uwaga dotycząca pracy w ten sposób. Z poziomu telefonu zatwierdzasz monity o uprawnienia na ekranie wyświetlającym jednocześnie tylko kilka linii różnic (diff). Jest to powód, by zachować mechanizmy ochronne, zamiast je wyłączać. Artykuł Running Claude Code safely on a VPS omawia limity użytkowników i katalogów, które warto ustawić, zanim głównym sposobem dostępu stanie się ekran dotykowy.
When you reattach and something is wrong
tmux attach printing no server running on /tmp/tmux-1000/default means the tmux server is gone, which nearly always means the machine rebooted. Check with uptime. Kernel updates from automatic security updates reboot the box, and a rebooted box has no tmux session, so treat any Claude Code run as something you can restart.
can't find session: claude is different. The tmux server is running but that name is not there. tmux ls shows what does exist.
If you attach and find a plain shell prompt where Claude Code used to be, the process ended without the session ending. Look at dmesg -T | tail for a line like Out of memory: Killed process 4821 (claude), which is what a box below the 4 GB requirement does during a large edit. No such line means Claude Code exited on its own, and the shell's scrollback above the prompt holds the reason.
A window that comes back tiny, with unused space around it, means two clients are attached at different sizes, because tmux sizes a window to fit the smallest attached client. Your laptop is still holding the session at 200 columns wide while the phone asks for 40. Detach the others as you attach: tmux attach -d -t claude.
FAQ
Czy mogę uruchomić Claude Code bezpośrednio na telefonie zamiast na VPS?
Nie. Obsługiwane platformy na lipiec 2026 to macOS, Windows, Ubuntu 20.04 lub nowsze, Debian 10 lub nowsze oraz Alpine 3.19 lub nowsze, przy założeniu posiadania co najmniej 4 GB pamięci RAM. Android oraz iOS nie znajdują się na tej liście. Telefon ponadto usypia aplikacje i stale zmienia adres sieciowy, co uniemożliwia długotrwałe działanie agenta. Należy uruchomić go na serwerze, a telefon wykorzystać jedynie jako wyświetlacz.
Czy sesja przetrwa zamknięcie aplikacji lub utratę sygnału?
Tak, za ten proces odpowiadają dwa niezależne elementy. tmux utrzymuje proces działający na serwerze, dzięki czemu nic nie zostaje przerwane po zakończeniu połączenia. mosh utrzymuje samo połączenie w trakcie zmiany adresu, więc przełączenie z Wi-Fi na dane mobilne nie wymaga nawet ponownego logowania. W przypadku zwykłego SSH bez tmux, zerwane połączenie wysyła sygnał SIGHUP, a Claude Code zatrzymuje się w trakcie zadania.
Dlaczego mosh łączy się, ale nic nie wyświetla?
Logowanie, które kończy się sukcesem, a następnie zawiesza z Nothing received from server on UDP port 60001., oznacza, że porty UDP od 60000 do 61000 nie są otwarte. Należy dodać ten zakres w ufw oraz ponownie w zaporze sieciowej dostawcy, która w większości paneli zarządzania stanowi oddzielny element. Jeśli mosh zgłasza, że mosh-server nie został znaleziony, na serwerze brakuje pakietu: sudo apt install mosh.
Jak przerwać działanie Claude Code z klawiatury bez klawisza Esc?
Należy dodać pasek klawiszy funkcyjnych. Termux konfiguruje go za pomocą extra-keys w ~/.termux/termux.properties, natomiast Termius i Blink posiadają pasek, który można edytować w ustawieniach. Esc przerywa trwającą odpowiedź, zachowując wykonaną już pracę. Ctrl+C również przerywa działanie, jednak dwukrotne naciśnięcie go w stanie bezczynności powoduje wyjście z Claude Code, dlatego w pierwszej kolejności należy używać Esc.
Czy wystawienie SSH na świat jest wystarczająco bezpieczne?
Przy wyłączonym uwierzytelnianiu hasłem, jedynym skutecznym poświadczeniem jest klucz, który nigdy nie opuszcza urządzeń, co stanowi akceptowalne ryzyko w przypadku maszyny, którą można odtworzyć. Każdemu urządzeniu należy przypisać osobny klucz, aby utrata telefonu wiązała się jedynie z usunięciem jednej linii w authorized_keys. Jeśli nie chcesz wystawiać portu publicznie, umieść serwer za WireGuard i skonfiguruj sshd tak, aby nasłuchiwał na adresie tunelu.