Eternal Terminal is a remote shell tool designed to provide seamless connectivity by automatically reconnecting sessions without interruption. This innovative solution ensures uninterrupted work even when network connections drop or switch, making it ideal for developers, IT professionals, and anyone who relies on stable remote access.
Key Features:
Automatic Reconnection: Maintains active sessions even during network disruptions or interface changes.
SSH Compatibility: Integrates with existing SSH configurations for a familiar and secure connection experience.
Port Forwarding Support: Enables local and remote port forwarding for enhanced flexibility in managing connections.
Encryption: Utilizes encryption protocols similar to SSH, ensuring data security during transmission.
Cross-Platform Support: Available on Linux, macOS, FreeBSD, Windows (via WSL), and Docker, with installation via Winget.
Session Persistence: Resumes sessions automatically upon reconnection, minimizing workflow disruptions.
Jumphost Compatibility: Supports connections through intermediate servers for secure access to restricted networks.
Target Audience and Benefits:
Ideal for developers, sysadmins, and remote workers seeking a reliable alternative to traditional SSH or terminal tools like tmux. Eternal Terminal delivers uninterrupted workflows, enhanced security, and cross-platform compatibility, making it essential for anyone requiring seamless remote access.
README
Eternal Terminal
Eternal Terminal is a remote shell that automatically reconnects without interrupting the session.
Website: .
Packaging status
Installing
macOS
The easiest way to install etis by using Homebrew:
git clone --recurse-submodules --depth 1 https://github.com/MisterTea/EternalTerminal.git
cd EternalTerminal
mkdir build
cd build
cmake ../
make
sudo make install
NixOS
If you use flakes, you can import the bundled NixOS module and let it manage
the package, /etc/et.cfg, and the etserver service:
Verify that the client is installed correctly by looking for the et executable: which et.
Verify that the server is installed correctly by checking the service status: systemctl status et. On some operating systems, you may need to enable and start the service manually: sudo systemctl enable --now et.
You are ready to start using ET!
Configuring
If you'd like to modify the server settings (e.g. to change the listening
port), edit /etc/et.cfg. On NixOS, set services.eternalTerminal.settings
instead so the generated /etc/et.cfg stays in sync with your system
configuration.
Using
ET uses ssh for handshaking and encryption, so you must be able to ssh into the machine from the client. Make sure that you can ssh user@hostname.
ET uses TCP, so you need an open port on your server. By default, it uses 2022.
Once you have an open port, the syntax is similar to ssh. Username is default to the current username starting the et process, use -u or user@ to specify a different one if necessary.
et hostname (etserver running on default port 2022, username is the same as current)
et user@hostname:8000 (etserver running on port 8000, different user)
You can specify a jumphost and the port et is running on jumphost using --jumphost and --jport. If no --jport is given, et will try to connect to default port 2022.
et hostname -jumphost jump_hostname (etserver running on port 2022 on both hostname and jumphost)
et hostname:8888 --jumphost jump_hostname --jport 9999
Additional arguments that et accepts are port forwarding pairs with option -t "18000:8000, 18001-18003:8001-8003", a command to run immediately after the connection is setup through -c.
Starting from the latest release, et supports parsing both user-specific and system-wide SSH config files.
The config file is required when your sshd on server/jumphost is listening on a port which is not 22.
Here is an example SSH config file showing how to setup when
there is a jumphost in the middle
sshd is listening on a port that is not 22
connecting to a different username other than the current one.
Host dev
HostName 192.168.1.1
User fred
Port 5555
ProxyJump user@jumphost.example.org:22
With the ssh config file set as above, you can simply call et with
et dev (etserver running on port 2022 on both hostname and jumphost)
et dev:8000 -jport 9000 (etserver running on port 9000 on jumphost)
Building from Source
macOS
To build Eternal Terminal on Mac, install its dependencies with Homebrew:
brew install autoconf automake libtool
git clone --recurse-submodules --depth 1 https://github.com/MisterTea/EternalTerminal.git
cd EternalTerminal
mkdir build
cd build
cmake ../
make -j$(nproc) && sudo make install
To run an et server for testing, run ./etserver. To run an et
server daemon persistently across reboots:
git clone --recurse-submodules --depth 1 https://github.com/MisterTea/EternalTerminal.git
cd EternalTerminal
mkdir build
cd build
# For ARM (including OS/X with apple silicon):
if [[ $(uname -a | grep 'arm\|aarch64') ]]; then export VCPKG_FORCE_SYSTEM_BINARIES=1; fi
cmake -DCPACK_GENERATOR=DEB ../
make -j$(nproc) package
sudo dpkg --install *.deb
Once built, the binary only requires libprotobuf-dev.
Disable et server by sudo systemctl disable --now et
sudo sed -ie "s|ExecStart=[^[:space:]]*[[:space:]]|ExecStart=$(which etserver) |" /etc/systemd/system/et.service
Alternatively, open the file /etc/systemd/system/et.service in an editor and correct the ExectStart=... line to point to the correct path of the etserver binary.