スマホからClaude Codeを使う方法
Claude CodeはVPSのtmuxで実行し、スマホは画面としてSSH接続します。SSH keys、不安定な回線向けのmosh、tmux attach、入力しやすいキーボード設定を解説します。
スマートフォンからの Claude Code: 実際の仕組み
スマートフォンから使用する Claude Code は、モバイルアプリではありません。Claude Code は VPS (仮想プライベートサーバー) 上で、維持される tmux セッション内で実行されます。スマートフォンは、画面を表示している間、そのセッションに SSH (secure shell) 接続します。アプリを閉じても、エージェントは処理を続けます。プロセスはスマートフォン上で実行されていないためです。
この分離が設計の要点です。スマートフォンのオペレーティングシステムは、アプリから切り替えて数秒後にそのアプリを一時停止します。そのため、スマートフォンで開始した長時間のジョブは停止します。また、wifi からモバイルデータ通信に移動するたびに、新しいネットワークアドレスが割り当てられます。プロセスをサーバー上で実行し、スマートフォンには画面だけを表示させれば、どちらの問題も解消できます。
サーバーには、セッションを保持する tmux、接続に使用する SSH keys、ネットワークの変更に対応する mosh、そして Claude Code の4つが必要です。スマートフォン側には、アクセス可能なキー行を備えた terminal app が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 アクセスが有効な Console アカウントも必要です。無料の 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 はセッションを開始せずに、インストールと設定の診断情報を出力します。
スマートフォンに依存する前に、ノートパソコンから一度ログインしてください。プロジェクトディレクトリで claude を実行し、ログインプロンプトに従います。ブラウザーで URL を開き、コードをターミナルに戻して入力する手順です。スマートフォンの画面で2つのアプリを切り替えながら行うと時間がかかります。実際のキーボードで一度実行すれば、認証情報はサーバーに保存されます。
接続が切れても終了しないように tmux 内で Claude Code を起動する
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 が停止します。VPS 上の tmux 内で Claude Code を実行する では、セッションのレイアウトについて詳しく説明しています。
tmux はサーバー上で実行し、スマートフォン上では実行しないでください。すでに接続しているセッション内で tmux と入力すると sessions should be nested with care, unset $TMUX to force と表示されます。これを強制すると、競合するプレフィックスキーが2つできて操作しにくくなります。
ログインごとに自動的にアタッチする
タッチキーボードでアタッチコマンドを入力し続けるのは面倒です。サーバー上の ~/.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 鍵と鍵の失効方法では、命名方法と失効手順を説明しています。これらはノートパソコンよりもスマートフォンで重要です。
ターミナルアプリ独自の生体認証またはパスコードロックを有効にしてください。これがないと、画面が点灯している間、ロック解除されたスマートフォンがサーバーへのオープンシェルになります。
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を1回だけ使用してログインし、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が見つからないというエラーが表示される場合は、サーバーにパッケージがないか、ログイン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やSSHの非対話的な用途(port forwardingなど)をサポートしていません。そのため、Claude Codeが起動したWebアプリをプレビューするには、通常のssh -L 8080:127.0.0.1:8080 you@serverが必要です。また、表示中の画面だけを同期するため、独自のスクロールバックはありません。ただし、ここでは問題になりません。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列になり、すべての差分表示が折り返されて読みにくくなります。代わりに tmux のウィンドウを使います。Ctrl-b c で新しいウィンドウを作成し、Ctrl-b n で次のウィンドウに移動します。差分を正確に読む必要がある場合は、スマートフォンを横向きにしてください。
小さな画面で長時間のセッションを行う場合、主な問題はコンテキストです。そのため、列車内で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が失敗します。作業中のセッションは開いたままにしてください。接続をすべて閉じる前に、2つ目の接続からテストします。鍵を誤るとPermission denied (publickey).になり、パスワードを無効にしている場合は代替手段がないためです。その場合の復旧手段は、プロバイダーのコンソールです。
デバイスごとに専用の鍵を使用してください。スマートフォンを紛失しても、~/.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だけが表示される画面で権限プロンプトを承認します。これはガードレールを無効にする理由ではなく、維持する理由です。メインの接続手段がタッチスクリーンになる前に設定すべきユーザーとディレクトリの制限については、VPSでClaude Codeを安全に実行するで説明しています。
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
VPSではなく、スマートフォン自体でClaude Codeを実行できますか?
いいえ。2026年7月時点でサポートされているプラットフォームは、macOS、Windows、Ubuntu 20.04以降、Debian 10以降、Alpine 3.19以降です。RAMは4 GB以上必要です。AndroidとiOSは対象外です。スマートフォンはアプリをスリープさせ、ネットワークアドレスも常に変わります。これは長時間のエージェント実行に適していません。サーバー上で実行し、スマートフォンは表示用に使ってください。
アプリを閉じたり、通信が切れたりしてもセッションは維持されますか?
はい。これを実現するのは、別々の2つの機能です。tmuxはサーバー上でプロセスを実行し続けるため、接続が終了してもプロセスは停止しません。moshはアドレス変更後も接続自体を維持するため、wifiからモバイルデータ通信に切り替えても、再接続は必要ありません。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にはトンネルアドレスでlistenさせてください。