SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 已更新 2026-08-27

如何用手機執行 Claude Code

Claude Code 在 VPS 的 tmux 中執行,手機只是終端機畫面。本文說明 SSH keys、應對不穩定行動網路的 mosh、tmux attach,以及實用鍵盤設定。

透過手機使用 Claude Code:實際運作方式

透過手機使用 Claude Code 並不是使用行動應用程式。Claude Code 會在 VPS(virtual private server)上執行,並位於持續開啟的 tmux 工作階段中。手機會在你查看畫面的期間,透過 SSH(secure shell)連線到該工作階段。即使關閉應用程式,agent 仍會繼續工作,因為該程序從未在手機上執行。

這種分離就是整體設計。手機作業系統會在你切換離開應用程式幾秒後將其暫停,因此在手機上啟動的長時間工作會停止。你從 wifi 切換到行動數據時,手機也會取得新的網路位址。當程序改在伺服器上執行,而手機只負責顯示畫面時,這兩個問題都能解決。

伺服器需要準備四項內容:用來維持工作階段的 tmux、用來登入的 SSH keys、因應網路變更的 mosh,以及 Claude Code 本身。手機端只需要一個具備可存取按鍵列的 terminal app。

VPS 需要的條件

SSH 和 tmux 部分只需要一台小型 Ubuntu 24.04 主機即可。Claude Code 的需求較高。截至 2026 年 7 月,官方需求是 x64 或 ARM64 處理器上的 Ubuntu 20.04 或更新版本,以及 4 GB 以上的 RAM。1 GB 方案雖然能完成安裝,但在負載升高時,程序會被 kernel 終止。Claude Code 也需要付費的 Claude 帳戶(Pro、Max、Team 或 Enterprise),或具備 API 存取權的 Console 帳戶,因為免費的 Claude.ai 方案不包含這項功能。

請將主機設定為具備 sudo 權限的普通使用者,不要使用 root。如果伺服器是新的,請先完成新 VPS 的前 10 分鐘,因為完成使用者與防火牆設定後,再進行本指南後續的 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,再將代碼帶回終端機;在手機畫面上切換兩個應用程式完成這些步驟會很慢。使用實體鍵盤完成一次即可,憑證會保留在伺服器上。

在 tmux 中啟動 Claude Code,避免連線中斷將其終止

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 連線結束時,核心會將 hangup signal(SIGHUP)傳送給附加至該連線的程序;tmux 伺服器不在其中。未使用 tmux 時,同樣會中斷連線的螢幕鎖定,會讓 Claude Code 在工具呼叫進行到一半時停止。在 VPS 內的 tmux 中執行 Claude Code 會更深入說明工作階段配置。

請在伺服器上執行 tmux,不要在手機上執行。在已附加的工作階段內輸入 tmux 會輸出 sessions should be nested with care, unset $TMUX to force;若強制執行,則會有兩組 prefix key 互相衝突。

每次登入時自動附加

在觸控鍵盤上輸入 attach 指令很快就會變得麻煩。將以下內容放在伺服器上的 ~/.profile 末尾:

if command -v tmux >/dev/null 2>&1 && [ -z "$TMUX" ] && [ -t 1 ]; then
  exec tmux new-session -A -s claude
fi

如果名為 claude 的工作階段存在,new-session -A -s claude 會附加至該工作階段;如果不存在,則會建立該工作階段,因此同一個指令即可處理這兩種情況。exec 會以 tmux 取代登入 shell,因此離開 tmux 後連線會關閉,不會回到沒有內容的提示字元。需要一般 shell 時,略過此檔案:ssh you@server -t "bash --noprofile"

請將它放在 ~/.profile,不要放在 ~/.bashrc~/.bashrc 也會在非互動式工作階段中執行,因此檔案傳輸會中斷:scpsftp 會將非預期輸出當作通訊協定資料讀取,並以 Received message too long 失敗。~/.profile 只會在登入 shell 中執行,這正是互動式 SSH 工作階段的情況。

~/.profile 也是 Ubuntu 將 ~/.local/bin 加入 PATH 的位置。如果登入後立即執行 claude 沒有問題,但 tmux 內的 shell 顯示 command not found,原因就是這個載入順序。因此,請如上所述從登入 shell 啟動 tmux,不要從略過 profile 的 script 啟動。

這兩個應用程式都支援 SSH 和 mosh,也都會在應用程式中儲存金鑰。兩者的差異在於介面。

Blink Shell 以命令操作為主。在提示字元中輸入 ssh you@servermosh you@server,語法與桌面終端機相同。輸入 config 可開啟設定,並在 Keys 區段建立金鑰組。

Termius 以表單操作為主。先填寫主機項目,再在主機詳細資料中將該主機的連線方式從 SSH 切換為 Mosh。Termius 內建 mosh 實作,並支援 mosh 1.3.0 及更新版本,因此伺服器仍需安裝 mosh 套件。

無論使用哪個應用程式,都應在應用程式內產生金鑰,絕不要將既有的私密金鑰複製到手機。應用程式會顯示公開金鑰部分;這是一行文字,請將它加入伺服器上的 ~/.ssh/authorized_keys每台裝置的 SSH 金鑰與撤銷方式說明命名及撤銷步驟。對手機而言,這比對筆電更重要。

請啟用終端機應用程式本身的生物辨識或密碼鎖定功能。否則,只要螢幕保持喚醒,未鎖定的手機就等同於在伺服器上開啟的 shell。

Android:Termux

pkg upgrade
pkg install openssh mosh
ssh-keygen -t ed25519 -C "pixel"
cat ~/.ssh/id_ed25519.pub

Termux 會在自己的儲存庫中提供 OpenSSH 和 mosh 套件,因此 sshssh-keygenmosh 的行為與桌面環境相同。將顯示的公開金鑰行加入伺服器上的 ~/.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/font.ttf 的等寬 TrueType 字型。

Android 可能會在 Termux 位於背景時停止它;在此情境下,代價只有重新連線。工作階段和代理程式都在伺服器上。

為什麼離開 Wi-Fi 後終端機會凍結?mosh 解決了什麼問題?

SSH 連線使用 TCP (transmission control protocol),而 TCP 連線由兩端的位址與連接埠共同識別。離開 Wi-Fi 覆蓋範圍後,手機會從行動網路取得新的位址,因此舊連線在兩端都找不到對應項目。系統不會通知你這件事。終端機只會停止回應,直到 TCP 放棄連線,接著 ssh 顯示 client_loop: send disconnect: Broken pipe。若要立即終止凍結的工作階段,請依序按下 Enter~.

mosh (mobile shell) 可避免這種連線失效。它先使用 SSH 登入並啟動 mosh-server 程序,讀取伺服器選定的 UDP (user datagram protocol) 連接埠,然後關閉 SSH 連線。之後,兩端會使用共用的工作階段金鑰交換經驗證的 UDP datagram,因此工作階段是由該金鑰識別,而不是由你的位址識別。位址變更後,工作階段仍可繼續。mosh 也會在本機回應你的輸入,並在伺服器狀態不一致時重新繪製畫面,因此在速度較慢的行動網路上仍可使用。

mosh 使用 60000 到 61000 之間的 UDP 連接埠,因此請開放此範圍:

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 直接指定其位置。

當登入 locale 不是 UTF-8 時,mosh 也會拒絕執行,並顯示:mosh-server needs a UTF-8 native locale to run. 請在伺服器上修正 locale,不要在手機上修正。

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 剛啟動的 Web 應用程式,仍需使用一般的 ssh -L 8080:127.0.0.1:8080 you@server。此外,mosh 只會同步目前可見的畫面,因此本身沒有 scrollback。這項限制在此不會造成問題,因為 tmux 會保留 scrollback:Ctrl-b,接著 [ 進入 copy mode;拖曳或使用方向鍵捲動,按下 q 離開。

讓手機畫面變得可用

伺服器上的 ~/.tmux.conf 中,有 4 行設定負責大部分功能:

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

mouse on 會將觸控拖曳轉換為捲動,並將點選轉換為窗格或視窗選取,取代大多數在手機上難以輸入的 prefix keys。status-position top 會將 tmux 狀態列移離底部邊緣,避免被螢幕鍵盤及其建議列遮住。default-terminal 很重要,因為 tmux 否則會向 Claude Code 宣告 screen 終端機,導致色彩與框線繪製效果不如預期。如果 tmux 隨後因 missing or unsuitable terminal: tmux-256color 而無法啟動,表示缺少 terminfo 項目:sudo apt install ncurses-term

記住 4 個按鍵,其餘操作就會變得順暢。

  • Esc 會中斷 Claude 目前的回應,並保留已完成的工作,因此這是最適合放在拇指附近的按鍵。
  • Ctrl+C 也會中斷正在執行的操作。在閒置提示字元下,第一次按下會清除輸入,第二次按下則會退出 Claude Code,因此它是較強硬的工具。
  • 連按兩次 Esc 會清除草稿提示;在空白提示字元下,則會改為開啟 rewind 選單。
  • 若要輸入多行提示,請輸入 \,然後按 Enter。這種形式在所有終端機中都能使用。Shift+Enter 只有少數桌面終端機原生支援,行動版用戶端不在其中。

避免使用分割窗格。手機直向時寬度約為 40 欄,因此垂直分割後每個窗格只有 20 欄,所有 diff 都會換行成難以閱讀的雜訊。請改用 tmux 視窗:Ctrl-b c 會建立視窗,Ctrl-b n 會切換到下一個視窗。如果第二個視窗最後執行了自己的 Claude Code 工作階段,兩個工作階段可以直接互相交接工作,不必在觸控螢幕上於視窗之間複製文字。需要仔細閱讀 diff 時,請將手機轉為橫向。

值得刻意設定顯示在畫面上的文字量,因為輸出樣式會在每次回覆前修改系統提示,而較精簡的樣式代表在手機上需要滑過的畫面更少。

在小螢幕上執行長時間工作階段,主要問題是 context,因此在嘗試從火車上執行一整天的工作前,值得先閱讀管理 Claude Code context window

僅允許金鑰登入,不使用密碼

手機現在持有一把可登入機器的金鑰,而這台機器能編輯你的程式碼並執行命令。請關閉密碼驗證。使用 drop-in 檔案比直接編輯 sshd_config 更安全,因為 Ubuntu 的 sshd_config 會在頂端載入 /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 ssh

sshd -t 會解析設定檔,設定有效時不會輸出任何內容。若跳過這一步,任何拼字錯誤都會導致 sshd 重新載入失敗。請保留目前的工作階段,並在關閉任何連線前,從第二個連線進行測試。這是因為金鑰錯誤會讓你收到 Permission denied (publickey).;關閉密碼驗證後,也沒有其他登入方式可用。此時只能使用服務供應商提供的主控台進行復原。

請為每個裝置使用專屬金鑰。手機遺失時,只需從 ~/.ssh/authorized_keys 刪除一行,筆記型電腦仍可繼續使用。若所有裝置共用一把金鑰,之後就必須在每台裝置上更換金鑰。

如果你在 Ubuntu 24.04 上將 SSH 移至其他連接埠,請注意監聽器屬於 ssh.socket,因此單獨加入 Port 行不會產生作用。請執行 sudo systemctl edit ssh.socket,使用空白的 ListenStream= 清除預設值,再在下一行設定你的連接埠。強化 VPS 上的 SSH 會說明這項設定及其他防護措施。

用於 SSH 的 fail2ban 在關閉密碼驗證後只能增加有限的安全性,因為系統根本不會接受猜測的密碼。它能做的是讓日誌更簡潔,方便你發現真正的登入嘗試。

更強的做法是讓 SSH 不暴露在公開網際網路上。將伺服器置於自行託管的 WireGuard VPN 後方,在需要時於手機啟用通道,並只在通道上為 sshd 指定 ListenAddress。mosh 可透過通道運作,因為兩端都使用 UDP。請注意,通道會增加封包額外負荷。因此,如果大型傳輸停滯,請在手機的 WireGuard 設定中降低 MTU(maximum transmission unit,最大傳輸單位)。

最後補充一點這種工作方式的注意事項。使用手機時,你會在一次只能顯示幾行差異的畫面上核准權限提示。這正是應保留防護機制,而不是將其關閉的理由。在 VPS 上安全執行 Claude Code 會說明在主要登入方式改為觸控螢幕前,值得設定的使用者與目錄限制。

重新連線後發現異常

tmux attach 輸出 no server running on /tmp/tmux-1000/default 表示 tmux server 已消失,這幾乎都代表機器曾重新開機。使用 uptime 檢查。自動安全更新 安裝 kernel 更新後會重新啟動機器,而重新開機的機器不會保留 tmux session。因此,應將任何 Claude Code 執行工作視為可重新啟動的工作。

can't find session: claude 的情況不同。tmux server 仍在執行,但找不到該名稱。tmux ls 會列出目前存在的項目。

如果重新連線後看到的是一般 shell prompt,而原本的 Claude Code 已不在,表示程序已結束,但 session 尚未結束。查看 dmesg -T | tail,尋找類似 Out of memory: Killed process 4821 (claude) 的行。低於 4 GB 要求的機器在進行大型編輯時會出現這種情況。如果沒有該行,表示 Claude Code 自行結束;shell prompt 上方的 scrollback 內容會保留原因。

如果視窗恢復後變得很小,周圍留下未使用的空間,表示有兩個 client 以不同大小連線,因為 tmux 會將視窗調整為符合最小的已連線 client。你的筆電仍以 200 columns 寬度保留該 session,但手機要求 40 columns。連線時一併中斷其他 client:tmux attach -d -t claude

FAQ

我可以直接在手機上執行 Claude Code,而不是在 VPS 上執行嗎?

不行。截至 July 2026,支援的平台包括 macOS、Windows、Ubuntu 20.04 或更新版本、Debian 10 或更新版本,以及 Alpine 3.19 或更新版本,且需要 4 GB 以上的 RAM。Android 和 iOS 不在支援清單中。手機也會讓應用程式進入睡眠狀態,且網路位址經常變更,這些情況都無法滿足長時間執行 agent 的需求。請在伺服器上執行,並將手機作為顯示器使用。

如果我關閉應用程式或失去訊號,工作階段會保留嗎?

會,這由兩個獨立元件處理。tmux 會讓程序繼續在伺服器上執行,因此連線中斷時不會停止。mosh 會讓連線本身在網路位址變更後繼續運作,因此從 wifi 切換到行動數據時,甚至不需要重新連線。若只使用 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

沒有 Esc 鍵時,如何使用鍵盤中斷 Claude Code?

請加入一列按鍵。Termux 可在 ~/.termux/termux.properties 中使用 extra-keys 設定按鍵列;Termius 和 Blink 也都提供可在設定中編輯的按鍵列。Esc 會中斷正在執行的回應,並保留已完成的工作。Ctrl+C 也能中斷工作,但在閒置提示字元下按兩次會結束 Claude Code,因此請優先使用 Esc

將 SSH 開放到網際網路上,安全性是否足夠?

關閉密碼驗證後,唯一可能驗證成功的憑證是始終不離開裝置的金鑰。對於可以重建的主機而言,這是合理的風險。請讓每台裝置使用自己的金鑰,這樣手機遺失時,只需移除 authorized_keys 中的一行。如果不想在公開連接埠上接受 SSH 連線,可以將主機置於 WireGuard 後方,並讓 sshd 監聽 tunnel 位址。