| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
The only SSH connection management tool you'll ever need. CLI & TUI. No dependencies, no manual file editing.
Four core features: Create, Connect, Edit, Delete. Dead-simple and cross-platform.
Store connections in SQLite, your ssh_config file, or both — your choice.
Passwords are encrypted using a master passphrase (you should consider using pubkeys only tho ;)).
📚 Full docs: dssh.grolmes.com
Core:
Also:
dssh is a thin wrapper around your system's ssh binary:
┌──────────────┐ read/write ┌──────────────────────┐
│ dssh (CLI │◄───────────────►│ ~/.dssh/dssh.db │
│ or TUI) │ │ • connections │
└──────┬───────┘ │ • encrypted passes │
│ └──────────────────────┘
│ key auth: syscall.Exec → ssh (zero overhead)
│ pw auth: fork ssh + SSH_ASKPASS script
▼
┌──────────────┐
│ ssh │────► remote host
└──────────────┘
More on the security model and configuration in the docs.
On first launch, dssh asks you to choose a connection mode:
| Mode | Description |
|---|---|
| SQLite only | Connections stored in ~/.dssh/dssh.db (default) |
| ssh_config only | Connections read from and written to your ssh_config file |
| Both | Use SQLite and ssh_config side by side, toggle with CTRL+L |
When using ssh_config or both, you pick a destination file:
If the file doesn't exist, dssh offers to create it for you.
Change your mode anytime with dssh config. View current settings with dssh config get (or dssh config show).
Note: Password auth is only available when saving to SQLite. ssh_config entries always use key auth.
| Command | Description |
|---|---|
| dssh | Launch interactive connection picker |
| dssh <name> | Connect to a saved host by name |
| dssh <name> -- <args> | Connect with extra args forwarded to ssh |
| dssh connect <name> -- <args> | Explicitly connect by name (including a connection named group) |
| dssh add [-p PORT] [-d DIR] [-J JUMP] [--group GROUP] <name> <target> [password] | Save a new connection |
| dssh rm <name> | Delete a saved connection |
| dssh list / dssh ls | List connections; supports --group, --ungrouped, and --json |
| dssh group list [--json] | List groups and source-scoped membership counts |
| dssh group create NAME | Create a group |
| dssh group rename NAME NEW_NAME | Rename a group |
| dssh group delete NAME | Delete a group and its memberships (not connections) |
| dssh group assign GROUP CONNECTION... | Assign connections to a group in one selected source |
| dssh group unassign GROUP CONNECTION... | Remove connections from a group in one selected source |
| dssh create / dssh new | Interactive form to create a connection |
| dssh edit | Edit an existing connection |
| dssh delete | Delete a connection (TUI, triple-confirm) |
| dssh config | Configure connection mode (SQLite / ssh_config / both) |
| dssh config get / dssh config show | Show current configuration |
| dssh reset | Delete all data (double confirmation) |
| dssh --version | Print version |
| Key | Action |
|---|---|
| Tab / Shift+Tab | Switch between the left connection pane and right group pane |
| ← / → | Switch between tabs (Connect / Edit list / Delete always; Create / Edit forms when on an empty field, the Save button, or the Save-To toggle) |
| ↑ / ↓ | Navigate lists / move between form fields |
| Enter | Select / confirm |
| Space | Toggle a group assignment in Create / Edit |
| Ctrl+N | Create a group from the right pane |
| Ctrl+R | Rename the selected group |
| Ctrl+D | Delete the selected group (connections are kept) |
| Ctrl+L | Toggle SQLite / ssh_config list (both mode) |
| Ctrl+P | Hide / show the right pane |
| Ctrl+T | Toggle key / password auth (create/edit) |
| Ctrl+S | Save a new or edited connection from either pane |
| ? | Hide / show key hints |
| ESC / Ctrl+C | Quit |
The right pane filters the connection list as soon as you select a group. Selecting (No Groups) shows all connections.
A terminal size of at least 80×20 is required.
# Add a connection (will use default pubkey identity)
dssh add myserver root@192.168.1.10
# Add it to an existing group
dssh add --group Production myserver root@192.168.1.10
# Connect
dssh myserver
# You're in!
# Permanently delete the connection (no confirmation asked)
dssh rm myserver# Open the TUI where you can basically do anything
dsshRun dssh with no arguments to launch the TUI.
# user@host (port 22 by default)
dssh add myserver root@192.168.1.10
# Custom port
dssh add myserver -p 2222 root@192.168.1.10
# SSH URI syntax
dssh add myserver ssh://root@192.168.1.10:2222
# Start in a specific remote directory
dssh add myserver -d /var/www root@192.168.1.10
# Through a jump host (ProxyJump / ssh -J)
dssh add db01 -J jumpuser@bastion.example.com dbadmin@10.0.1.50
# Through a chain of jump hosts
dssh add db01 -J jump1.example.com,jump2.example.com dbadmin@10.0.1.50
# With password (will prompt for master passphrase)
dssh add myserver root@192.168.1.10 'my-ssh-password'# Direct connect by name
dssh myserver
# Pass extra args to ssh
dssh myserver -- -v -L 8080:localhost:80
# Explicit form; use this if a connection is named "group"
dssh connect myserver -- -vLaunch the TUI wizard to create a connection interactively.
dssh create
dssh new # aliasThe wizard supports both key-based and password-based authentication. For password auth, you'll be prompted to create a master passphrase on first use.
Launch the TUI directly on the Edit tab to modify an existing connection.
dssh editLaunch the TUI directly on the Delete tab. Requires pressing Enter 3 times on the same item to confirm.
dssh deletedssh list
dssh ls # alias
# Filter by one or more groups, or return safe machine-readable fields
dssh list --group Production --group Staging
dssh list --ungrouped --jsonNAME USER HOST PORT AUTH DIR JUMP mike-pulse-001 nomad 10.51.140.154 22 key - - myserver root 192.168.1.10 22 password - - rpg-server npc 192.168.188.7 22222 key /var/larp - sharp-nexus-001 deploy 10.105.210.233 22 key - jumpuser@bastion skylink root skylink.vps 22 key - -
dssh rm myserverRemove a connection instantly. No confirmation asked.
Groups are optional organization. A connection may be in one, multiple or no groups. Deleting a group removes its memberships, never connections.
You need to create groups before you can use them. Names are case-insensitive.
Groups are source-aware: Groups metadata is always stored in SQLite DB, including for ssh_config connections. The same connection name in each source can have different groups.
# Create "Production" group
dssh group create Production
# Rename "Production" group to "Live" (group names are case-insensitive)
dssh group rename production Live
# List groups with counts for the active source(s)
dssh group list
# List all groups in JSON format
dssh group list --json
# Add new connection "api" with user "deploy" and host "api.example" to existing group "Live"
dssh add --group Live api deploy@api.example
# Delete group "Live" (connection is not deleted)
dssh group delete LiveBatch assign/unassign is atomic - meaning all groups and all connections must exist or else the batch fails.
# Assign connections "api" & "worker" to group "Production"
dssh group assign Production api worker
# Unassign connections "api" & "worker" from group "Production"
dssh group unassign Production workerIn both parse mode either --sqlite or --sshconfig is required.
# List connections from groups "Production" and "Staging"
dssh list --group Production --group Staging
# List all ungrouped connections
dssh list --ungrouped
# List connections from group "Production" in JSON format
dssh list --group Production --jsonRepeat --group on list for OR filtering.
dssh connect groupSwitch between SQLite, ssh_config, or both at any time.
dssh configView current settings:
dssh config getparse_mode: both ssh_config_parse_destination: ~/.ssh/config.d/dssh parse_both_view_mode: sqlite parse_both_default_save_target: sqlite
Wipe all saved connections, encrypted passwords, groups, assignments, and settings (deletes the SQLite database). Requires two confirmations to prevent accidents.
dssh resetThis will delete ALL saved connections, passwords, and settings. Continue? (yes/no): yes Are you sure? This cannot be undone. Type 'reset' to confirm: reset All data has been reset
yay -S dsshparu -S dsshOther package managers following soon!
brew install madLinux7/tap/dsshwinget install madLinux.dssh# add scoop bucket (if not done already)
scoop bucket add madLinux7_scoop-bucket https://github.com/madLinux7/scoop-bucket
# install dssh
scoop install madLinux7_scoop-bucket/dsshLinux / macOS / FreeBSD:
curl -fsSL https://raw.githubusercontent.com/madLinux7/dssh/main/install.sh | shInstalls to ~/.local/bin by default. Override with INSTALL_DIR=/custom/path.
Windows (PowerShell):
irm https://raw.githubusercontent.com/madLinux7/dssh/main/install.ps1 | iexInstalls to %LOCALAPPDATA%\dssh and adds it to your PATH automatically.
Download the latest binary for your platform from Releases and place it in your $PATH.
# Example for Linux amd64
curl -L https://github.com/madLinux7/dssh/releases/latest/download/dssh-linux-amd64 -o dssh
chmod +x dssh
sudo mv dssh /usr/local/bin/Requires Go 1.26+.
go install github.com/madLinux7/dssh/cmd/dssh@latestgit clone https://github.com/madLinux7/dssh.git
cd dssh
# Build only with optimized -ldflags
make build
# Build and compress binary (upx needed)
make releaseFull docs live at dssh.grolmes.com:
PRs welcome. See the Contributing guide for the dev loop, package layout, and PR checklist.
Bugs and feature requests: github.com/madLinux7/dssh/issues. Security disclosures: please use GitHub's Security advisory flow — don't file in the public tracker.
dssh has no need for reinventing the wheel — thanks to the maintainers and contributors of these amazing projects:
| Back | FazBrowse Home | New Git URL |