README.mdfork it — it’s yours
Multiplex your SSH connections with style
SSHplex is a Python-based SSH connection multiplexer with a modern TUI. Connect to multiple hosts simultaneously using tmux or iTerm2, with sources from NetBox, Ansible, Consul, or static lists.
Features
- 🖥️ Modern TUI - Textual-based host selector with search, sort, and multi-select
- 🔌 Multiple Sources - NetBox, Ansible, Consul, static lists - use them together
- 📦 3 Mux Backends - tmux standalone, tmux + iTerm2, or iTerm2 native (macOS)
- ✏️ Config Editor - Built-in editor with compact source cards, static host rows, and full YAML pane
- 🔄 Broadcast Input - Sync commands across multiple SSH sessions
- 🔐 SSH Security - Configurable host key checking and retry logic
- 🚀 Fast Startup - Intelligent caching with configurable TTL
Quick Start
# Install pip install sshplex # First-time setup (interactive wizard) sshplex --onboarding # Launch TUI sshplex
Prerequisites
- Python 3.10+
- tmux (Linux/macOS) and/or iTerm2 (macOS)
- SSH key configured for target hosts
Multiplexer Backends
| Backend | Platform | Best For |
|---|---|---|
| tmux | Linux, macOS | Maximum compatibility, persistence |
| tmux + iTerm2 | macOS | Native UI + persistence |
| iTerm2 native | macOS | Simple setup, no tmux dependency |
Sources of Truth
| Provider | type |
Extra Dependency | Best For |
|---|---|---|---|
| Static | static |
None | Small lists, lab hosts, quick manual entries |
| NetBox | netbox |
None (included in base install) | Inventory-driven infrastructure with metadata |
| Ansible | ansible |
None | Reusing existing Ansible inventory files |
| Consul | consul |
pip install "sshplex[consul]" |
Service discovery and dynamic node catalogs |
| Git | git |
git binary in PATH |
Git-backed inventories with auto-pull (static or ansible YAML) |
Provider activation is controlled by sot.providers, and each source is configured as an item in sot.import.
Use multiple git imports and tune priority for deterministic overrides.
Local Demo (Consul + Ansible)
This repo includes a small demo setup that uses the same IP (192.168.31.216) with different host names.
# Start Consul + seed 3 demo nodes docker compose -f demo/docker-compose.consul-demo.yml up -d # Optional: inspect nodes curl -s http://localhost:8500/v1/catalog/nodes | jq
Demo files:
demo/ansible-inventory-demo.ymldemo/docker-compose.consul-demo.ymldemo/sshplex.demo.yaml
Run with the bundled demo config:
sshplex --config demo/sshplex.demo.yaml
Documentation
| Guide | Description |
|---|---|
| Configuration | Full config reference with examples |
| Backends | Multiplexer backend options and setup |
| Troubleshooting | Common issues and solutions |
TUI Keybindings
| Key | Action |
|---|---|
Enter |
Connect to selected hosts |
Space |
Toggle host selection |
s |
Open session manager |
S |
Open snippets picker and send command |
H |
Run host health checks |
f |
Toggle favorite on current host |
v |
Toggle favorites filter |
n |
Toggle recent-hosts filter |
r |
Refresh hosts from sources |
h |
Open in-app help |
Installation Options
# Basic (tmux only) pip install sshplex # With Consul,DEV,Iterm2 support pip install "sshplex[dev,consul,iterm2]"
Development
git clone https://github.com/sabrimjd/sshplex.git cd sshplex pip install -e ".[dev]" # Run tests pytest tests/ -v # Quality checks ruff check sshplex tests mypy sshplex
License
MIT License - see LICENSE for details.
Author
Sabrimjd - @sabrimjd
⭐ Star History
SSHplex - Because managing multiple SSH connections should be simple.
more like this
