スマホでClaude Codeを使う方法
Claude CodeをVPSのtmuxで実行し、スマホはSSH画面として使います。SSH keys、通信が不安定なときのmosh、tmux attach、入力しやすいkey rowの設定を解説します。
スマートフォンから Claude Code を使う仕組み
スマートフォンから Claude Code を使う場合、モバイルアプリ上で実行しているわけではありません。Claude Code は VPS(仮想プライベートサーバー)上の tmux セッション内で実行されます。スマートフォンは、画面を表示している間、そのセッションへの SSH(セキュアシェル)接続を開きます。アプリを閉じてもエージェントは処理を続けます。プロセスはスマートフォン上で実行されていないためです。
この分離が設計の中心です。スマートフォンの OS は、アプリから切り替えて数秒後にそのアプリを一時停止します。そのため、スマートフォンで開始した長時間の処理は停止します。また、Wi-Fi からモバイルデータ通信へ移動すると、ネットワークアドレスも変わります。プロセスをサーバー上で実行し、スマートフォンでは画面だけを表示すれば、どちらの問題も解消できます。
サーバーには、セッションを保持する tmux、接続に使用する SSH keys、ネットワーク変更に対応する mosh、そして Claude Code の4つが必要です。スマートフォン側には、key row にアクセスできる端末アプリが1つ必要です。
VPS に必要なもの
SSH と tmux だけなら、小規模な Ubuntu 24.04 の環境で十分です。Claude Code には、より多くのリソースが必要です。2026年7月時点の公式要件は、x64 または ARM64 プロセッサー上の Ubuntu 20.04 以降と、4 GB 以上の RAM です。1 GB のプランでもインストールはできますが、負荷がかかるとカーネルによってプロセスが終了されます。Claude Code の利用には、有料の Claude アカウント(Pro、Max、Team、Enterprise)または API access を有効にした Console アカウントも必要です。無料の Claude.ai プランには含まれていません。
VPS は root ではなく、sudo を使える通常ユーザーとして構成してください。サーバーが新しい場合は、まず 新しい 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 は、セッションを開始せずにインストールと設定の診断情報を出力します。
スマートフォンに頼る前に、ノートパソコンから今すぐ1度ログインしてください。プロジェクトディレクトリで claude を実行し、ログインプロンプトに従います。ブラウザーで URL を開き、コードをターミナルに戻って入力する手順です。スマートフォンの画面で2つのアプリを切り替えながら行うと時間がかかります。実際のキーボードで1度実施すれば、認証情報はサーバーに保持されます。
Claude Code を tmux 内で起動し、接続切断による終了を防ぐ
tmux new -s claude
cd ~/projects/api
claudeCtrl-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) のようにセッションごとに 1 行を表示します。tmux attach -t claude を実行すると、中断した位置に正確に戻ります。編集途中の状態も保持されます。
これは、tmux が独自のサーバープロセスを実行し、シェルと Claude Code が sshd ではなく、そのサーバーの子プロセスとして動作するためです。SSH 接続が終了すると、カーネルはその接続にアタッチされたプロセスへハングアップシグナル SIGHUP を送ります。tmux サーバーはその対象ではありません。tmux を使わない場合、接続を切断する画面ロックによって、ツール呼び出しの途中でも Claude Code が停止します。tmux 内で VPS 上の Claude Code を実行するでは、セッション構成を詳しく説明しています。
tmux はサーバー上で実行し、スマートフォン上では実行しないでください。すでにアタッチしているセッション内で tmux と入力すると sessions should be nested with care, unset $TMUX to force と表示されます。強制的に実行すると、操作対象のプレフィックスキーが 2 つになり、競合します。
すべてのログインで自動的に接続する
タッチキーボードで attach コマンドを入力し続けるのは面倒です。サーバー上の ~/.profile の末尾に、次の内容を追加します。
if command -v tmux >/dev/null 2>&1 && [ -z "$TMUX" ] && [ -t 1 ]; then
exec tmux new-session -A -s claude
finew-session -A -s claude は claude という名前のセッションが存在すれば接続し、存在しなければ作成します。そのため、どちらの場合も 1 つのコマンドで対応できます。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 に追加する 1 行です。デバイスごとの SSH 鍵と 1 つを無効化する方法では、命名方法と無効化手順を説明しています。これらはノート PC よりもスマートフォンで重要です。
ターミナルアプリ自体の生体認証またはパスコードロックを有効にしてください。これがないと、スマートフォンのロックが解除されている間、画面が点灯している限り、誰でもサーバー上のシェルを操作できます。
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 に次の1行を追加します。
extra-keys = [['ESC','|','/','HOME','UP','END','PGUP'],['TAB','CTRL','ALT','LEFT','DOWN','RIGHT','PGDN']]次に termux-reload-settings を実行すると、キーボードの上にキー列が表示されます。同じ再読み込みで、~/.termux/font.ttf に配置した monospace TrueType フォントも読み込まれます。
Android は Termux がバックグラウンドにあると停止することがあります。この場合の影響は再接続だけです。セッションとエージェントはサーバー上で動作しています。
WiFi から離れると端末が固まり、mosh で解決できるのはなぜですか?
SSH 接続は TCP (transmission control protocol) 接続です。TCP 接続は、双方のアドレスと双方のポートによって識別されます。WiFi の通信範囲から出ると、スマートフォンはモバイルネットワークから新しいアドレスを取得するため、以前の接続はどちら側でも一致しなくなります。この変更は通知されません。TCP が諦めるまで端末は応答しなくなり、その後 ssh が client_loop: send disconnect: Broken pipe を表示します。固まったセッションをすぐ終了するには、Enter、次に ~、最後に . を押します。
mosh (mobile shell) はこの障害を回避します。最初に SSH を使ってログインし、mosh-server プロセスを起動します。続いて、サーバーが選択した UDP (user datagram protocol) ポートを読み取り、SSH 接続を閉じます。その後、双方は共有セッションキーで認証した UDP データグラムを交換します。これにより、セッションはアドレスではなく、そのキーで識別されます。アドレスが変わっても、そのまま接続を継続できます。mosh は入力内容をローカルでも表示し、サーバー側と異なる場合は画面を再描画します。そのため、低速なモバイル回線でも操作を続けられます。
mosh は 60000 から 61000 の UDP ポートを使用するため、この範囲を開放します。
sudo ufw allow 60000:61000/udp
sudo ufw statusufw でポートを開放する に、ファイアウォール設定の詳細があります。プロバイダーのコントロールパネルに別のネットワークファイアウォールがある場合は、そちらにも同じ範囲を追加してください。ufw のルールは、サーバーの前段にあるフィルターには影響しないためです。
mosh では、2 つの障害がよく発生します。ログインには成功した後で処理が停止し、Nothing received from server on UDP port 60001. と表示される場合は、電話とサーバーの間のどこかで UDP ポート範囲がブロックされています。mosh-server not found と表示される場合は、サーバーにパッケージがないか、ログイン時の PATH に含まれていません。インストールするか、mosh --server=/usr/bin/mosh-server you@server で直接指定してください。
ログイン時のロケールが UTF-8 でない場合も、mosh は起動せず、次のように表示します: 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 には、できないことも 2 つあります。README によると、mosh は X forwarding と、port forwarding を含む SSH の非対話的な用途をサポートしていません。そのため、Claude Code が起動した Web アプリをプレビューするには、通常の ssh -L 8080:127.0.0.1:8080 you@server が必要です。また、mosh が同期するのは表示中の画面だけであり、独自のスクロールバックはありません。ただし、この制限はここでは問題になりません。スクロールバックは tmux が保持するためです: 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 20000mouse on は、タッチ操作でのドラッグをスクロールに、タップをペインまたはウィンドウの選択に変換します。入力しにくい prefix キーの多くを使わずに済みます。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も実行中の操作を中断します。入力待ちのプロンプトでは、1 回目の入力で内容を消去し、2 回目の入力で Claude Code を終了します。そのため、より強い操作です。Escを 2 回入力すると、下書きのプロンプトを消去します。空のプロンプトでは、代わりに巻き戻しメニューを開きます。- 複数行のプロンプトを入力する場合は、
\を入力してから Enter を押します。この方法はすべての端末で使えます。Shift+Enter が標準で使えるのは一部のデスクトップ端末だけで、モバイルクライアントは含まれません。
分割ペインは避けてください。縦向きのスマートフォンは横幅が約 40 列しかないため、縦分割すると各ペインが 20 列になり、すべての diff が折り返されて読みにくくなります。代わりに tmux のウィンドウを使います。Ctrl-b c でウィンドウを作成し、Ctrl-b n で次のウィンドウへ移動します。2 つ目のウィンドウで別の Claude Code セッションを実行する場合は、2 つのセッションで直接作業を受け渡せます。タッチスクリーン上でウィンドウ間のテキストをコピーする必要はありません。diff を正確に読む必要があるときは、スマートフォンを横向きにしてください。
画面に表示されるテキスト量は意図的に設定する価値があります。出力スタイルはすべての返信の背後にあるシステムプロンプトを編集するため、より簡潔なスタイルにすると、スマートフォンでスクロールして読み飛ばす画面数を減らせます。
小さな画面で長時間セッションを実行する場合、主な問題はコンテキストです。そのため、列車内で 1 日分の作業を実行する前に、Claude Code のコンテキストウィンドウの管理を読むことをお勧めします。
キーのみを使用し、パスワード認証を無効にする
このスマートフォンには、コードを編集してコマンドを実行するマシンへの鍵が保存されています。パスワード認証を無効にしてください。sshd_configを直接編集するより、drop-in ファイルを使うほうが安全です。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 sshsshd -tは設定を解析し、問題がなければ何も出力しません。これを省略すると、1 文字の誤りだけで再読み込み時にsshdが失敗します。現在の接続は開いたままにし、何かを閉じる前に別の接続からテストしてください。鍵を誤るとPermission denied (publickey).になり、パスワードを無効にしている場合は代替手段がありません。その場合の復旧手段は、プロバイダーのコンソールです。テスト接続に失敗した場合は、ssh -vで再接続し、最初のセッションが開いている間に修正してください。その 1 つのエラーメッセージには 5 種類の異なる障害が含まれており、詳細出力から該当する障害を特定できます。
デバイスごとに専用の鍵を用意してください。スマートフォンを紛失しても、~/.ssh/authorized_keysから 1 行を削除するだけで済み、ノートパソコンは引き続き使用できます。共有鍵を 1 つだけ使うと、所有するすべてのデバイスで鍵を変更する必要があります。
Ubuntu 24.04 で SSH を別のポートに移す場合、リスナーはssh.socketに属することに注意してください。そのため、Port行だけでは何も変わりません。sudo systemctl edit ssh.socketを実行し、空のListenStream=でデフォルト値をクリアしてから、次の行で使用するポートを設定します。VPS 上で SSH を堅牢化する方法では、この設定とその他の攻撃対象領域について説明しています。
SSH 用の fail2banは、パスワード認証を無効にした後はセキュリティ上の効果が小さくなります。推測したパスワードを受け付けることができないためです。一方で、ログを静かにできるため、実際のログイン試行を見つけやすくなります。
より強固な方法は、SSH をパブリックインターネットから切り離すことです。サーバーを自分でホストする WireGuard VPNの背後に置き、必要なときだけスマートフォンでトンネルを確立し、トンネル上だけで sshd にListenAddressを設定します。両端が UDP を使用するため、mosh はトンネル経由で動作します。ただし、トンネルによってパケットのオーバーヘッドが増えます。大きな転送が停止する場合は、スマートフォンの WireGuard 設定で MTU(maximum transmission unit)を下げてください。
最後に、この方法で作業する場合の注意点です。スマートフォンでは、数行ずつ表示される diff を見ながら権限要求を承認します。これは安全策を無効にする理由ではなく、維持する理由です。セッション開始時の権限モードも確認してください。auto mode は 2026 年 8 月 14 日に Claude Code のデフォルトになります。このモードでは、確認を求めずにファイルを編集します。VPS 上で Claude Code を安全に実行する方法では、主な接続手段がタッチスクリーンになる前に設定しておくべきユーザー制限とディレクトリ制限について説明しています。
再接続したときに問題がある場合
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 自身が終了しています。シェルのプロンプトより上にあるスクロールバックに理由が残っています。
再接続後のウィンドウが小さく、周囲に未使用の空間がある場合、異なるサイズの2つのクライアントが接続されています。tmux は、接続中のクライアントのうち最小のサイズに合わせてウィンドウのサイズを設定します。ノートパソコンはセッションを幅200列で保持していますが、スマートフォンは幅40列を要求しています。他のクライアントをデタッチしながら接続するには、tmux attach -d -t claude を使用します。
FAQ
スマートフォン自体で VPS 上ではなく Claude Code を実行できますか?
いいえ。2026 年 7 月時点でサポートされているプラットフォームは、4 GB 以上の RAM を搭載した macOS、Windows、Ubuntu 20.04 以降、Debian 10 以降、Alpine 3.19 以降です。Android と iOS は含まれていません。スマートフォンはアプリをスリープさせ、ネットワークアドレスも頻繁に変わります。これは長時間のエージェント実行には適しません。サーバー上で実行し、スマートフォンは表示用に使ってください。
アプリを閉じたり、通信が切れたりしてもセッションは維持されますか?
はい。2 つの別々の機能がこれを実現します。tmux はサーバー上でプロセスを実行し続けるため、接続が終了してもプロセスは停止しません。mosh はアドレス変更後も接続自体を維持するため、Wi-Fi からモバイルデータ通信に切り替えても再接続は不要です。tmux なしで通常の SSH を使うと、接続が切れたときに 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 でも中断できますが、入力待ちのプロンプトで 2 回押すと Claude Code が終了します。そのため、まず Esc を使ってください。
この用途で SSH をインターネットに公開しても安全ですか?
パスワード認証を無効にすれば、認証に成功できるのはデバイスから外に出ない鍵だけです。再構築できるマシンであれば、これは妥当なリスクといえます。デバイスごとに専用の鍵を割り当ててください。スマートフォンを紛失しても、authorized_keys の 1 行を削除するだけで済みます。公開ポートでの接続自体を避けたい場合は、マシンを WireGuard の背後に置き、sshd がトンネルのアドレスで待ち受けるようにしてください。