
Schnelle Terminal-UI für deine SSH-Hosts: Fuzzy-Suche und Verbindung in zwei Tastendrücken, Dual-Pane-SFTP-Dateiübertragung und Port-Forwarding im Hintergrund. Verwaltet eine eigene Host-Datenbank und generiert den ssh-Befehl – bearbeitet nie ~/.ssh/config.

macOS und Linux, x86_64 und arm64. Die vorgefertigten Pakete benötigen keine Rust-Toolchain. Zur Laufzeit benötigt sshelf OpenSSH 8.4+, denn davon hängt die automatische Passwortbereitstellung ab.
Homebrew (macOS oder Linux):
brew install max-rh/tap/sshelf
Shell-Installer (vorgefertigtes Binary, erkennt Ihre Plattform):
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-rh/sshelf/releases/latest/download/sshelf-installer.sh | sh
Debian/Ubuntu: Laden Sie die .deb-Datei aus dem
aktuellsten Release herunter, dann
sudo apt install ./sshelf_*_amd64.deb (oder *_arm64.deb).
Fedora / RHEL / Rocky / openSUSE: Laden Sie die .rpm-Datei (statischer Build, funktioniert auf jeder RPM-Distribution) aus dem aktuellsten Release herunter, dann
sudo dnf install ./sshelf-*.x86_64.rpm (oder .aarch64.rpm).
Gentoo: Community-gepflegtes Overlay (inoffiziell, Dank an @masterwolf-git). Führen Sie
eselect repository enable masterwolf && emerge --sync && emerge --ask app-admin/sshelf aus.
Cargo (von crates.io; benötigt Rust 1.88+):
cargo install sshelf.
Shell-Tab-Vervollständigung ist in jedem Paket enthalten. Öffnen Sie nach der Installation eine neue Shell. Unter Linux verwenden Geheimnisse ein reines Rust-Secret-Service-Backend (keine libdbus/OpenSSL-Build-Abhängigkeiten).
Vollständige Details und Einrichtung der Vervollständigung: Installationsanleitung.
Ich betreibe ein paar Dutzend Maschinen (ein Homelab, einige VPS, ein paar Rechner hinter einem Bastion), und ich tippte ständig ssh -J bastion -i ~/.ssh/some-key -p 2222 user@host aus dem Gedächtnis oder durchsuchte meine Shell-Historie danach. Jeder SSH-Manager, den ich ausprobierte, wollte entweder ~/.ssh/config besitzen oder mir ein Konto geben und meine Hosts über den Server von jemandem synchronisieren. Ich wollte beides nicht. Ich wollte einen Launcher, der seine eigene Liste führt, den Befehl zusammenbaut und sich aus dem Weg hält. Und einen Ort, um die Passwörter für die wenigen Hosts aufzubewahren, die keine Schlüssel verwenden können, ohne sie jemals in eine Datei zu schreiben. Also habe ich es gebaut.
Tippen zum Filtern. Enter verbindet. Ihre am häufigsten genutzten Hosts steigen von selbst nach oben (Frecency: Nutzungshäufigkeit, abgeschwächt durch Aktualität), und tag:prod / site:homelab grenzen die Liste weiter ein. Ctrl-y kopiert den erstellten Befehl, statt ihn auszuführen. Von der Shell aus verbindet sshelf prod-web per Namen und sshelf - stellt die Verbindung zum letzten Host wieder her – beides ohne die TUI zu öffnen.

exec() in Ihre ssh aussshelf baut das argv aus dem Host-Datensatz auf, fährt seine eigene UI herunter und ersetzt sich dann selbst durch OpenSSH. Es gibt keinen Wrapper zwischen Ihnen und der Sitzung: ein echtes TTY, Ihre ssh, Ihre config-freien Flags. Wenn die Sitzung endet, sind Sie zurück in Ihrer Shell, nicht in einem Menü. Der ausgeführte Befehl ist exakt der, den Ctrl-y Ihnen zeigt.
Wie der Befehl aufgebaut wird.
Ctrl-t öffnet Ihre Dateien links und die des Hosts rechts, über eine einzige authentifizierte Verbindung. Space markiert, Ctrl-a markiert alles, was der Filter anzeigt, Ctrl-s sendet die gesamte Auswahl in beide Richtungen, F7 erstellt ein Verzeichnis. Ein Name, den das Ziel bereits besitzt, wird übersprungen, niemals überschrieben.

Ctrl-f öffnet einen lokalen, entfernten oder SOCKS-Tunnel, der weiterläuft, nachdem Sie sshelf beenden, und auch nachdem Sie das Terminal schließen. F4 listet alle davon über alle Hosts hinweg auf und stoppt den ausgewählten. Sie werden per PID verfolgt und mit den tatsächlich laufenden Prozessen abgeglichen, sodass nichts in einer Liste verbleibt, nachdem es beendet wurde. Kein Daemon, kein Supervisor.

Setzen Sie tmux = "window" oder "pane" und Enter öffnet den Host in einem neuen tmux-Fenster (benannt nach dem Host) oder in einem neuen Pane, statt sshelf zu ersetzen. Beenden Sie die Sitzung und der Picker sitzt immer noch da und läuft weiter.

F3 verwaltet Sites: Eine Site gruppiert Hosts und kann einen gemeinsamen Bastion, Benutzer, Port und Schlüssel mitführen, die ihre Mitglieder beim Verbinden erben, wobei nur die Felder ausgefüllt werden, die ein Host nicht selbst gesetzt hat. Tags sind frei definierbare Labels, nach denen Sie filtern. Beide erscheinen in der Liste, und ein geerbter Bastion erscheint im Befehl, den sshelf aufbaut.

sshpassFür die Hosts, die keine Schlüssel verwenden können, speichert sshelf das Passwort in Ihrem OS-Keyring (oder einem age-verschlüsselten Tresor auf einem headless Rechner) und stellt es über SSH_ASKPASS bereit, wenn ssh danach fragt. Es antwortet nur auf Aufforderungen mit der Form eines echten Passworts oder einer Passphrase, sodass ein Server das Geheimnis nicht mit ähnlich aussehendem Text abfischen kann. Das Passwort ist nie in einer Datei, nie in ps, nie in einer Befehlszeile. Hosts, die zusätzlich einen Verifizierungscode wünschen, erhalten vor Verbindungsaufbau eine Eingabeaufforderung dafür. Passwörter, Schlüssel & 2FA
· Sicherheit.

sshelf export schreibt ein eigenes ssh_config-Fragment und gibt Ihnen eine einzelne Include-Zeile zum Einfügen in ~/.ssh/config selbst. Danach lösen einfaches ssh, scp, rsync, git und alles, was SSH-Config liest (VS Code Remote-SSH, JetBrains Gateway), Ihre sshelf-Hosts per Namen auf, inklusive Bastion. Die Datei aktualisiert sich, wann immer sich Ihre Hosts ändern. sshelf schreibt weiterhin nichts unter ~/.ssh.

sshelf import liest ~/.ssh/config, strikt schreibgeschützt, und übernimmt die Hosts, die es modellieren kann. sshelf import --tailscale führt Ihre eigene tailscale-CLI aus und verwandelt Ihr Tailnet in durchsuchbare Hosts, mit MagicDNS-Namen, dem Tailnet als Site und ACL-Tags als Tags. Beides ist nur additiv, sodass ein erneuter Lauf immer sicher ist, und keines geschieht, ohne dass Sie danach fragen.
sshelf doctorEin Befehl für den Fall, dass etwas nicht funktioniert. Er prüft Ihre OpenSSH-Version, ob das Secret-Backend tatsächlich öffnet, ob hosts.toml geparst werden kann, Hosts, die auf eine nicht existierende Site zeigen, einen fehlenden Agent-Socket und einen Export, der abgewichen ist. Er nennt die Lösung für jeden Punkt. Schreibgeschützt, beendet mit Exit-Code 1, wenn etwas fehlschlug, und kontaktiert nie einen Host.

Zusammengestellt im September 2026 aus dem jeweiligen README der Projekte (und für Termius von dessen Website). Eine Zelle mit „nicht angegeben" bedeutet, dass die eigene Dokumentation des Projekts dazu nichts sagt.
| sshelf | purple | omnyssh | Voltius | Termius | |
|---|---|---|---|---|---|
| Läuft in | Terminal (TUI) | Terminal (TUI) | Terminal (TUI) + Desktop-App | Desktop-App (Tauri) | Desktop- + Mobile-App |
Bearbeitet ~/.ssh/config | nie | ja, direkt | nein, liest es beim Start | n/a (eigener Speicher) | n/a (eigener Speicher) |
| Konto erforderlich | nein | nein | nein | für Echtzeit-Sync | ja |
| Hält Tokens für andere Dienste | nein | ja, eines pro Cloud-Anbieter | nein | ja, für Sync | nicht angegeben |
| Eigene Netzwerkaufrufe | keine | Cloud-Anbieter-Sync | Host-Metrik-Polling | Sync, Updates, Host-Metriken | Sync |
| Geheimnis-Verwahrung | Ihr OS-Keyring / age-Tresor | Keyring + Passwort-Manager | nicht angegeben | sein E2EE-Tresor | sein verschlüsselter Tresor |
| Verbinden | exec() in Ihre ssh | führt Ihren ssh-Befehl aus | integriertes Terminal | integriertes Terminal | integriertes Terminal |
| Port-Weiterleitungen | ja, überleben das Beenden | ja, Live-Überwachung | nicht angegeben | ja | ja |
| Dateiübertragung | SFTP mit zwei Fenstern | geteilte Fenster | SFTP mit zwei Panels | zwei Fenster, Drag & Drop | SFTP |
| Container / Metrik-Dashboards | nein | ja | ja | ja | nicht angegeben |
| Team-Freigabe | nein | nein | nein | kostenpflichtige Stufen | kostenpflichtige Stufen |
| Plattformen | macOS, Linux | macOS, Linux | macOS, Linux, Windows, Termux | Windows, macOS, Linux | macOS, Windows, Linux, iOS, Android |
| Lizenz | MIT / Apache-2.0 | MIT | Apache-2.0 | AGPL-3.0 | proprietär |
sshelf hat keine Dashboards, kein Container-Management, keine Team-Freigabe und keinen Windows-Build. Die ersten drei sind Entscheidungen, und PRIVACY.md erklärt warum: Jede davon würde bedeuten, dass sshelf etwas von Ihnen hält oder von sich aus mit etwas spricht.
~/.ssh/config und schreibt nie etwas unter ~/.ssh.hosts.toml. Diese Datei kann bedenkenlos committet und geteilt werden.PRIVACY.md sagt, was es liest, schreibt, ausführt und sendet.
SECURITY.md ist das Bedrohungsmodell für gespeicherte Geheimnisse.
sshelf # TUI starten (Ctrl-a fügt Ihren ersten Host hinzu)
sshelf import --dry-run # schreibgeschützten Import aus ~/.ssh/config Vorschau anzeigen
sshelf import # ...ausführen
sshelf import --tailscale # ...oder Ihr gesamtes Tailscale-Tailnet importieren
sshelf prod-web # direkt mit einem gespeicherten Host verbinden (überspringt die TUI)
sshelf - # Verbindung zum zuletzt verwendeten Host wiederherstellen
sshelf list tag:prod --json # scriptbare Auflistung (Felder + der ssh-Befehl)
sshelf print-command db # den ssh-Befehl ausgeben, statt ihn auszuführen
sshelf export # Include-Datei, damit einfaches ssh/scp/VS Code Ihre Hosts sieht
sshelf doctor # etwas funktioniert nicht? Setup prüfen und die Lösung erfahren
In der TUI: Tippen zum Filtern (plus tag:NAME / site:NAME) und Enter zum Verbinden.
F1 zeigt jede Taste.
Der Benutzerleitfaden deckt alles ab:
Schnellstart ·
CLI-Referenz ·
Konfiguration ·
FAQ ·
sshelf doctor.
Es gibt funktionsspezifische Seiten für Dateiübertragung,
Port-Weiterleitung,
Sites & Tags,
Passwörter & 2FA und
SSH-Config-Export.
Architektur- und Designentscheidungen finden Sie in docs/, und es gibt eine
llms.txt für die Maschinen.
Stellen Sie Fragen, schlagen Sie eine Funktion vor oder zeigen Sie, was Sie damit gebaut haben, in
GitHub Discussions. Beiträge sind willkommen.
Beginnen Sie mit CONTRIBUTING.md.
Wenn sshelf für Sie nützlich ist, ist ein Bitcoin-Trinkgeld willkommen (völlig optional):
Bitcoin: bc1qcdeyhpwq76u97dhymx876n49uq85z4y3ccrpje
Dual-lizenziert unter entweder MIT oder Apache-2.0, nach Ihrer Wahl (die Rust-Ökosystem-Norm).