A beautiful terminal SSH connection manager — like mRemoteNG for your terminal
Project description
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
# From PyPI (recommended)
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 |
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"
}
]
}
📤 Publishing to PyPI
Prerequisites
- Create an account at pypi.org
- Go to Account Settings → API tokens and create a token
- Install build tools:
pip install build twine
Build & Publish
# 1. Build the package
python -m build
# 2. Check the package (optional but recommended)
twine check dist/*
# 3. Upload to Test PyPI first (recommended)
twine upload --repository testpypi dist/*
# 4. Test install from Test PyPI
pip install --index-url https://test.pypi.org/simple/ ssh-mngr
# 5. Upload to real PyPI
twine upload dist/*
Using a PyPI API token
# Option A: pass inline
twine upload -u __token__ -p pypi-YOUR_TOKEN_HERE dist/*
# Option B: save in ~/.pypirc so you don't have to repeat it
cat > ~/.pypirc << 'EOF'
[distutils]
index-servers =
pypi
testpypi
[pypi]
username = __token__
password = pypi-YOUR_TOKEN_HERE
[testpypi]
repository = https://test.pypi.org/legacy/
username = __token__
password = pypi-YOUR_TOKEN_HERE
EOF
chmod 600 ~/.pypirc
After uploading, install from anywhere:
pipx install ssh-mngr
🗺️ Roadmap
- Duplicate connection
- SSH tunnels / port forwarding
- Connection tags & multi-group
- Export / import connections (JSON / YAML)
- SCP / file transfer shortcut
- Theme customisation
🤝 Contributing
git clone https://github.com/sk3pp3r/ssh-mngr.git
cd ssh-mngr
python -m venv .venv && source .venv/bin/activate
pip install -e .
ssh-mngr
📄 License
MIT — see LICENSE for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ssh_mngr-0.1.0.tar.gz.
File metadata
- Download URL: ssh_mngr-0.1.0.tar.gz
- Upload date:
- Size: 10.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1854998d62fd269818052fb267117bc3f04efee4ccb91c0c2bbdee0c9cc23fed
|
|
| MD5 |
91c0cee2a296bc139b173600077e2e2e
|
|
| BLAKE2b-256 |
a32a2bb4359e76c0d0c80b3528fd2fc6b38a01c290a32661b5d8808355be6d88
|
File details
Details for the file ssh_mngr-0.1.0-py3-none-any.whl.
File metadata
- Download URL: ssh_mngr-0.1.0-py3-none-any.whl
- Upload date:
- Size: 13.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
39231bf5a0e57b526ff69c9a066c86bc416af7c12ffc3841d5c61fc562292124
|
|
| MD5 |
fca2362352a000ceb0ce94ba103039c6
|
|
| BLAKE2b-256 |
af359f0701983be9a7271dda7a4c728c75d963149e0b58b81a09b4e46eb4d9c4
|