Lazyssh is a terminal-based, interactive SSH manager inspired by tools like lazydocker and k9s — but built for managing your fleet of servers directly from your terminal.
With lazyssh, you can quickly navigate, connect to, and manage any server defined in your ~/.ssh/config. No more remembering IP addresses or long ssh commands — just a clean, keyboard-driven UI.
About this fork: this is a maintained fork of Adembc/lazyssh, which hasn't merged changes since v0.3.0. It adds fixes for how
~/.ssh/configis written (symlinked configs,Host *ordering, negated patterns), bug fixes from open upstream pull requests, and its own releases and Homebrew tap.
- 📜 Read & display servers from your
~/.ssh/configin a scrollable list. - ➕ Add a new server from the UI with comprehensive SSH configuration options.
- ✏ Edit existing server entries directly from the UI with a tabbed interface.
- 🗑 Delete server entries safely.
- 📌 Pin / unpin servers to keep favorites at the top.
- 🏓 Ping server to check status.
- 🔍 Fuzzy search by alias, IP, or tags.
- 🖥 One‑keypress SSH into the selected server (Enter).
- 🏷 Tag servers (e.g., prod, dev, test) for quick filtering.
↕️ Sort by alias or last SSH (toggle + reverse).
- 🔀 Press
fto start a local (-L), remote (-R) or dynamic/SOCKS (-D) forward for the selected server, without editing its config. - 🧵 Run it as a background tunnel ("Only forward") or together with an interactive SSH session ("Forward + SSH").
- Ⓕ Servers with an active background tunnel are marked in the list. Press
xto stop them. ⚠️ Background tunnels are detached and keep running after you quit lazyssh. Stop them withxbefore quitting if you don't want that.
- 🔗 Persistent port forwarding in the config (LocalForward, RemoteForward, DynamicForward).
- 🚀 Connection multiplexing for faster subsequent connections.
- 🔐 Advanced authentication options (public key, password, agent forwarding).
- 🔒 Security settings (ciphers, MACs, key exchange algorithms).
- 🌐 Proxy settings (ProxyJump, ProxyCommand).
- ⚙️ Extensive SSH config options organized in tabbed interface.
- 📁 Press
Tto copy files between your machine and the selected server withscp, or to open ansftpsession. - ⬆️ Upload a local file or folder, or ⬇️ download a remote one. Local paths autocomplete as you type (
~/works); an empty remote path means the remote home directory. - 📂 Tick "Recursive" to copy folders. Uploading a folder turns it on automatically.
- 💻 "Open SFTP session" suspends lazyssh and runs
sftp <alias>; you return to lazyssh when it exits.
- 🔑 SSH key autocomplete with automatic detection of available keys.
- 📝 Smart key selection with support for multiple keys.
- 📤 Press
Kto install a public key on the selected server (viassh-copy-id): pick one of your~/.ssh/*.pubkeys (the server's own key is preselected) or paste someone else's. - 🆕 The same
Kdialog can also generate a new keypair withssh-keygen(ed25519, RSA 4096 or ECDSA), install it on the server, and set it as the server'sIdentityFile.
lazyssh does not introduce any new security risks.
It is simply a UI/TUI wrapper around your existing ~/.ssh/config file.
-
All SSH connections are executed through your system’s native ssh binary (OpenSSH).
-
Private keys, passwords, and credentials are never stored, transmitted, or modified by lazyssh.
-
New keys are created by your system's
ssh-keygen; lazyssh never reads or writes private key contents. -
Your existing IdentityFile paths and ssh-agent integrations work exactly as before.
-
lazyssh only reads and updates your
~/.ssh/config. A backup of the file is created automatically before any changes. -
File permissions on your SSH config are preserved to ensure security.
- Non‑destructive edits: lazyssh only writes the minimal required changes to your ~/.ssh/config. It uses a parser that preserves existing comments, spacing, order, and any settings it didn’t touch. Your handcrafted comments and formatting remain intact.
- Atomic writes: updates are written to a temporary file and then atomically renamed over the original, minimizing the risk of partial writes.
- Symlinked configs: if
~/.ssh/configis a symlink (for example into a dotfiles repo), lazyssh updates the file it points to and leaves the link in place. - Correct host order: new hosts are added before any matching wildcard block such as a trailing
Host *. OpenSSH uses the first value it finds for each option, so this keeps the wildcard's settings from overriding the new host's. - Negated patterns: lines like
Host * !bastionare written back exactly as they were, and are not listed as servers. - Backups:
- One‑time original backup: before lazyssh makes its first change, it creates a single snapshot named config.original.backup beside your SSH config. If this file is present, it will never be recreated or overwritten.
- Rolling backups: on every subsequent save, lazyssh also creates a timestamped backup named like: ~/.ssh/config--lazyssh.backup. The app keeps at most 10 of these backups, automatically removing the oldest ones.
Clean loading screen when launching the app
Main dashboard displaying all configured servers with status indicators, pinned favorites at the top, and easy navigation
Fuzzy search functionality to quickly find servers by name, IP address, or tags
Tabbed interface for managing SSH connections with extensive configuration options organized into:
- Basic - Host, user, port, keys, tags
- Connection - Proxy, timeouts, multiplexing, canonicalization
- Forwarding - Port forwarding, X11, agent
- Authentication - Keys, passwords, methods, algorithm settings
- Advanced - Security, cryptography, environment, debugging
SSH into the selected server
brew install lord-helicon/tap/lazysshDownload from GitHub Releases. You can use the snippet below to automatically fetch the latest version for your OS/ARCH (Darwin/Linux and amd64/arm64 supported):
# Detect latest version
LATEST_TAG=$(curl -fsSL https://api.github.com/repos/lord-helicon/lazyssh/releases/latest | jq -r .tag_name)
# Detect your architecture (Linux reports arm64 as aarch64)
ARCH=$(uname -m); [ "$ARCH" = "aarch64" ] && ARCH=arm64
# Download the correct binary for your system
curl -LJO "https://github.com/lord-helicon/lazyssh/releases/download/${LATEST_TAG}/lazyssh_$(uname)_${ARCH}.tar.gz"
# Extract the binary
tar -xzf lazyssh_$(uname)_${ARCH}.tar.gz
# Move to /usr/local/bin or another directory in your PATH
sudo mv lazyssh /usr/local/bin/
# enjoy!
lazyssh# Clone the repository
git clone https://github.com/lord-helicon/lazyssh.git
cd lazyssh
# Build for macOS
make build
./bin/lazyssh
# Or Run it directly
make run| Key | Action |
|---|---|
| / | Toggle search bar |
| ↑↓/jk | Navigate servers |
| Enter | SSH into selected server |
| f | Start port forwarding |
| x | Stop background forwarding |
| c | Copy SSH command to clipboard |
| K | Install SSH key on server |
| T | Transfer files / open SFTP |
| g | Ping selected server |
| r | Refresh background data |
| a | Add server |
| e | Edit server |
| t | Edit tags |
| d | Delete server |
| p | Pin/Unpin server |
| s | Toggle sort field |
| S | Reverse sort order |
| q | Quit |
In Server Form:
| Key | Action |
|---|---|
| Ctrl+H | Previous tab |
| Ctrl+L | Next tab |
| Ctrl+S | Save |
| Esc | Cancel |
Tip: The hint bar at the top of the list shows the most useful shortcuts.
Contributions are welcome!
- If you spot a bug or have a feature request, please open an issue.
- If you'd like to contribute, fork lord-helicon/lazyssh and submit a pull request ❤️.
We love seeing the community make Lazyssh better 🚀
This repository enforces semantic PR titles via an automated GitHub Action. Please format your PR title as:
- type(scope): short descriptive subject Notes:
- Scope is optional and should be one of: ui, cli, config, parser.
Allowed types in this repo:
- feat: a new feature
- fix: a bug fix
- improve: quality or UX improvements that are not a refactor or perf
- refactor: code change that neither fixes a bug nor adds a feature
- docs: documentation only changes
- test: adding or refactoring tests
- ci: CI/CD or automation changes
- chore: maintenance tasks, dependency bumps, non-code infra
- revert: reverts a previous commit
Examples:
- feat(ui): add server pinning and sorting options
- fix(parser): handle comments at end of Host blocks
- improve(cli): show friendly error when ssh binary missing
- refactor(config): simplify backup rotation logic
- docs: add installation instructions for Homebrew
- ci: cache Go toolchain and dependencies
Tip: If your PR touches multiple areas, pick the most relevant scope or omit the scope.
If you find Lazyssh useful, please consider giving the repo a star ⭐️ and join stargazers.
lazyssh was created by @Adembc. ☕ You can support the original author by buying them a coffee ❤️
- Built with tview and tcell.
- Inspired by k9s and lazydocker.
