CLI-first SSH tunnel manager for local, remote, and dynamic forwards.
- Manage multiple SSH tunnels from one config file
- Reuse named SSH connections across multiple tunnels
- Tunnel types:
local,remote,dynamic sshelob run allorsshelob run 1,2,3to start selected tunnels- Optional passphrase prompts for encrypted SSH private keys (once per connection)
- Plain-text lifecycle logging to stdout (connect, reconnect, error)
- Exponential auto-reconnect (1s initial, 2x backoff, max 30s, retries until stopped)
- Commands:
list,run,version,update
go install github.com/danilbrenner/sshelob/cmd/sshelob@latestgit clone https://github.com/danilbrenner/sshelob.git
cd sshelob
make build
./build/sshelob versionLinux/macOS:
curl -fsSL https://raw.githubusercontent.com/danilbrenner/sshelob/master/get.sh -o get.sh
sh get.sh
rm get.sh
./sshelob versionWindows (PowerShell):
Invoke-WebRequest https://raw.githubusercontent.com/danilbrenner/sshelob/master/get.ps1 -OutFile get.ps1
.\get.ps1
Remove-Item .\get.ps1
.\sshelob.exe versionBoth scripts detect your OS/architecture, download the latest GitHub release asset, and unpack the binary in the current directory.
By default, sshelob reads:
~/.config/sshelob/config.yml
You can override this with:
sshelob --config /path/to/config.yml listconnections:
- name: bastion-main
host: bastion.example.com
user: alice
port: 22
key_path: ~/.ssh/id_ed25519
use_passphrase: false
tunnels:
- name: postgres-local
type: local
connection: bastion-main
bind_addr: "127.0.0.1:5433"
dest_addr: "db.internal:5432"
health_check:
interval: 10s
timeout: 3s
- name: socks-proxy
type: dynamic
connection: bastion-main
bind_addr: "127.0.0.1:1080"Field notes:
connectionsmust include at least one named SSH connection- connection fields:
name,host,user,port,key_path, and optionaluse_passphrase - each tunnel must set
connectionto a valid connection name typemust be one oflocal,remote, ordynamicdest_addris required forlocalandremote; it must be omitted fordynamicbind_addris the local bind forlocal/dynamicand the remote bind forremote
If use_passphrase: true is set on a connection, sshelob run ... prompts for that connection passphrase before starting its tunnels.
# Show configured tunnels
sshelob list
# Run specific tunnels by 1-based index
sshelob run 1,2
# Run all configured tunnels
sshelob run all
# Print build/version metadata
sshelob versionUpgrade to the latest stable GitHub release:
sshelob updateOn success, sshelob prints the installed tag (for example: updated sshelob to v0.1.0).