A clean, focused SSH session manager inspired by SecureCRT. Manage your SSH connections with a simple GUI instead of manually editing config files.
- π₯οΈ Simple GUI - Clean PySide6 interface for managing SSH connections
- π Nested Folders - Organize connections in hierarchical folders (work/clients/acme/production)
- π One-Click Connect - Double-click to launch SSH in your terminal
- π§ SSH Features - Port forwards, jump hosts, custom keys
- π¨ Color Coding - Tag connections as Production (π΄), Staging (π‘), Development (π’)
- π Quick Search - Real-time filtering across all connections
- πΎ Native SSH Config - Uses standard SSH config files with Include statements
- π Non-Invasive - Leaves your existing ~/.ssh/config untouched
- Python 3.8+ (check:
python3 --version) - Linux (currently supports Linux; macOS/Windows support planned)
- SSH client (already installed on most Linux systems)
# Clone the repository
git clone https://github.com/yourusername/ssh_manager.git
cd ssh_manager
# Create virtual environment (recommended)
python3 -m venv venv
source venv/bin/activate
# Install dependencies (just PySide6)
pip install -r requirements.txt
# Run the application
python3 main.pyOn first launch, SSH Manager will:
- Create
~/ssh_manager/groups/directory for storing connections - Create default folders:
work/andpersonal/ - Check your existing
~/.ssh/configand notify you if connections are found - Add this line to the end of your
~/.ssh/config:# SSH Manager - Auto-generated connections Include ~/ssh_manager/groups/**/*.conf
Your existing SSH config remains completely untouched. SSH Manager connections live separately in ~/ssh_manager/groups/.
- Click [+] New Connection in the toolbar
- Fill in the form:
- Name: Unique identifier (e.g., "production-api")
- Hostname: IP address or domain (e.g., "192.168.1.50")
- Username: SSH user (e.g., "deploy")
- Port: Default is 22
- SSH Key: Browse to your private key (e.g.,
~/.ssh/id_ed25519) - Folder: Organize it (e.g., "work/clients/acme")
- Color Tag: Production, Staging, or Development
- (Optional) Expand Advanced Settings for:
- Jump Host: Bastion/proxy server
- Local Port Forwards: Forward ports from remote to local
- Remote Port Forwards: Forward ports from local to remote
- Click Save
The connection appears in your tree and is immediately usable via ssh production-api.
Three ways to connect:
- Double-click a connection in the tree
- Select a connection and click [Connect] button
- Right-click a connection β Connect
SSH Manager auto-detects your terminal (gnome-terminal, konsole, xterm, etc.) and opens a new window with your SSH session.
- Create Folder: Right-click parent folder β New Subfolder
- Move Connection: Drag & drop connections between folders
- Delete Folder: Right-click β Delete Folder (must be empty)
Example hierarchy:
π work
π clients
π acme
π» acme-prod [π΄ Production]
π» acme-staging [π‘ Staging]
π» office-vpn
π personal
π» homeserver
π» raspberry-pi
- Quick Edit: Select connection β Press F2 (or right-click β Edit)
- Duplicate: Right-click β Duplicate (creates copy with "-copy" suffix)
- Delete: Select connection β Press Delete (or right-click β Delete)
Use the search bar to filter connections in real-time. Searches across:
- Connection names
- Hostnames
- Usernames
- Folder names
- Ctrl+N - New connection
- F2 - Edit selected connection
- Delete - Delete selected connection
- Enter - Connect to selected connection
- Ctrl+F - Focus search bar
- Ctrl+Q - Quit application
SSH Manager stores each connection as a separate .conf file:
~/ssh_manager/groups/
βββ work/
β βββ production-api.conf
β βββ clients/
β βββ acme/
β βββ acme-prod.conf
βββ personal/
βββ homeserver.conf
Each .conf file contains standard SSH config syntax:
# File: ~/ssh_manager/groups/work/production-api.conf
# SSH Manager Metadata: {"color": "production"}
Host production-api
HostName 192.168.1.50
User deploy
Port 22
IdentityFile ~/.ssh/company_key
ProxyJump bastion.company.com
LocalForward 8080 localhost:80
LocalForward 5432 db.internal:5432
Your ~/.ssh/config includes all SSH Manager connections:
# Your existing SSH config (untouched)
Host old-server
HostName 10.0.0.1
User admin
# SSH Manager - Auto-generated connections
Include ~/ssh_manager/groups/**/*.conf
The Include statement (SSH native feature) loads all .conf files from subdirectories. This means:
- β
All SSH tools work seamlessly (
ssh,scp,rsync,git, etc.) - β Your existing config stays intact
- β
Easy to backup (just copy
~/ssh_manager/groups/) - β Easy to version control (Git each folder separately)
Local Forward (Access remote service locally):
Local Port: 8080
Remote Host: localhost
Remote Port: 80
SSH command: ssh -L 8080:localhost:80 production-api
Remote Forward (Expose local service to remote):
Remote Port: 3000
Local Host: localhost
Local Port: 3000
SSH command: ssh -R 3000:localhost:3000 production-api
Connect to a server through an intermediate jump host:
Host: internal-server.local
ProxyJump: bastion.company.com
SSH automatically connects to bastion first, then to internal-server.
Organize connections by environment:
- π΄ Production - Live servers (red badge)
- π‘ Staging - Testing environments (yellow badge)
- π’ Development - Dev machines (green badge)
Visual safety net to avoid mistakes (e.g., won't accidentally restart production).
Problem: Double-clicking connection doesn't open terminal
Solution: SSH Manager auto-detects terminals. If yours isn't detected, install a supported one:
# Ubuntu/Debian
sudo apt install gnome-terminal
# Fedora
sudo dnf install gnome-terminal
# Arch
sudo pacman -S gnome-terminalSupported terminals: gnome-terminal, konsole, xfce4-terminal, alacritty, kitty, tilix, xterm
Problem: "We detected existing connections in ~/.ssh/config"
Solution: This is normal. SSH Manager detects your existing config and leaves it alone. New connections you create via SSH Manager are stored separately in ~/ssh_manager/groups/.
If you want to manage existing connections, you can manually recreate them in SSH Manager, then remove from ~/.ssh/config.
Problem: SSH connection fails with "Permission denied"
Solution: Check your SSH key permissions:
chmod 600 ~/.ssh/id_ed25519 # Private key
chmod 644 ~/.ssh/id_ed25519.pub # Public keySSH Manager doesn't manage key permissions - use standard SSH key setup.
Problem: pip install PySide6 fails or takes very long
Solution: PySide6 is a large package (~100MB). Ensure you have:
- Sufficient disk space
- Good internet connection
- Up-to-date pip:
pip install --upgrade pip
Alternative for testing without GUI:
# Just generate SSH config files without GUI
python3 -c "from core.config_manager import ConfigManager; ..."ssh_manager/
βββ main.py # Application entry point
βββ requirements.txt # Dependencies (PySide6 only)
βββ README.md # This file
βββ PROJECT_PLAN.md # Technical documentation
β
βββ core/ # Business logic (no GUI)
β βββ connection.py # Connection data model
β βββ config_manager.py # SSH config file operations
β βββ terminal_launcher.py # Terminal detection & SSH launching
β
βββ ui/ # GUI components
βββ main_window.py # Main application window
βββ connection_tree.py # Tree view widget
βββ connection_dialog.py # Add/Edit connection dialog
Contributions welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/new-feature) - Commit your changes (
git commit -am 'Add new feature') - Push to the branch (
git push origin feature/new-feature) - Open a Pull Request
- Basic GUI with tree view
- Add/Edit/Delete connections
- Nested folder organization
- Port forwards and jump hosts
- Terminal auto-detection
- Search/filter
- Color tagging
- Import existing SSH config connections
- Export connections to file
- Connection templates
- Dark mode support
- Connection usage statistics
- macOS support
- Windows support (with WSL)
- SSH key generation interface
- Multi-connection actions
- Built-in connection testing
MIT License - see LICENSE file for details
Inspired by SecureCRT's session management workflow.
Built with:
- PySide6 - Qt for Python
- Native SSH client (OpenSSH)
Questions or issues? Open an issue on GitHub or submit a pull request.