Troubleshooting

This page covers common Mobile SSH issues and the first checks to run before changing server-side SSH settings.

Cannot connect

Check:

If the same host works from another device, compare the exact host, port, username, key, and network path.

Server identity needs attention

Both platforms check SSH server identity before sending credentials. On iOS, a new host key requires fingerprint confirmation and Trust and reconnect. On Android, Settings → General → Security → Automatically accept new SSH identities is on by default: the first raw key is saved automatically, and later connections must match it. Turn it off to review new fingerprints before connecting.

Compare a new or changed key’s SHA-256 fingerprint with your administrator through a trusted channel. A changed key can reflect a server replacement or an unexpected server; do not remove the old identity until you have verified the change. Review saved identities in Settings. Alternate addresses and jump hosts do not bypass verification.

Android also supports scoped host certificate authorities and revocations. Unknown authorities, expired or invalid certificates, and revoked keys remain blocked even with automatic first-use acceptance enabled. On iOS, Settings → Server identities → Import revoked keys accepts scoped OpenSSH @revoked Ed25519/ECDSA entries. A mixed paste containing unsupported entries is rejected in full; CA entries, certificates, RSA keys and hashed hostnames are unsupported. Revocations override previous trust on new connections and reconnects but do not close existing connections. Host identities and revocations are excluded from backups. On iOS, verify an unknown server in the main app before uploading through the Share Extension.

Cannot connect through a jump host

Check every saved bastion’s address and credentials, and make sure the phone can reach the first hop. Each later host must be reachable from the preceding server. Bastions must allow onward TCP forwarding, including any permitopen restrictions. The route must use SSH, contain no loops and expand to at most eight hops.

A deleted or unresolved bastion does not fall back to a direct connection. Fix the saved route, then reconnect. Android’s connection status and login log identify a failed hop separately from the final server.

Authentication failed

Check:

For encrypted private keys, enter the passphrase in the password/passphrase field.

On Android, remote ssh or git needs Forward SSH agent enabled for that saved server and agent forwarding allowed by the server. Only saved, usable key credentials are offered. A pending Allow/Deny or security-key prompt can pause that connection’s terminal, file transfers and tunnels for up to 30 seconds; answer it in the app or through its notification.

Private key import failed

Private key import uses the system file picker. If import fails:

Security key does not respond on Android

Android supports CTAP2/FIDO2 ed25519-sk and ecdsa-sk credentials over USB or NFC. Use the same physical key that created the imported credential file. USB needs host support and permission; NFC must be enabled, and the key must stay against the phone until the operation finishes. Enter a PIN when requested, then touch the key.

The server needs OpenSSH 8.2 or newer with the selected sk-* algorithm allowed. U2F-only keys and resident credential discovery are unsupported. A server’s login timeout can expire while you find the key; have it ready before connecting. For background requests, open the security-key notification or return to the app. iOS does not support hardware security-key authentication.

Keyboard input is delayed or changed

Android sends keyboard input directly with autocorrect and predictive suggestions disabled. On iOS, Dictation and suggestions is enabled by default; it supports voice input and corrections to the current line. If it changes shell input unexpectedly, disable it in Settings and review Keyboard suggestions, then open a new pane for the change to apply.

Use the extra key row for terminal keys such as ESC, TAB, CTRL, arrows, HOME, END, PGUP and PGDN. A stalled network can also delay input. Android’s pane header shows no reply or not sent; input typed during reconnect is dropped rather than replayed into a new shell. Wait for the connection, inspect the prompt, and retype only what is needed.

tmux scrolling is not what you expect

Mobile SSH changes scroll behavior based on terminal state. In tmux or other alternate-screen programs, scroll gestures may send tmux copy-mode commands rather than scrolling local history. If tmux mouse mode is enabled, the app sends mouse-wheel escape sequences.

If scrolling feels wrong:

On Android, scrolling to the bottom automatically leaves app-managed tmux copy mode when the standard copy-mode indicator is visible. Custom or split layouts without that indicator may still need a manual exit. When switching sessions, check the manager’s selected server and tmux socket as well as the session name.

Session dropped after screen lock

On Android, Mobile SSH uses keepalives, a foreground service, wake lock, Wi-Fi lock, and reconnect attempts to reduce disconnects. Android battery policies can still stop background work.

Check:

On iOS, the system suspends apps in the background, so a raw SSH connection cannot be kept open indefinitely once you switch away or lock the screen. A short grace period covers quick app switches. Set the server’s Attach on connect choice to tmux, Herdr or Zellij, or use Eternal Terminal, to resume remote work after reconnecting. The multiplexer must still be running on the server; Eternal Terminal cannot use a jump-host route.

File transfer cannot browse phone files

Mobile SSH asks for no storage permission on Android. Instead, the local pane shows one folder that you grant with the system folder picker — if it is empty, use Pick folder to choose one. The grant persists, so this is a one-time step.

If remote files load but local files do not, the SSH connection is fine and you simply have no folder granted yet.

On iOS, the local pane starts in the app’s documents area. My Phone → Choose local folder can select and remember another Files folder. If its provider or access grant is unavailable, choose the folder again or switch to the app folder. App-folder downloads appear under On My iPhone; files in an external folder remain in that provider’s location. Folder permissions are not transferred by backups.

Upload or download failed

Check:

Port forward failed

Check:

VPN or proxy does not carry traffic on Android

SSH VPN, Shadowsocks and OpenVPN can keep captured traffic blocked during reconnects instead of falling back to a direct connection. Stopping ends that protection. A VPN cannot bypass internet restrictions imposed on its server by its provider or administrator.

Backup did not restore everything

Review the import preview and the chosen Merge or Replace behavior. Missing sections in an older or partial backup leave those areas unchanged. Full backups include supported app preferences; Android also includes its VPN and proxy profiles. Platform-specific items are not all portable to iOS, and older app versions may reject newer full-backup formats.

Host identities, operating-system permissions and selected folder access remain device-local. Verify hosts and grant folder/VPN access on the new device. Hardware-key credentials still require the physical key. Importing profiles does not start a VPN; review restored profiles before starting them.

Remote desktop is unavailable or cannot resize

Open the desktop viewer from a connected SSH session. Check that the server permits local TCP forwarding. On Linux, follow the missing-package message to install the required desktop/VNC software. Android cannot mirror a Wayland console; use a supported virtual desktop instead.

On macOS, enable Screen Sharing in the Mac’s settings. Android supports Mac account authentication; iOS requires classic VNC password access enabled in Screen Sharing, using the screen-sharing password rather than a Mac account password. The viewer shows the Mac’s existing screen. Its resolution may need to be changed on the Mac. A virtual desktop can resize live only if its server supports it; restarting an app-created desktop requires confirmation and closes its running programs. Leaving the viewer keeps the remote desktop running.

Debug logs

The two platforms record different things, so pick the one that matches your problem.

Android — terminal and rendering. Enable Settings → Debugging → Show Debug and Logs buttons, then use the Debug button that appears on the start screen. It records terminal events, SSH data sizes, touch input, resize behaviour, and tunnel lifecycle. Starting a recording warns you first that it captures every key you type, passwords included. Stopping it writes an archive to your Downloads folder.

iOS — connections and reconnects. Turn on Settings → Diagnostics → Record debug log. It records each address dialled and why it failed, reconnect attempts and their backoff, dropped connections, “peer stopped answering keepalives”, network changes, and tmux commands with their errors. Settings shows a live line count so you can confirm it is recording, and Export Debug Log shares it as a text file. It is held in memory and covers the current app session only.

Review any debug log or archive before sharing it. They are intended for troubleshooting and may reveal server names, addresses, timing, or other environment details — and on Android, anything you typed.