SSD Nodes Learn Hosting plans →
ガイド Matt Connor著者 Matt Connor ・更新日 2026-10-30

スマホでClaude Codeを使う方法

Claude CodeをVPSのtmuxで実行し、スマホはSSH画面として使います。SSH keys、通信が不安定なときのmosh、tmux attach、入力しやすいkey rowの設定を解説します。

スマートフォンからの Claude Code:実際の仕組み

本ガイドでは、スマートフォン上のターミナルアプリを使用します。Claude Code は VPS(仮想専用サーバー)上の tmux セッション内で実行され、このセッションは開いたまま維持されます。スマートフォンからは、画面を表示している間、そのセッションに対して SSH(セキュアシェル)接続を行います。アプリを閉じてもエージェントは動作し続けます。プロセス自体はスマートフォン上で実行されていないためです。

Claude Code はリモートコントロール機能も提供しています。セッション内で /remote-control を実行すると、プロセスをサーバー上で維持したまま、Claude モバイルアプリやブラウザ経由で操作できます。

この分離が設計のすべてです。スマートフォンのオペレーティングシステムは、アプリから切り替えて数秒経つとアプリをサスペンドするため、スマートフォン上で開始した長時間ジョブは停止してしまいます。また、Wi-Fi からモバイルデータ通信に切り替わるたびにネットワークアドレスも変わります。プロセスをサーバー上で実行し、スマートフォンは画面描画のみを行う構成にすることで、これらの問題は解消されます。

サーバー側には、セッションを維持する tmux、接続用の SSH 鍵、ネットワーク変更に対応する mosh、そして Claude Code 本体の 4 つが必要です。スマートフォン側は、操作しやすいキー行を備えたターミナルアプリが 1 つあれば十分です。

VPSに必要なもの

SSHおよびtmuxを利用するだけであれば、小規模な Ubuntu 24.04 サーバーで十分です。Claude Code を利用する場合は、より高いスペックが求められます。2026年10月時点の公式要件は、Ubuntu 20.04 以降、x64 または ARM64 プロセッサ、4 GB 以上の RAM です。また、Claude Code を利用するには、有料の Claude アカウント(Pro、Max、Team、Enterprise)、API アクセス権を持つ Console アカウント、あるいは Amazon Bedrock などのサポートされているクラウドプロバイダー経由のアクセスが必要です。無料の Claude.ai プランでは利用できません。

サーバーは 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 を実行すると、セッションを開始せずにインストール状況と設定の診断結果が表示されます。

スマートフォンでの利用を始める前に、ノートPCから一度ログインしておいてください。プロジェクトディレクトリで claude を実行し、ログインプロンプトに従います。このフローではブラウザで URL を開き、コードをターミナルに戻す操作が必要ですが、スマートフォンの画面で2つのアプリを切り替えるのは手間がかかります。PCのキーボードで一度設定を済ませれば、認証情報はサーバーに保持されます。

Claude Code を tmux 内で起動し、接続切断による終了を防ぐ

tmux new -s claude
cd ~/projects/api
claude

Ctrl-b でデタッチし、続けて d を実行します。tmux は [detached (from session claude)] と表示して、シェルに戻します。これでアプリを閉じても、通信が途切れても、スマートフォンをポケットに入れても問題ありません。ペインでは処理が続きます。

tmux ls
tmux attach -t claude

tmux 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
fi

new-session -A -s claude は、claude という名前のセッションが存在すればそれにアタッチし、存在しなければ新規作成するため、1 つのコマンドで両方のケースに対応できます。exec はログインシェルを tmux に置き換えるため、tmux を終了すると接続も切断され、プロンプトだけが残ることはありません。通常のシェルが必要な場合は、このファイルをスキップしてください:ssh you@server -t "bash --noprofile"。

これを ~/.bashrc ではなく ~/.profile に記述してください。Bash は非対話型の SSH コマンドに対しても ~/.bashrc を読み込みますが、上記の [ -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 に追加する 1 行です。デバイスごとの SSH 鍵と 1 つを無効化する方法では、命名方法と無効化手順を説明しています。これらはノート PC よりもスマートフォンで重要です。

ターミナルアプリ自体の生体認証またはパスコードロックを有効にしてください。これがないと、スマートフォンのロックが解除されている間、画面が点灯している限り、誰でもサーバー上のシェルを操作できます。

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 に次の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 がバックグラウンドにあると停止することがあります。この場合の影響は再接続だけです。セッションとエージェントはサーバー上で動作しています。

Wi-Fiから離れるとターミナルがフリーズするのはなぜですか。また、moshは何を解決しますか。

SSH接続はTCP(transmission control protocol)接続であり、TCP接続は両端のアドレスとポートによって識別されます。Wi-Fiの範囲外に出ると、スマートフォンはモバイルネットワークから新しいアドレスを取得するため、古い接続は両端で一致しなくなります。この状態を通知する仕組みはありません。TCPが諦めるまでターミナルは応答を停止し、その後sshは client_loop: send disconnect: Broken pipe を出力します。フリーズしたセッションを即座に終了するには、Enter を押し、続いて ~、. を押してください。

mosh (mobile shell) はこの障害モードを排除します。moshはSSHを使用して一度ログインし、mosh-server プロセスを開始します。次にサーバーが選択したUDP(user datagram protocol)ポートを読み取り、SSH接続を閉じます。その後、両端は共有セッションキーで認証されたUDPデータグラムを交換するため、セッションはアドレスではなくそのキーによって識別されます。アドレスが変わっても、そのまま通信が継続されます。moshは入力内容をローカルでエコー表示し、サーバーとの不一致があれば再描画を行うため、低速なモバイル回線でも使用可能です。

moshは60000から61000の間のUDPポートを使用するため、この範囲を開放してください。

sudo ufw allow 60000:61000/udp
sudo ufw status

ufwによるポート開放 にファイアウォールの詳細があります。プロバイダーがコントロールパネルで個別のネットワークファイアウォールを提供している場合は、そこでも同じ範囲を追加してください。ufwのルールは、マシンの前段にあるフィルターには影響しないためです。

moshでよくある失敗は2つです。ログインは成功するがその後停止し、Nothing received from server on UDP port 60001. と表示される場合、mosh-server は開始されていますが、クライアントがそのUDPポートでサーバーに到達できていません。これは一般的に、スマートフォンとサーバーの間のどこかにあるファイアウォールが、moshの範囲のUDPをブロックしていることを意味します。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 はクライアントが送信するロケール設定を適用します。サーバー側を修正してもエラーが続く場合は、moshのFAQでも指摘されている通り、スマートフォンのターミナルアプリ側でも LANG をUTF-8の値に設定する必要があるかもしれません mosh-client。

moshが行わないことが2つあります。READMEには、moshはXフォワーディングやポートフォワーディングを含むSSHの非対話的な使用をサポートしていないと記載されています。そのため、Claude Codeが開始したWebアプリをプレビューするには、依然として通常の ssh -L 8080:127.0.0.1:8080 you@server が必要です。また、moshは表示されている画面のみを同期するため、独自のスクロールバックを持ちません。この制限は、tmuxがスクロールバックを保持するため問題になりません。Ctrl-b を押してから [ を押すとコピーモードに入り、ドラッグまたは矢印キーでスクロールでき、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 はタッチドラッグをスクロールに、タップをペインやウィンドウの選択に変換します。これにより、入力が困難なプレフィックスキーの多くを代替できます。status-position top は tmux のステータスラインを画面下部から移動させます。画面下部はオンスクリーンキーボードや予測変換バーに隠れてしまうためです。default-terminal は、tmux が Claude Code に対して通知する端末名を固定します。この行がない場合、tmux はビルド時に選択された名前を通知します。tmux 3.4 の configure スクリプトは screen から開始し、screen-256color、tmux、tmux-256color の順にテストを行います。テストに失敗すると、以前の選択が維持されます。tmux-256color の terminfo エントリが見つからないビルドでは、結果として tmux、screen-256color、または単なる screen が使用され、色や罫線の表示が本来よりも劣化する可能性があります。

以下の4つのキーを覚えれば、残りの操作は快適になります。

  • Esc は Claude の応答を途中で中断し、それまでの作業内容を保持します。親指で最も押しやすい位置に配置すべきキーです。
  • Ctrl+C も実行中の操作を中断します。入力待ち状態で1回押すと入力をクリアし、2回押すと Claude Code を終了します。より強力な停止ツールです。
  • Esc を2回押すとドラフトプロンプトがクリアされます。空のプロンプトで押すと、リワインドメニューが開きます。
  • 複数行のプロンプトを入力する場合は、\ を入力してから Enter を押してください。この形式はすべての端末で動作します。Shift+Enter は一部のデスクトップ端末でのみネイティブ対応しており、モバイルクライアントは含まれません。

画面分割は避けてください。縦向きのスマートフォンは約 40 カラム幅しかないため、垂直分割すると 1 ペインあたり 20 カラムとなり、diff の表示が崩れて判読不能になります。代わりに tmux のウィンドウ機能を使用してください。Ctrl-b c でウィンドウを作成し、Ctrl-b n で次のウィンドウへ移動します。2 つ目のウィンドウで別の Claude Code セッションを実行する場合、2 つのセッション間で直接作業を受け渡すことができます。タッチスクリーン上でウィンドウ間をコピー&ペーストする必要はありません。diff を正確に読み取る必要がある場合は、スマートフォンを横向きにしてください。

画面に表示されるテキスト量は意図的に設定する価値があります。出力スタイルはすべての応答の背後にあるシステムプロンプトを編集するため、簡潔なスタイルを選択すれば、スマートフォンでスクロールすべき画面数を減らせます。

小さな画面での長時間のセッションは、主にコンテキストの問題です。移動中に一日中作業を行う前に、Claude Code のコンテキストウィンドウの管理について読んでおくことを推奨します。

セキュリティの強化:鍵認証のみとし、パスワードを無効化する

現在、スマートフォンにはコードの編集やコマンド実行を行うマシンへの鍵が保存されています。パスワード認証を無効にしてください。Ubuntu の sshd_config には先頭で /etc/ssh/sshd_config.d/*.conf が読み込まれるため、設定値は最初に見つかったものが優先されます。そのため、sshd_config を直接編集するよりもドロップインファイルを使用する方が安全です。

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 で再接続し、最初のセッションが有効なうちに問題を解決してください。そのエラーメッセージが示す5つの原因を確認し、詳細な出力から特定のエラーを判別します。

デバイスごとに個別の鍵を作成してください。スマートフォンを紛失した際、~/.ssh/authorized_keys から該当する1行を削除するだけで済み、ノートパソコンはそのまま使用できます。鍵を共有していると、所有するすべてのデバイスで鍵を再設定する必要があります。

Ubuntu 24.04 で SSH のポートを変更する場合、リスナーは ssh.socket が管理していることに注意してください。systemd ジェネレーターが SSH 設定の Port 行からソケットを構築するため、ListenStream のオーバーライドは不要です。ただし、ssh を再起動するだけでは、サーバーは 22 番ポートで待ち受けたままになります。ドロップインファイルに Port 行を記述し、ufw で新しいポートを許可した後、sudo systemctl daemon-reload を実行してから sudo systemctl restart ssh.socket を実行してください。VPS における SSH の強化で、この手順とその他の対策を解説しています。

パスワード認証を無効にすると、推測によるログインが不可能になるため、SSH 用の fail2ban が提供するセキュリティ上の利点は限定的です。ただし、ログが整理されるため、実際のログイン試行を特定しやすくなるという利点はあります。

より強力な選択肢は、SSH をパブリックインターネットから遮断することです。サーバーを 自前でホストする WireGuard VPN の背後に配置し、必要に応じてスマートフォンでトンネルを確立し、sshd をトンネル経由の ListenAddress で待ち受けさせます。mosh は両端が UDP であるため、このトンネル経由で動作します。注意点として、トンネルはパケットオーバーヘッドを追加するため、大容量転送が停止する場合は、スマートフォンの WireGuard 設定で MTU を下げてください。

最後に、この運用方法に関する注意点です。スマートフォンでは、数行の diff しか表示されない画面で権限プロンプトを承認することになります。これはガードレールを無効にするのではなく、維持すべき理由です。また、セッション開始時の権限モードも確認してください。Claude Code v2.1.283 以降、対話型ターミナルセッションのデフォルトは auto モードとなっており、確認なしで作業ディレクトリ内のファイルを編集します。タッチスクリーンが主な操作手段となる前に、Claude Code を VPS で安全に実行する方法を参照し、ユーザーやディレクトリの制限を設定しておくことを推奨します。

再接続時に問題が発生した場合

tmux attach の表示は、no server running on /tmp/tmux-1000/default がそのソケット上でサーバーを検出できなかったことを意味します。通常、サーバーが終了している状態であり、これはほぼ間違いなくマシンが再起動したことを示します。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 カラム幅でアタッチしたままのノート PC と、40 カラム幅のスマートフォンが交互にリサイズを行っている状態です。アタッチ時に他のクライアントをデタッチするには、tmux attach -d -t claude を使用してください。

FAQ

Claude Code をスマートフォン本体で実行し、VPS の代わりに使用できますか?

Android や iOS ではターミナル CLI はサポートされていません。2026 年 10 月時点でのサポート対象プラットフォームは、macOS、Windows、Ubuntu 20.04 以降、Debian 10 以降、Alpine 3.19 以降であり、4 GB 以上の RAM が必要です。Android と iOS はこのリストに含まれていません。また、スマートフォンはアプリをスリープ状態にし、ネットワークアドレスを頻繁に変更するため、長時間実行されるエージェントには適していません。サーバー上で実行し、スマートフォンは表示用端末として使用してください。

アプリを閉じたり通信が途切れたりした場合、セッションは維持されますか?

はい。2 つのツールがその役割を担います。tmux はサーバー上でプロセスを維持するため、接続が切れても処理は終了しません。mosh はアドレス変更時も接続を維持するため、Wi-Fi からモバイルデータ通信への切り替えでも再接続の必要はありません。tmux を使わない通常の SSH では、接続が切断されると SIGHUP が送信され、Claude Code はタスクの途中で停止します。

mosh で接続は成功するのに何も表示されないのはなぜですか?

ログインは成功するものの Nothing received from server on UDP port 60001. で停止する場合、クライアントがその UDP ポートで mosh-server に到達できていません。これは通常、ファイアウォールが UDP 60000 から 61000 までの通信をブロックしていることが原因です。ufw でこの範囲を許可し、さらにクラウドプロバイダーのネットワークファイアウォール設定(多くの管理パネルで個別に存在します)でも同様の設定を行ってください。もし mosh が mosh-server が見つからないと報告する場合は、サーバーにパッケージがインストールされていないか、ログインシェル PATH のパスに含まれていません。sudo apt install mosh でインストールするか、mosh --server=/usr/bin/mosh-server you@server を使用してください。

Esc キーのないキーボードから Claude Code を中断するにはどうすればよいですか?

キー行を追加してください。Termux では ~/.termux/termux.properties 内の extra-keys で設定可能です。Termius や Blink にも設定から編集可能なキー行が用意されています。Esc は実行中の応答を中断し、完了済みの作業を保持します。Ctrl+C も中断に使用できますが、アイドル状態のプロンプトで 2 回押すと Claude Code が終了してしまうため、まずは Esc を試してください。

インターネットに対して SSH を公開するのは安全ですか?

パスワード認証を無効にしていれば、デバイスから持ち出されることのない鍵のみが認証に使用されるため、再構築可能なマシンであれば許容できるリスクです。各デバイスに個別の鍵を割り当てれば、スマートフォンを紛失しても authorized_keys の 1 行を削除するだけで済みます。パブリックポートで応答したくない場合は、サーバーを WireGuard の背後に配置し、sshd をトンネルアドレスで待ち受けさせてください。

この記事は役に立ちましたか?