
Interface terminal rapide pour vos hôtes SSH : recherche floue et connexion en deux frappes, transfert de fichiers SFTP à double volet, et redirection de port en arrière-plan. Il conserve sa propre base de données d’hôtes et génère la commande ssh — sans jamais modifier ~/.ssh/config.

macOS et Linux, x86_64 et arm64. Les paquets précompilés ne nécessitent pas d'outillage Rust. Au moment de l'exécution, sshelf exige OpenSSH 8.4+, d'où provient la fourniture automatique du mot de passe.
Homebrew (macOS ou Linux) :
brew install max-rh/tap/sshelf
Installateur shell (binaire précompilé, détecte votre plateforme) :
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-rh/sshelf/releases/latest/download/sshelf-installer.sh | sh
Debian/Ubuntu : récupérez le .deb depuis la
dernière version, puis
sudo apt install ./sshelf_*_amd64.deb (ou *_arm64.deb).
Fedora / RHEL / Rocky / openSUSE : récupérez le .rpm (compilation statique, fonctionne sur toute
distribution RPM) depuis la dernière version, puis
sudo dnf install ./sshelf-*.x86_64.rpm (ou .aarch64.rpm).
Gentoo : overlay maintenu par la communauté (non officiel, merci à @masterwolf-git). Exécutez
eselect repository enable masterwolf && emerge --sync && emerge --ask app-admin/sshelf.
Cargo (depuis crates.io ; nécessite Rust 1.88+) :
cargo install sshelf.
La complétion par tabulation du shell est fournie avec chaque paquet. Ouvrez un nouveau shell après l'installation. Sous Linux,
les secrets utilisent un backend Secret Service en pur Rust (aucune dépendance de compilation libdbus/OpenSSL).
Détails complets et configuration de la complétion : Guide d'installation.
Je gère une vingtaine de machines (un homelab, quelques VPS, quelques boîtiers derrière un bastion), et
je tapais sans cesse ssh -J bastion -i ~/.ssh/some-key -p 2222 user@host de mémoire ou en fouillant dans mon
historique de shell. Chaque gestionnaire SSH que j'ai essayé voulait soit posséder ~/.ssh/config, soit
me créer un compte et synchroniser mes hôtes via le serveur de quelqu'un. Je ne voulais ni l'un ni l'autre. Je voulais
un lanceur qui gère sa propre liste, construit la commande et s'efface. Et un endroit
pour conserver les mots de passe des quelques hôtes qui ne peuvent pas utiliser de clés, sans jamais les mettre
dans un fichier. Alors je l'ai construit.
Tapez pour filtrer. Entrée connecte. Vos hôtes les plus utilisés remontent tout seuls en haut
(fréquence : compteur d'utilisation, atténué par la récence), et tag:prod / site:homelab réduisent la liste
davantage. Ctrl-y copie la commande construite au lieu de l'exécuter. Depuis le shell,
sshelf prod-web connecte par nom et sshelf - se reconnecte au dernier hôte, tous deux sans
ouvrir la TUI.

exec() dans votre sshsshelf construit l'argv à partir de l'enregistrement de l'hôte, démonte sa propre interface, puis se remplace lui-même
par OpenSSH. Aucun intermédiaire entre vous et la session : un vrai TTY, votre ssh, vos
drapeaux sans config. Quand la session se termine, vous revenez à votre shell, pas dans un menu. La
commande qu'il exécute est exactement celle que Ctrl-y vous montre.
Comment la commande est construite.
Ctrl-t ouvre vos fichiers à gauche et ceux de l'hôte à droite, sur une seule connexion
authentifiée. Espace marque, Ctrl-a marque tout ce que le filtre affiche, Ctrl-s envoie
l'ensemble dans un sens ou dans l'autre, F7 crée un répertoire. Un nom que la destination possède déjà est ignoré,
jamais écrasé.

Ctrl-f ouvre un tunnel Local, Remote ou SOCKS qui continue de fonctionner après avoir quitté sshelf,
et après avoir fermé le terminal. F4 liste chacun d'eux sur tous les hôtes et arrête celui
que vous choisissez. Ils sont suivis par pid et réconciliés avec les processus réellement
en cours, donc rien ne traîne dans une liste après sa mort. Pas de démon, pas de superviseur.

Définissez tmux = "window" ou "pane" et Entrée ouvre l'hôte dans une nouvelle fenêtre tmux (nommée d'après
l'hôte) ou un nouveau volet au lieu de remplacer sshelf. Terminez la session et le sélecteur est toujours
là, toujours en cours d'exécution.

F3 gère les sites : un site regroupe des hôtes et peut porter un bastion, un utilisateur, un port et une clé
partagés que ses membres héritent au moment de la connexion, ne remplissant que les champs qu'un hôte laisse non définis. Les étiquettes
sont des libellés libres sur lesquels vous filtrez. Les deux apparaissent dans la liste, et un bastion hérité apparaît
dans la commande que sshelf construit.

sshpassPour les hôtes qui ne peuvent pas utiliser de clés, sshelf stocke le mot de passe dans votre trousseau système (ou un
coffre chiffré age sur une machine sans tête) et le fournit via SSH_ASKPASS quand ssh le demande.
Il ne répond qu'aux invites ayant la forme d'un vrai mot de passe ou d'une invite de phrase secrète, donc un serveur
ne peut pas hameçonner le secret avec un texte d'apparence similaire. Le mot de passe n'est jamais dans un fichier, jamais dans ps,
jamais sur une ligne de commande. Les hôtes qui veulent aussi un code de vérification reçoivent une invite avant
le début de la connexion. Mots de passe, clés et 2FA
· Sécurité.

sshelf export écrit un fragment ssh_config qui lui est propre et vous donne une seule ligne Include
à coller vous-même dans ~/.ssh/config. Ensuite, ssh, scp, rsync, git ordinaires, et tout ce qui
lit la config SSH (VS Code Remote-SSH, JetBrains Gateway) résolvent vos hôtes sshelf par
nom, bastion compris. Le fichier se rafraîchit à chaque changement de vos hôtes. sshelf n'écrit toujours
rien sous ~/.ssh.

sshelf import lit ~/.ssh/config, strictement en lecture seule, et copie les hôtes qu'il peut
modéliser. sshelf import --tailscale exécute votre propre CLI tailscale et transforme votre tailnet en
hôtes recherchables, avec les noms MagicDNS, le tailnet comme site, et les étiquettes ACL comme étiquettes. Les deux sont
uniquement additifs, donc ré-exécuter l'un est toujours sûr, et aucun ne se produit sauf si vous le demandez.
sshelf doctorUne commande pour quand quelque chose ne fonctionne pas. Il vérifie votre version d'OpenSSH, si le
backend de secrets s'ouvre réellement, si hosts.toml s'analyse, les hôtes pointant vers un site qui
n'existe pas, un socket d'agent manquant, et un export qui a dérivé. Il nomme le correctif pour
chacun. Lecture seule, sort avec 1 si quelque chose a échoué, et il ne contacte jamais un hôte.

Compilé en septembre 2026 à partir du README de chaque projet (et, pour Termius, de son site). Une cellule indiquant « non précisé » signifie que la documentation du projet ne le dit pas.
| sshelf | purple | omnyssh | Voltius | Termius | |
|---|---|---|---|---|---|
| S'exécute dans | terminal (TUI) | terminal (TUI) | terminal (TUI) + application de bureau | application de bureau (Tauri) | application de bureau + mobile |
Modifie ~/.ssh/config | jamais | oui, sur place | non, le lit au démarrage | n/a (stockage propre) | n/a (stockage propre) |
| Compte requis | non | non | non | pour la synchronisation en temps réel | oui |
| Détient des jetons pour d'autres services | non | oui, un par fournisseur cloud | non | oui, pour la synchronisation | non précisé |
| Appels réseau propres | aucun | synchronisation fournisseur cloud | sondage des métriques d'hôtes | synchronisation, mises à jour, métriques d'hôtes | synchronisation |
| Garde des secrets | votre trousseau OS / coffre age | trousseau + gestionnaires de mots de passe | non précisé | son coffre E2EE | son coffre chiffré |
| Connexion | exec() dans votre ssh | exécute votre commande ssh | terminal intégré | terminal intégré | terminal intégré |
| Redirections de port | oui, survivent à la sortie | oui, surveillance en direct | non précisé | oui | oui |
| Transfert de fichiers | SFTP à double volet | volet divisé | SFTP à deux panneaux | double volet, glisser-déposer | SFTP |
| Conteneurs / tableaux de bord de métriques | non | oui | oui | oui | non précisé |
| Partage d'équipe | non | non | non | niveaux payants | niveaux payants |
| Plateformes | macOS, Linux | macOS, Linux | macOS, Linux, Windows, Termux | Windows, macOS, Linux | macOS, Windows, Linux, iOS, Android |
| Licence | MIT / Apache-2.0 | MIT | Apache-2.0 | AGPL-3.0 |
sshelf n'a pas de tableaux de bord, pas de gestion de conteneurs, pas de partage d'équipe, et pas de build Windows. Les
trois premiers sont des choix, et PRIVACY.md explique pourquoi : chacun signifierait
que sshelf détienne quelque chose à vous, ou parle à quelque chose de son propre chef.
~/.ssh/config, et n'écrit jamais rien sous ~/.ssh.hosts.toml. Ce fichier peut être commité et partagé en toute sécurité.PRIVACY.md indique ce qu'il lit, écrit, exécute et envoie.
SECURITY.md est le modèle de menace pour les secrets stockés.
sshelf # lancez la TUI (Ctrl-a ajoute votre premier hôte)
sshelf import --dry-run # prévisualisez un import en lecture seule depuis ~/.ssh/config
sshelf import # ...faites-le
sshelf import --tailscale # ...ou importez tout votre tailnet Tailscale
sshelf prod-web # connectez-vous directement à un hôte enregistré (ignore la TUI)
sshelf - # reconnectez-vous à l'hôte le plus récemment utilisé
sshelf list tag:prod --json # liste scriptable (champs + la commande ssh)
sshelf print-command db # affichez la commande ssh au lieu de l'exécuter
sshelf export # fichier Include pour que ssh/scp/VS Code ordinaires voient vos hôtes
sshelf doctor # quelque chose ne fonctionne pas ? vérifiez la configuration et obtenez le correctif
Dans la TUI : tapez pour filtrer (plus tag:NAME / site:NAME) et Entrée pour connecter.
F1 affiche chaque touche.
Le guide utilisateur couvre tout :
Démarrage rapide ·
Référence CLI ·
Configuration ·
FAQ ·
sshelf doctor.
Il existe des pages par fonctionnalité pour le transfert de fichiers,
la redirection de port,
les sites et étiquettes,
les mots de passe et la 2FA, et
l'export de config SSH.
L'architecture et les décisions de conception vivent dans docs/, et il y a un
llms.txt pour les machines.
Demandez, suggérez une fonctionnalité, ou montrez ce que vous avez construit avec dans
GitHub Discussions. Les contributions sont
les bienvenues. Commencez par CONTRIBUTING.md.
Si sshelf vous est utile, un pourboire en Bitcoin est apprécié (entièrement facultatif) :
Bitcoin : bc1qcdeyhpwq76u97dhymx876n49uq85z4y3ccrpje
Double licence sous MIT ou Apache-2.0, à votre choix (la norme de l'écosystème Rust).
| propriétaire |