Skip to main content

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.

PyPI version Python 3.10+ License: MIT

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

  1. Create an account at pypi.org
  2. Go to Account Settings → API tokens and create a token
  3. 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

ssh_mngr-0.1.0.tar.gz (10.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ssh_mngr-0.1.0-py3-none-any.whl (13.6 kB view details)

Uploaded Python 3

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

Hashes for ssh_mngr-0.1.0.tar.gz
Algorithm Hash digest
SHA256 1854998d62fd269818052fb267117bc3f04efee4ccb91c0c2bbdee0c9cc23fed
MD5 91c0cee2a296bc139b173600077e2e2e
BLAKE2b-256 a32a2bb4359e76c0d0c80b3528fd2fc6b38a01c290a32661b5d8808355be6d88

See more details on using hashes here.

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

Hashes for ssh_mngr-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 39231bf5a0e57b526ff69c9a066c86bc416af7c12ffc3841d5c61fc562292124
MD5 fca2362352a000ceb0ce94ba103039c6
BLAKE2b-256 af359f0701983be9a7271dda7a4c728c75d963149e0b58b81a09b4e46eb4d9c4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page