🚀 SSHM - SSH Manager
A modern, interactive SSH Manager for your terminal 🔥
SSHM is a beautiful command-line tool that transforms how you manage and connect to your SSH hosts. Built with Go and featuring an intuitive TUI interface, it makes SSH connection management effortless and enjoyable.
🖱️ Click on the image to view in full size
✨ Features
🎯 Core Features
- 🎨 Beautiful TUI Interface - Navigate your SSH hosts with an elegant, interactive terminal UI
- ⚡ Quick Connect - Connect to any host instantly
- 🔄 Port Forwarding - Easy setup for Local, Remote, and Dynamic (SOCKS) forwarding
- 📝Easy Management - Add, edit, and manage SSH configurations seamlessly
- 🏷️ Tag Support - Organize your hosts with custom tags for better categorization
- 🔍 Smart Search - Find hosts quickly with built-in filtering and search
- 🔒 Secure - Works directly with your existing
~/.ssh/configfile - 📁 Custom Config Support - Use any SSH configuration file with the
-cflag - ⚙️ SSH Options Support - Add any SSH configuration option through intuitive forms
- 🔄 Automatic Conversion - Seamlessly converts between command-line and config formats
🛠️ Management Operations
- Add new SSH hosts with interactive forms
- Edit existing configurations in-place
- Delete hosts with confirmation prompts
- Port forwarding setup with intuitive interface for Local (-L), Remote (-R), and Dynamic (-D) forwarding
- Backup configurations automatically before changes
- Validate settings to prevent configuration errors
- ProxyJump support for secure connection tunneling through bastion hosts
- SSH Options management - Add any SSH option with automatic format conversion
- Full SSH compatibility - Maintains compatibility with standard SSH tools
🎮 User Experience
- Zero configuration - Works out of the box with your existing SSH setup
- Keyboard shortcuts for power users
- Cross-platform - Supports Linux, macOS (Intel & Apple Silicon), and Windows
- Lightweight - Single binary with no dependencies
🚀 Quick Start
Installation
Unix/Linux/macOS (One-line install):
curl -sSL https://raw.githubusercontent.com/Gu1llaum-3/sshm/main/install/unix.sh | bash
Windows (PowerShell):
irm https://raw.githubusercontent.com/Gu1llaum-3/sshm/main/install/windows.ps1 | iex
Alternative methods:
Linux/macOS:
# Download specific release
wget https://github.com/Gu1llaum-3/sshm/releases/latest/download/sshm-linux-amd64.tar.gz
# Extract and install
tar -xzf sshm-linux-amd64.tar.gz
sudo mv sshm-linux-amd64 /usr/local/bin/sshm
Windows:
# Download and extract
Invoke-WebRequest -Uri "https://github.com/Gu1llaum-3/sshm/releases/latest/download/sshm-windows-amd64.zip" -OutFile "sshm-windows-amd64.zip"
Expand-Archive sshm-windows-amd64.zip -DestinationPath C:\tools\
# Add C:\tools to your PATH environment variable
📖 Usage
Interactive Mode
Launch SSHM without arguments to enter the beautiful TUI interface:
sshm
Navigation:
↑/↓orj/k- Navigate hostsEnter- Connect to selected hosta- Add new hoste- Edit selected hostd- Delete selected hostf- Port forwarding setupq- Quit/- Search/filter hosts
Sorting & Filtering:
s- Switch between sorting modes (name ↔ last login)n- Sort by name (alphabetical)r- Sort by recent (last login time)Tab- Cycle between filtering modes- Filter by name (default) - Search through host names
- Filter by last login - Sort and filter by most recently used connections
The interactive forms will guide you through configuration:
- Hostname/IP - Server address
- Username - SSH user
- Port - SSH port (default: 22)
- Identity File - Private key path
- ProxyJump - Jump server for connection tunneling
- SSH Options - Additional SSH options in
-oformat (e.g.,-o Compression=yes -o ServerAliveInterval=60) - Tags - Comma-separated tags for organization
Port Forwarding
SSHM provides an intuitive interface for setting up SSH port forwarding. Press f while selecting a host to open the port forwarding setup:
Forward Types:
-
Local (-L) - Forward a local port to a remote host/port through the SSH connection
- Example: Access a remote database on
localhost:5432via local port15432 - Use case:
ssh -L 15432:localhost:5432 server→ Database accessible onlocalhost:15432
- Example: Access a remote database on
-
Remote (-R) - Forward a remote port back to a local host/port
- Example: Expose local web server on remote host's port
8080 - Use case:
ssh -R 8080:localhost:3000 server→ Local app accessible from remote host's port 8080 - ⚠️ Requirements for external access:
- SSH Server Config: Add
GatewayPorts yesto/etc/ssh/sshd_configand restart SSH service - Firewall: Open the remote port in the server's firewall (
ufw allow 8080or equivalent) - Port Availability: Ensure the remote port is not already in use
- Bind Address: Use
0.0.0.0for external access,127.0.0.1for local-only
- SSH Server Config: Add
- Example: Expose local web server on remote host's port
-
Dynamic (-D) - Create a SOCKS proxy for secure browsing
- Example: Route web traffic through the SSH connection
- Use case:
ssh -D 1080 server→ Configure browser to uselocalhost:1080as SOCKS proxy - ⚠️ Configuration requirements:
- Browser Setup: Configure SOCKS v5 proxy in browser settings
- DNS: Enable "Proxy DNS when using SOCKS v5" for full privacy
- Applications: Only SOCKS-aware applications will use the proxy
- Bind Address: Use
127.0.0.1for security (local access only)
Port Forwarding Interface:
- Choose forward type with ←/→ arrow keys
- Configure ports and addresses with guided forms
- Optional bind address configuration (defaults to 127.0.0.1)
- Real-time validation of port numbers and addresses
- Connect automatically with configured forwarding options
Troubleshooting Port Forwarding:
Remote Forwarding Issues:
# Error: "remote port forwarding failed for listen port X"
# Solutions:
1. Check if port is already in use: ssh server "netstat -tln | grep :X"
2. Use a different port that's available
3. Enable GatewayPorts in SSH config for external access
SSH Server Configuration for Remote Forwarding:
# Edit SSH daemon config on the server:
sudo nano /etc/ssh/sshd_config
# Add or uncomment:
GatewayPorts yes
# Restart SSH service:
sudo systemctl restart sshd # Ubuntu/Debian/CentOS 7+
# OR
sudo service ssh restart # Older systems
Firewall Configuration:
# Ubuntu/Debian (UFW):
sudo ufw allow [port_number]
# CentOS/RHEL/Rocky (firewalld):
sudo firewall-cmd --add-port=[port_number]/tcp --permanent
sudo firewall-cmd --reload
# Check if port is accessible:
telnet [server_ip] [port_number]
Dynamic Forwarding (SOCKS) Browser Setup:
Firefox: about:preferences → Network Settings
- Manual proxy configuration
- SOCKS Host: localhost, Port: [your_port]
- SOCKS v5: ✓
- Proxy DNS when using SOCKS v5: ✓
Chrome: Launch with proxy
chrome --proxy-server="socks5://localhost:[your_port]"
CLI Usage
SSHM provides both command-line operations and an interactive TUI interface:
# Launch interactive TUI mode for browsing and connecting to hosts
sshm
# Launch TUI with custom SSH config file
sshm -c /path/to/custom/ssh_config
# Add a new host using interactive form
sshm add
# Add a new host with pre-filled hostname
sshm add hostname
# Add a new host with custom SSH config file
sshm add hostname -c /path/to/custom/ssh_config
# Edit an existing host configuration
sshm edit my-server
# Edit host with custom SSH config file
sshm edit my-server -c /path/to/custom/ssh_config
# Show version information
sshm --version
# Show help and available commands
sshm --help
Configuration File Options
By default, SSHM uses the standard SSH configuration file at ~/.ssh/config. You can specify a different configuration file using the -c flag:
# Use custom config file in TUI mode
sshm -c /path/to/custom/ssh_config
# Use custom config file with commands
sshm add hostname -c /path/to/custom/ssh_config
sshm edit hostname -c /path/to/custom/ssh_config
Platform-Specific Notes
Windows:
- SSHM works with the built-in OpenSSH client (Windows 10/11)
- Configuration file location:
%USERPROFILE%\.ssh\config - Compatible with WSL SSH configurations
- Supports the same SSH options as Unix systems
Unix/Linux/macOS:
- Standard SSH configuration file:
~/.ssh/config - Full compatibility with OpenSSH features
- Preserves file permissions automatically
🏗️ Configuration
SSHM works directly with your standard SSH configuration file (~/.ssh/config). It adds special comment tags for enhanced functionality while maintaining full compatibility with standard SSH tools.
Example configuration:
# Tags: production, web, frontend
Host web-prod-01
HostName 192.168.1.10
User deploy
Port 22
IdentityFile ~/.ssh/production_key
Compression yes
ServerAliveInterval 60
# Tags: development, database
Host db-dev
HostName dev-db.company.com
User admin
Port 2222
IdentityFile ~/.ssh/dev_key
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
# Tags: production, backend
Host backend-prod
HostName 10.0.1.50
User app
Port 22
ProxyJump bastion.company.com
IdentityFile ~/.ssh/production_key
Compression yes
ServerAliveInterval 300
BatchMode yes
Supported SSH Options
SSHM supports all standard SSH configuration options:
Built-in Fields:
HostName- Server hostname or IP addressUser- Username for SSH connectionPort- SSH port numberIdentityFile- Path to private key fileProxyJump- Jump server for connection tunneling (e.g.,user@jumphost:port)Tags- Custom tags (SSHM extension)
Additional SSH Options:
You can add any valid SSH option using the "SSH Options" field in the interactive forms. Enter them in command-line format (e.g., -o Compression=yes -o ServerAliveInterval=60) and SSHM will automatically convert them to the proper SSH config format.
Common SSH Options:
Compression- Enable/disable compression (yes/no)ServerAliveInterval- Interval in seconds for keepalive messagesServerAliveCountMax- Maximum number of keepalive messagesStrictHostKeyChecking- Host key verification (yes/no/ask)UserKnownHostsFile- Path to known hosts fileBatchMode- Disable interactive prompts (yes/no)ConnectTimeout- Connection timeout in secondsControlMaster- Connection multiplexing (yes/no/auto)ControlPath- Path for control socketControlPersist- Keep connection alive durationForwardAgent- Forward SSH agent (yes/no)LocalForward- Local port forwarding (e.g.,8080:localhost:80)RemoteForward- Remote port forwardingDynamicForward- SOCKS proxy port forwarding
Example usage in forms:
SSH Options: -o Compression=yes -o ServerAliveInterval=60 -o StrictHostKeyChecking=no
This will be automatically converted to:
Compression yes
ServerAliveInterval 60
StrictHostKeyChecking no
🛠️ Development
Prerequisites
- Go 1.23+
- Git
Build from Source
# Clone the repository
git clone https://github.com/Gu1llaum-3/sshm.git
cd sshm
# Build the binary
go build -o sshm .
# Run
./sshm
Project Structure
sshm/
├── main.go # Application entry point
├── cmd/ # CLI commands (Cobra)
│ ├── root.go # Root command and interactive mode
│ ├── add.go # Add host command
│ ├── edit.go # Edit host command
│ └── search.go # Search command
├── internal/
│ ├── config/ # SSH configuration management
│ │ └── ssh.go # Config parsing and manipulation
│ ├── history/ # Connection history tracking
│ │ └── history.go # History management and last login tracking
│ ├── ui/ # Terminal UI components (Bubble Tea)
│ │ ├── tui.go # Main TUI interface and program setup
│ │ ├── model.go # Core TUI model and state
│ │ ├── update.go # Message handling and state updates
│ │ ├── view.go # UI rendering and layout
│ │ ├── table.go # Host list table component
│ │ ├── add_form.go # Add host form interface
│ │ ├── edit_form.go# Edit host form interface
│ │ ├── styles.go # Lip Gloss styling definitions
│ │ ├── sort.go # Sorting and filtering logic
│ │ └── utils.go # UI utility functions
│ └── validation/ # Input validation
│ └── ssh.go # SSH config validation
├── images/ # Documentation assets
│ ├── logo.png # Project logo
│ └── sshm.gif # Demo animation
├── install/ # Installation scripts
│ ├── unix.sh # Unix/Linux/macOS installer
│ └── README.md # Installation guide
├── .github/ # GitHub configuration
│ ├── copilot-instructions.md # Development guidelines
│ └── workflows/ # CI/CD pipelines
│ └── build.yml # Multi-platform builds
├── go.mod # Go module definition
├── go.sum # Go module checksums
├── LICENSE # MIT license
└── README.md # Project documentation
Dependencies
- Cobra - CLI framework
- Bubble Tea - TUI framework
- Bubbles - TUI components
- Lipgloss - Styling
📦 Releases
Automated releases are built for multiple platforms:
| Platform | Architecture | Download |
|---|---|---|
| Linux | AMD64 | sshm-linux-amd64.tar.gz |
| Linux | ARM64 | sshm-linux-arm64.tar.gz |
| macOS | Intel | sshm-darwin-amd64.tar.gz |
| macOS | Apple Silicon | sshm-darwin-arm64.tar.gz |
| Windows | AMD64 | sshm-windows-amd64.zip |
| Windows | ARM64 | sshm-windows-arm64.zip |
🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
Development Workflow
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
📝 License
This project is licensed under the MIT License - see the LICENSE file for details.
🙏 Acknowledgments
- Charm for the amazing TUI libraries
- Cobra for the excellent CLI framework
- The Go community for building such fantastic tools
Made with ❤️ by Guillaume
⭐ Star this repo if you found it useful! ⭐
