SSH Manager (ssh-mngr)
A beautiful terminal SSH connection manager — like mRemoteNG / RoyalTSX, but right inside your terminal.
Built with Textual + Rich — no GUI, no browser, just your terminal.
✨ Why?
If you SSH into multiple Linux servers daily — some with your user, some with root, some with PEM keys — you need a fast way to manage, search, and connect. No more scrolling through bash history or maintaining shell aliases.
ssh-mngr gives you a Norton Commander-style TUI with a sidebar of grouped connections, a detail panel, live search, and one-key connect.
📦 Install
# Homebrew (macOS)
brew tap sk3pp3r/ssh-mngr https://github.com/sk3pp3r/ssh-mngr
brew install ssh-mngr
# From PyPI
pipx install ssh-mngr
# Or with pip
pip install ssh-mngr
Install from source
git clone https://github.com/sk3pp3r/ssh-mngr.git
cd ssh-mngr
pip install .
Offline install (air-gapped servers)
# On a machine with internet — build wheels
pip wheel . -w dist/
pip download -d dist/ .
# Transfer the dist/ folder via sftp/scp
sftp user@offline-host
sftp> put dist/* /tmp/ssh-mngr-wheels/
# On the offline machine
pip install --no-index --find-links=/tmp/ssh-mngr-wheels/ ssh-mngr
🚀 Usage
ssh-mngr # launch the TUI
ssm # short alias — same thing
⌨️ Keyboard Shortcuts
| Key | Action |
|---|---|
a |
Add new connection |
e |
Edit selected connection |
d |
Delete selected connection |
f |
Quick connect — ad-hoc SSH |
Enter |
Connect to selected server |
i |
Import from ~/.ssh/config |
s |
Search — focus the filter bar |
r |
Refresh — reload config file |
q |
Quit |
🎯 Features
| Feature | Description |
|---|---|
| Grouped connections | Organise servers into named folders |
| PEM / identity-file | Per-connection key file support |
| Quick connect | Ad-hoc user@host:port without saving |
| SSH config import | One-key import from ~/.ssh/config |
| Live search | Filter connections as you type |
| Detail panel | Shows host info, SSH command, last-connected |
| Last connected | Tracks when you last used each connection |
| Cross-platform | Works on macOS and Linux terminals |
🏗️ Project Structure
src/ssh_mngr/
├── app.py # Main Textual app — layout, keybindings, SSH launch
├── screens.py # Modal dialogs (add/edit/quick-connect/confirm)
├── config.py # JSON config load/save
├── models.py # SSHConnection dataclass
└── ssh_import.py # ~/.ssh/config parser
⚙️ Configuration
Connections are stored as JSON at:
~/.config/ssh-mngr/connections.json
Example:
{
"version": 1,
"connections": [
{
"id": "a1b2c3d4",
"name": "Production Web",
"host": "10.0.1.50",
"port": 22,
"username": "deploy",
"identity_file": "~/.ssh/prod.pem",
"group": "Production",
"description": "Main web server",
"last_connected": "2026-03-25T14:30:00"
}
]
}
🗺️ Roadmap
- Duplicate connection
- SSH tunnels / port forwarding
- Connection tags & multi-group
- Export / import connections (JSON / YAML)
- SCP / file transfer shortcut
- Theme customisation
📄 License
MIT — see LICENSE for details.
Metadata
Release files for ssh-mngr 0.1.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ssh_mngr-0.1.6.tar.gz | 16.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ssh_mngr-0.1.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.1 kB
Release files / ssh_mngr-0.1.6.tar.gz
| Download URL | ssh_mngr-0.1.6.tar.gz |
|---|---|
| Size | 16.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8dfaa438453abb1a632dd461e55888f87c4e97c68f61edd89913ca4cc94711fc
|
|
BLAKE2b-256 checksum How to use checksums |
dfc9c9ae689f3f06994d09bbcf61618924ea748baa773c7cf5e736d1d4054fe5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.12
|
Release files / ssh_mngr-0.1.6-py3-none-any.whl
| Download URL | ssh_mngr-0.1.6-py3-none-any.whl |
|---|---|
| Size | 14.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
90d80f8f8063d612544c1589c3b6496b12919002211c6091dc92057bf4363013
|
|
BLAKE2b-256 checksum How to use checksums |
c908a2ef456e75a66d9f173063f5a60ad31f365848e95c80d0e544144494578d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.12
|