Browse by type
<img src="https://github.com/Gu1llaum-3/sshm/raw/v1.11.0/images/logo.png" alt="SSHM Logo" width="120" />
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.
<a href="https://github.com/Gu1llaum-3/sshm/raw/v1.11.0/images/sshm.gif" target="_blank">
<img src="https://github.com/Gu1llaum-3/sshm/raw/v1.11.0/images/sshm.gif" alt="Demo SSHM Terminal" width="800" />
</a>
<em>🖱️ Click on the image to view in full size</em>
sshm <host>hidden tag to exclude hosts from the list while keeping them connectable~/.ssh/config file-c flagHomebrew (Recommended for macOS):
brew install Gu1llaum-3/sshm/sshm
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
Launch SSHM without arguments to enter the beautiful TUI interface:
sshm
Navigation:
- ↑/↓ or j/k - Navigate hosts
- Enter - Connect to selected host
- a - Add new host
- e - Edit selected host
- d - Delete selected host
- m - Move host to another config file (requires SSH Include directives)
- f - Port forwarding setup
- H - Toggle hidden hosts visibility
- q - Quit
- / - Search/filter hosts
Real-time Status Indicators: - 🟢 Online - Host is reachable via SSH - 🟡 Connecting - Currently checking host connectivity - 🔴 Offline - Host is unreachable or SSH connection failed - ⚫ Unknown - Connectivity status not yet determined
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
- ProxyCommand - Jump command for connection tunneling
- SSH Options - Additional SSH options in -o format (e.g., -o Compression=yes -o ServerAliveInterval=60)
- Tags - Comma-separated tags for organization
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:5432 via local port 15432
- Use case: ssh -L 15432:localhost:5432 server → Database accessible on localhost:15432
8080ssh -R 8080:localhost:3000 server → Local app accessible from remote host's port 8080⚠️ Requirements for external access:
GatewayPorts yes to /etc/ssh/sshd_config and restart SSH serviceufw allow 8080 or equivalent)0.0.0.0 for external access, 127.0.0.1 for local-onlyDynamic (-D) - Create a SOCKS proxy for secure browsing
ssh -D 1080 server → Configure browser to use localhost:1080 as SOCKS proxy127.0.0.1 for 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 - Port forwarding history - Save frequently used configurations for quick reuse - 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]"
SSHM provides both command-line operations and an interactive TUI interface:
# Launch interactive TUI mode for browsing and connecting to hosts
sshm
# Connect directly to a specific host (with history tracking)
sshm my-server
# Execute a command on a remote host
sshm my-server uptime
# Execute command with arguments
sshm my-server ls -la /var/log
# Force TTY allocation for interactive commands
sshm -t my-server sudo systemctl restart nginx
# Launch TUI with custom SSH config file
sshm -c /path/to/custom/ssh_config
# Connect directly with custom SSH config file
sshm my-server -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
# Move a host to another SSH config file (requires Include directives)
sshm move my-server
# Move host with custom SSH config file (requires Include directives)
sshm move my-server -c /path/to/custom/ssh_config
# Search for hosts (interactive filter)
sshm search
# Print machine-readable info (JSON) for scripting
sshm info prod-server
sshm info prod-server --pretty
# With a custom SSH config file
sshm -c /path/to/custom/ssh_config info prod-server
# Pipe to jq
sshm info prod-server | jq -r '.result.target.hostname'
sshm info prod-server | jq -r '.result.target.user'
# Show version information
sshm --version
# Disable automatic update check (useful on air-gapped machines)
sshm --no-update-check
# Show help and available commands
sshm --help
sshm info <hostname> prints a single JSON object to stdout so you can script against it with jq.
# Extract fields
sshm info prod-server | jq -r '.result.target.hostname'
sshm info prod-server | jq -r '.result.target.port'
# Check not-found (exit code 2)
sshm info does-not-exist | jq -r '.error.code'
SSHM supports shell completion for host names, making it easy to connect to hosts without typing full names:
sshm <TAB> # Lists all available hosts
sshm pro<TAB> # Completes to hosts starting with "pro" (e.g., prod-server)
Setup Instructions:
Bash:
# Enable for current session
source <(sshm completion bash)
# Enable permanently (add to ~/.bashrc)
echo 'source <(sshm completion bash)' >> ~/.bashrc
Zsh:
# Enable for current session
source <(sshm completion zsh)
# Enable permanently (add to ~/.zshrc)
echo 'source <(sshm completion zsh)' >> ~/.zshrc
Fish:
# Enable for current session
sshm completion fish | source
# Enable permanently
sshm completion fish > ~/.config/fish/completions/sshm.fish
PowerShell:
# Enable for current session
sshm completion powershell | Out-String | Invoke-Expression
# Enable permanently (add to your PowerShell profile)
Add-Content $PROFILE 'sshm completion powershell | Out-String | Invoke-Expression'
SSHM supports direct connection to hosts via the command line, making it easy to integrate into your existing workflow:
# Connect directly to any configured host
sshm production-server
sshm db-staging
sshm web-01
# All direct connections are tracked in your history
# Use the TUI to see your most recently connected hosts
Features of Direct Connection:
- Instant connection - No TUI navigation required
- History tracking - All connections are recorded with timestamps
- Error handling - Clear messages if host doesn't exist or configuration issues
- Config file support - Works with custom config files using -c flag
Execute commands on remote hosts without opening an interactive shell:
# Execute a single command
sshm prod-server uptime
# Execute command with arguments
sshm prod-server ls -la /var/log
# Check disk usage
sshm prod-server df -h
# View logs (pipe to local commands)
sshm prod-server 'cat /var/log/nginx/access.log' | grep 404
# Force TTY allocation for interactive commands (sudo, vim, etc.)
sshm -t prod-server sudo systemctl restart nginx
Features:
- Exit code propagation - Remote command exit codes are passed through
- TTY support - Use -t flag for commands requiring terminal interaction
- Pipe-friendly - Output can be piped to local commands for processing
- History tracking - Command executions are recorded in connection history
SSHM automatically creates backups of your SSH configuration files before making any changes to ensure your configurations are safe.
Backup Location:
- Unix/Linux/macOS: ~/.config/sshm/backups/ (or $XDG_CONFIG_HOME/sshm/backups/ if set)
- Windows: %APPDATA%\sshm\backups\ (fallback: %USERPROFILE%\.config\sshm\backups\)
Key Features: - Automatic backup before any modification - One backup per file (overwrites previous backup) - Stored separately to avoid SSH Include conflicts - Easy manu