トラブルシューティング
このページでは Mobile SSH のよくある問題と、サーバー側の SSH 設定を変更する前にまず確認すべき点を説明します。
接続できない
確認してください:
- 端末にネットワークアクセスがある。
- サーバーのホスト名または IP アドレスが正しい。
- SSH ポートが正しい(通常は
22)。 - ファイアウォール、VPN、携帯回線、または Wi-Fi ネットワークがポートをブロックしていない。
- SSH サーバーが稼働しており、使用中のネットワークからの接続を受け付けている。
同じホストが別の端末で動く場合は、ホスト、ポート、ユーザー名、鍵、ネットワーク経路を正確に比較してください。
サーバーの身元確認が必要
両方とも認証情報を送る前に SSH サーバーの身元を確認します。iOS の新しいホスト鍵は指紋確認と信頼して再接続が必要です。Android は設定 → 一般 → セキュリティ → 新しい SSH の身元を自動承認が既定で有効です。最初の生の鍵を自動保存し、次回以降は一致が必須です。無効にすると接続前に新しい指紋を確認できます。
新規・変更された鍵の SHA-256 指紋を、信頼できる手段で管理者と照合してください。サーバー交換や意図しない相手への接続が考えられるため、確認前に旧身元を削除しないでください。保存済み身元は設定で確認できます。別アドレスや踏み台でも検証は省略されません。
Android は範囲指定のホスト認証局と失効情報にも対応します。初回自動承認が有効でも、未知の認証局、期限切れ・無効な証明書、失効鍵は拒否します。iOS の設定 → サーバーの身元 → 失効した鍵を取り込むは範囲指定の OpenSSH @revoked Ed25519/ECDSA を受け付けます。未対応項目を混ぜて貼り付けると全体を拒否します。CA、証明書、RSA 鍵、ハッシュ化ホスト名は非対応です。失効は新規接続・再接続で以前の信頼より優先しますが、既存接続は閉じません。身元と失効情報はバックアップ対象外です。iOS 共有拡張でアップロードする前に、未知のサーバーを本体アプリで検証してください。
踏み台経由で接続できない
保存した各踏み台のアドレスと認証情報を確認し、スマートフォンが最初の段に到達できることを確認します。次のホストは前段から到達可能で、permitopen 制限を含め先への TCP 転送が許可されている必要があります。経路は SSH を使い、循環せず、展開後最大 8 段です。
削除済み・解決不能な踏み台があっても直接接続には戻りません。保存経路を修正して再接続します。Android の接続状態とログインログは、失敗した段と最終サーバーを区別します。
認証に失敗する
確認してください:
- ユーザー名のつづり。
- パスワードまたは鍵のパスフレーズ。
- サーバーがパスワードログイン、鍵ログイン、またはその両方を許可しているか。
- 秘密鍵がサーバーユーザーの
authorized_keysの公開鍵と一致するか。 - 鍵ファイルがヘッダーとフッターの行を含めて完全にインポートされたか。
暗号化された秘密鍵では、パスワード/パスフレーズ欄にパスフレーズを入力します。
Android のリモート ssh や git には保存サーバーの SSH エージェント転送とサーバー側の転送許可が必要です。保存済みで使用可能な鍵だけを提供します。許可・拒否や安全鍵の応答待ちは、その接続の端末・転送・トンネルを最大 30 秒停止し得ます。アプリまたは通知で応答してください。
秘密鍵のインポートに失敗する
秘密鍵のインポートはシステムのファイル選択ツールを使います。インポートに失敗する場合:
- 選択したファイルが公開鍵
.pubではなく秘密鍵であることを確認します。 - 信頼できるテキストエディタでファイルを開き、鍵ブロック全体が含まれていることを確認します。
- 秘密鍵欄に鍵を手動で貼り付けてみます。
- 鍵の種類が対応しているものであることを確認します。Android では Ed25519、ECDSA(P-256/384/521)、RSA、iOS では Ed25519 または ECDSA です。DSA(
ssh-dss)はどちらでも使えず、iOS は RSA に対応していません — 代わりに Ed25519 鍵を生成してください。
Android で安全鍵が応答しない
Android は USB・NFC の CTAP2/FIDO2 ed25519-sk と ecdsa-sk に対応します。取り込んだ認証ファイルを作成した実物の鍵を使います。USB ホスト機能と許可が必要です。NFC を有効にして完了まで鍵を端末に当ててください。求められたら PIN を入力し、鍵に触れます。
サーバーは OpenSSH 8.2 以降で選択した sk-* を許可する必要があります。U2F 専用鍵と常駐認証情報の検出は非対応です。鍵を探す間にログインがタイムアウトする場合があるため、先に準備してください。バックグラウンド要求は安全鍵通知かアプリから応答します。iOS はハードウェア安全鍵認証に非対応です。
キーボード入力が遅れる、または変わる
Android は自動修正・予測候補を無効にして直接入力を送ります。iOS の音声入力と候補は既定で有効で、音声と現在行の修正が使えます。意図せずシェル入力が変わる場合は設定で無効にし、キーボードの候補も確認して新しいペインを開いてください。
ESC、TAB、CTRL、矢印、HOME、END、PGUP、PGDN は追加キー列を使います。通信停滞でも入力は遅れます。Android のヘッダーは応答なしや未送信を表示し、再接続中の入力は捨てて新しいシェルへ再送しません。接続を待ち、プロンプトを確認して必要な分だけ入力し直します。
tmux のスクロールが想定どおりでない
Mobile SSH はターミナルの状態に応じてスクロールの挙動を変えます。tmux や他の代替画面プログラムでは、スクロールのジェスチャーがローカル履歴のスクロールではなく tmux のコピーモードのコマンドを送ることがあります。tmux のマウスモードが有効な場合、アプリはマウスホイールのエスケープシーケンスを送ります。
スクロールがおかしいと感じたら:
- リモートサーバーで tmux のマウスモードを有効・無効にしてみます。
- 追加キーの行の
PGUPとPGDNを使います。 - 密な出力をスクロールする前に、ペインをダブルタップして全画面にします。
- リモートのターミナルサイズが古く見える場合は、tmux をデタッチして再アタッチします。
Android は標準のコピーモード表示が見える場合、最下部へのスクロールでアプリ管理の tmux コピーモードを終了します。独自・分割レイアウトで表示がなければ手動終了が必要な場合があります。切り替え時は名前だけでなく選択サーバーと tmux ソケットも確認します。
画面ロック後にセッションが切れる
Android では、Mobile SSH は keepalive、フォアグラウンドサービス、ウェイクロック、Wi-Fi ロック、再接続の試行を使って切断を減らします。それでも Android のバッテリーポリシーがバックグラウンド処理を止めることがあります。
確認してください:
- 端末がバックグラウンドアプリを積極的に止める場合は、Mobile SSH のバッテリー最適化を無効にします。
- 長いセッションの間は Wi-Fi またはモバイルデータを安定させます。
- ロック解除後に Mobile SSH を開き直し、Active Sessions をタップします。
- アプリをスワイプで閉じてもシェルを生かしておきたい場合は、設定で Keep sessions running in background が有効になっているか確認します。
- サーバーが SSH セッションを切断した場合は、ホーム画面から再接続します — Continue にはまだ生きているものが、Tmux sessions にはサーバー側で待っているものが並びます。
iOS はバックグラウンドのアプリを停止するため、切り替え・画面ロック後に SSH を無期限に維持できません。短い猶予で素早い切り替えには対応します。サーバーの接続時にアタッチで tmux・Herdr・Zellij を選ぶか Eternal Terminal を使って再接続後に作業を再開します。マルチプレクサーがサーバー上で動き続けている必要があり、Eternal Terminal は踏み台経路を使えません。
ファイル転送が端末のファイルを参照できない
Mobile SSH は Android でストレージ権限を一切求めません。代わりに、ローカルペインにはシステムのフォルダー選択ツールで許可したフォルダーが 1 つ表示されます — 空の場合は Pick folder でフォルダーを選んでください。この許可は保持されるため、一度きりの手順です。
リモートのファイルは読み込めるのにローカルが読み込めない場合、SSH 接続に問題はなく、単にまだフォルダーを許可していないだけです。
iOS のローカルペインは最初アプリの書類領域です。自分のスマートフォン → ローカルフォルダーを選択で別の「ファイル」の場所を記憶できます。提供元や権限が使えなければ再選択するかアプリのフォルダーへ戻します。アプリのダウンロードはこの iPhone 内、外部ファイルは提供元の場所に残ります。フォルダー権限はバックアップで移行しません。
アップロードまたはダウンロードに失敗する
確認してください:
- SSH セッションがまだ接続されている。
- リモートのディレクトリが存在する。
- リモートユーザーにそのパスの読み取りまたは書き込み権限がある。
- ローカルの保存先が書き込み可能である。
- 端末に十分な空き容量がある。
- 大きな転送に対してネットワークが安定している。
ポートフォワーディングに失敗する
確認してください:
- ローカルポートが
1から65535の間である。 - ローカルポートがすでに使われていない。
- トンネル文字列が
PORTまたはLOCAL:REMOTEHOST:REMOTEである。 - リモートのホストとポートが SSH サーバーから到達できる。
- SSH サーバーが TCP 転送を許可している。
Android の VPN・プロキシで通信できない
- VPN から対象設定を開始し Android の要求を承認します。端末 VPN の開始は以前の VPN を置き換えます。他の VPN を維持するならローカル SOCKS5 を使います。
- SSH VPN は保存サーバー、踏み台、身元、TCP 転送許可、アプリ・サイトの選択を確認します。SSH は TCP と DNS を運び、一般の UDP は運びません。
- SOCKS5 はクライアントにループバックアドレス、ポート、パスワード、リモート DNS を設定します。起動しただけでは全アプリを転送しません。
- WireGuard はハンドシェイク、鍵、
AllowedIPs、DNS を確認します。Shadowsocks はサーバーの暗号・パスワードと DNS 用 UDP リレーを確認します。 - OpenVPN は対応する自己完結設定を使い、CA・サーバーの身元・認証情報を検証し、フルトンネルに VPN DNS を用意します。認証・証明書エラーを修正後、設定を停止して再開始します。
SSH VPN、Shadowsocks、OpenVPN は再接続中も対象通信を遮断し、直接接続への切り替えを防げます。停止すると保護は終了します。VPN でサーバーの提供者・管理者によるインターネット制限は回避できません。
バックアップで全て復元されない
取り込みプレビューとマージ・置き換えの動作を確認します。古い・部分バックアップで欠けた区分は変更しません。完全バックアップは対応設定を含み、Android は VPN・プロキシ設定も含みます。プラットフォーム専用項目は全て iOS に移せるとは限らず、古いアプリは新形式を拒否する場合があります。
ホストの身元、OS 権限、フォルダーアクセスは端末固有です。新端末でホストを検証し、フォルダー・VPN を許可してください。ハードウェア鍵の認証情報には実物の鍵が必要です。取り込みだけでは VPN を開始しないので、復元した設定を確認してから開始します。
リモートデスクトップが使えない・サイズ変更できない
接続中の SSH セッションからデスクトップを開き、サーバーのローカル TCP 転送許可を確認します。Linux は不足パッケージの案内に従ってデスクトップ・VNC をインストールします。Android は Wayland コンソールをミラーリングできないため、対応する仮想デスクトップを使います。
Mac の設定で画面共有を有効にします。Android は Mac のアカウント認証に対応します。iOS は画面共有で従来の VNC パスワードアクセスを有効にし、Mac アカウントのパスワードではなく画面共有パスワードを使います。ビューアーは既存の Mac 画面を表示し、解像度は Mac で変更する必要がある場合があります。仮想デスクトップのライブサイズ変更はサーバーの対応が必要です。アプリが作ったデスクトップの再起動は確認を求め、実行中のプログラムを閉じます。ビューアーを離れてもリモートデスクトップは動き続けます。
デバッグログ
2 つのプラットフォームは記録する内容が異なるため、問題に合ったほうを選んでください。
Android — ターミナルと描画。 Settings → Debugging → Show Debug and Logs buttons を有効にすると、ホーム画面に Debug ボタンが現れます。これはターミナルイベント、SSH データのサイズ、タッチ入力、サイズ変更の挙動、トンネルのライフサイクルを記録します。記録を開始すると、入力したすべてのキー(パスワードを含む)が取得される旨の警告がまず表示されます。停止すると、アーカイブが Downloads フォルダーに書き出されます。
iOS — 接続と再接続。 Settings → Diagnostics → Record debug log をオンにします。これは接続を試みた各アドレスとその失敗理由、再接続の試行とバックオフ、切断、「peer stopped answering keepalives」、ネットワークの変化、tmux コマンドとそのエラーを記録します。Settings には行数がリアルタイムで表示されるので記録中であることを確認でき、Export Debug Log でテキストファイルとして共有できます。ログはメモリ上に保持され、対象は現在のアプリセッションのみです。
デバッグログやアーカイブは共有する前に確認してください。トラブルシューティング用であり、サーバー名、アドレス、タイミング、その他の環境の詳細 — そして Android では入力した内容そのもの — が含まれることがあります。