Eternal Terminal
Eternal Terminal (ET) is a remote shell that automatically reconnects without losing the session: close the laptop, change networks, lose Wi-Fi for a minute, and the same shell with the same scrollback is waiting when the link comes back. ZestSSH supports it on desktop the way it supports Mosh: by running the system et client and piping its I/O into the built-in terminal.
Availability
Section titled “Availability”| Platform | Status |
|---|---|
| Android | Not available |
| iOS | Not available |
| Windows | Supported (via WSL) |
| macOS | Full support |
| Linux | Full support |
Eternal Terminal is a desktop-only protocol. On mobile, ZestSSH shows a message suggesting SSH with keep-alive and auto-reconnect instead.
What Is Eternal Terminal?
Section titled “What Is Eternal Terminal?”- Persistent sessions: the session lives on the server in
etserver; the client reconnects to it after any interruption, including your machine sleeping. - Scrollback survives: unlike Mosh, ET keeps native scrollback, so what scrolled past while you were disconnected is still there.
- TCP-based: ET uses an ordinary TCP connection (port 2022 by default), so it works through firewalls that block Mosh’s UDP.
- SSH for the handshake:
etfirst connects over SSH to exchange a per-session key, then switches to its own encrypted protocol.
Server Requirements
Section titled “Server Requirements”etserver must be installed and running on the remote host, listening on its port (2022 by default).
# Ubuntu/Debiansudo apt install et
# Fedorasudo dnf install et
# Arch Linuxsudo pacman -S eternalterminal
# macOS (Homebrew)brew install MisterTea/et/etThe server’s firewall must allow inbound TCP on the etserver port, and SSH must still be reachable on the port you configure for the connection.
Client Requirements
Section titled “Client Requirements”macOS / Linux
Section titled “macOS / Linux”Install et with your package manager (same packages as above). ZestSSH calls the et binary from PATH.
Windows
Section titled “Windows”ET on Windows runs through WSL (Windows Subsystem for Linux):
- Install WSL:
wsl --install - Inside WSL, install et:
wsl sudo apt install et - ZestSSH automatically runs
wsl et ...when connecting.
ZestSSH checks for both WSL availability and et inside WSL before attempting a connection.
Quick Start
Section titled “Quick Start”- Create a new connection and choose ET as the protocol (or pick New Eternal Terminal from the host grid’s right-click menu on desktop).
- Enter the hostname, the SSH port (used for the handshake, default 22) and an identity.
- Connect. ZestSSH checks that
etis installed, then launches the session.
How It Works
Section titled “How It Works”- Availability check:
which eton Unix,wsl which eton Windows. - Argument construction:
et --port 2022 [--ssh-option Port=<ssh port>] [--ssh-option IdentityFile=<key> --ssh-option IdentitiesOnly=yes] user@host. Host and user names are validated against a strict character set and may not begin with a dash, so nothing you type can be mistaken for an option by either binary.etexecutessshwith an argument vector, not through a shell. - Key handling: a stored SSH key is written to a temporary file readable only by you, handed to
etfor the handshake, and deleted when the session ends (the same mechanism Mosh uses). - Process launch:
etruns as a subprocess withTERM=xterm-256color; its stdout and stderr are shown in the terminal and your keystrokes go to its stdin. - Cleanup: on disconnect ZestSSH sends Ctrl+D so the remote shell exits cleanly, waits briefly, then terminates the process if it is still running.
Configuration
Section titled “Configuration”| Parameter | Default | Description |
|---|---|---|
| Host | (required) | Remote server hostname or IP |
| Port | 22 | SSH port for the handshake |
| Identity | (optional) | SSH identity for authentication |
| etserver port | 2022 | The port etserver listens on. ZestSSH uses the default; change it in /etc/et.cfg on the server if you must, and keep it at 2022 for ZestSSH |
Limitations
Section titled “Limitations”- Desktop only: not available on Android or iOS.
- Requires system et: ZestSSH does not bundle the
etbinary. - Requires etserver: the remote host must run
etserverwith its TCP port open. - etserver port is fixed at 2022 in this release.
- Key or agent authentication: the handshake runs inside
et’s ownssh, which has no terminal to prompt on, so a password-only identity cannot authenticate. Use a key. - No port forwarding, SFTP or agent forwarding through the ET session; open a separate SSH connection for those.
- Terminal resize is best-effort: the process runs on pipes rather than a PTY, so the remote shell picks up a new size when it next redraws.
- Windows requires WSL.
Troubleshooting
Section titled “Troubleshooting””Eternal Terminal is not installed or not available”
Section titled “”Eternal Terminal is not installed or not available””- Verify
etis installed:which et(orwsl which eton Windows). - On Windows, check WSL works:
wsl --status.
”Permission denied” or the session ends right after connecting
Section titled “”Permission denied” or the session ends right after connecting”- The identity must be a key (see Limitations). Check that the key is authorised on the server.
etterminalmust be on the server’s PATH for the user you log in as; on some macOS servers it lives in/usr/local/bin.
The session connects over SSH but never switches to ET
Section titled “The session connects over SSH but never switches to ET”- Check that
etserveris running:systemctl status eton the server. - Make sure TCP port 2022 is open between you and the server.
Q: Mosh or Eternal Terminal?
A: Mosh is best on very lossy links and gives instant local echo; ET keeps your scrollback, works over TCP through strict firewalls, and reconnects after your machine sleeps. Many people run ET and start tmux inside it.
Q: Is the traffic encrypted?
A: Yes. After the SSH handshake, et and etserver encrypt the session with a per-session key (libsodium secretbox). The SSH stack’s guarantees described elsewhere in these docs apply only to the handshake, which et’s own ssh performs.
Q: Does the session survive closing ZestSSH?
A: Closing the tab sends the remote shell an end-of-input so it exits cleanly. If ZestSSH is killed outright, the server keeps the session until etserver’s own timeout; you can reconnect to it by opening the connection again.