sshelf: keep all your SSH hosts one fuzzy-search away

sshelf: keep all your SSH hosts one fuzzy-search away

sshelf (Rust, MIT/Apache-2.0, v0.2.0, 33★) is a terminal UI for managing SSH hosts — fuzzy-search to filter, Enter to connect. It maintains its own database and generates ssh commands rather than reading or writing ~/.ssh/config, keeping it decoupled from Ansible and other tooling that touches that file. Supports tag filtering, jump-host chains, frecency sorting, and OS-keychain password autofill. Gained +8 stars in 24 hours with active community PR contributions.

CLI Tool Pick
2026/6/14 · 1:16
購読 2 件 · コンテンツ 29 件
You have forty SSH hosts. Prod cluster nodes, staging boxes, a handful of legacy gear, three jump hosts you can never quite remember the right sequence for. They're all in ~/.ssh/config — which Ansible also writes, your team's shared tooling also reads, and you're not supposed to touch by hand. So when you need to get onto prod-db-07, you tab-complete into the config, visually scan past twelve similarly-named entries, copy the hostname, and finally run the command. Every time.
sshelf treats this as a solved problem: add a host once, fuzzy-search it later, press Enter to connect. 1
コンテンツカードを読み込んでいます…
The author, max-rh, described the motivation directly: "Built this after one too many 'which key/port/jump host was that again' moments across prod, staging, and a stack of legacy gear." 2 And the design summary: "It's k9s-style but for ssh: hosts saved once, fuzzy-search, enter to connect." 2
MIT OR Apache-2.0. v0.2.0, released 2026-06-07. Written in Rust, using ratatui and clap. 3

The key architectural decision

sshelf maintains its own database and generates the correct ssh commands rather than reading from or writing to ~/.ssh/config. 1
That's a deliberate choice. As max-rh explained: "It maintains its own database and generates ssh commands, rather than rewriting ~/.ssh/config (I don't want another writer on a file that Ansible and half my toolchain already reads)." 2
The practical upside: sshelf's host list is fully independent of your config file. Adding a host in sshelf doesn't affect what your deployment tooling sees. Removing one from sshelf doesn't delete your config entry. They're decoupled.

What's in the TUI

The interface is a fuzzy-searchable list of hosts. Type to filter, arrow-key to select, Enter to open the connection. Beyond that:
  • Tag filtering — group hosts by environment, project, or anything else; filter to a tag before searching
  • Jump host chains — define multi-hop paths; sshelf assembles the full -J flag sequence for you
  • Frecency sorting — hosts you connect to often and recently float to the top; you don't need to maintain a manual order
  • Password autofill via SSH_ASKPASS — credentials stored in the OS keychain, retrieved transparently on connect 1
No AI dependencies. No cloud component. Pure Rust, runs entirely offline.

A real scenario

You're oncall. An alert fires at 11 PM. You need to get onto prod-worker-03, then jump through bastion-us-east to reach a database node that's not directly reachable. The hostnames are long, the jump-host syntax is ssh -J bastion-us-east user@prod-db-internal-07, and you haven't touched that box in six weeks.
Open sshelf. Type prod-db. Two matches appear. The right one has a tag prod and frecency from the last incident puts it second in the filtered list. Select it, press Enter. sshelf assembles the full jump-host chain and opens the connection. You're in within ten seconds of the alert. 1
The scenario also works in the other direction — if you're spinning down a project and want to remove a dozen stale hosts from your inventory, you do it in sshelf without touching the config file that your Ansible playbooks depend on.

Demo

sshelf TUI: fuzzy-search across SSH hosts with frecency sorting and two-keystroke connection
sshelf in action — fuzzy-search and connect, from the project's GitHub README 1

Install

Four paths, pick one:
Homebrew (macOS and Linux, fastest):
brew install max-rh/tap/sshelf
Shell script (pre-built binary, no Homebrew required):
curl -fsSL https://raw.githubusercontent.com/max-rh/sshelf/master/install.sh | bash
Debian/Ubuntu (.deb package):
Download the .deb from the releases page and install with dpkg -i.
Cargo (build from source, requires Rust 1.88+):
cargo install --git https://github.com/max-rh/sshelf
Pre-built binaries cover macOS (x86_64 + ARM64) and Linux (x86_64 + ARM64). No Windows binary yet, though a source build via cargo works on Windows. 3

Momentum

33 stars as of June 13 — up from 25 the day before, +8 in 24 hours. 1 The Reddit post on r/tui (18k subscribers) pulled 77 upvotes. 2
Community contributor BeneficialBig8372 submitted two PRs on June 12 — the kind of early external contribution that rarely happens before a project has found its audience. max-rh confirmed on June 13 they'd be merged: "Thanks alot for the contribution, I liked it. Left you a comment; will merge it afterwards 😄" 2
統計カードを読み込んでいます…

Caveats

  • 9 commits, v0.2.0. The tool is new. The core feature set works cleanly, but expect rough edges in edge-case host configurations. File issues — the author is clearly active.
  • No ~/.ssh/config import. If you have 80 hosts already defined in your config, you'll add them to sshelf manually. There's no bulk-import from an existing config file (yet).
  • Source builds need Rust 1.88+. The Homebrew formula and pre-built binaries sidestep this entirely; it only matters if you're building from source on an older toolchain.
  • No team/shared inventory yet. max-rh mentioned considering optional shared host lists with access control for teams, but that's a future direction, not a current feature. For now this is a single-user tool. 2
Install: brew install max-rh/tap/sshelf
Cover image: from the sshelf GitHub README

このコンテンツについて、さらに観点や背景を補足しましょう。

  • ログインするとコメントできます。