
Interfaz de terminal rápida para tus hosts SSH: búsqueda difusa y conexión con dos pulsaciones de teclas, transferencia de archivos SFTP de doble panel y reenvío de puertos en segundo plano. Mantiene su propia base de datos de hosts y genera el comando ssh — nunca edita ~/.ssh/config.

macOS y Linux, x86_64 y arm64. Los paquetes precompilados no necesitan toolchain de Rust. En tiempo de ejecución, sshelf requiere OpenSSH 8.4+, que es de donde proviene el suministro automático de contraseñas.
Homebrew (macOS o Linux):
brew install max-rh/tap/sshelf
Instalador por shell (binario precompilado, detecta tu plataforma):
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-rh/sshelf/releases/latest/download/sshelf-installer.sh | sh
Debian/Ubuntu: descarga el .deb del
último lanzamiento y luego
sudo apt install ./sshelf_*_amd64.deb (o *_arm64.deb).
Fedora / RHEL / Rocky / openSUSE: descarga el .rpm (compilación estática, funciona en cualquier
distro RPM) del último lanzamiento y luego
sudo dnf install ./sshelf-*.x86_64.rpm (o .aarch64.rpm).
Gentoo: overlay mantenido por la comunidad (no oficial, gracias a @masterwolf-git). Ejecuta
eselect repository enable masterwolf && emerge --sync && emerge --ask app-admin/sshelf.
Cargo (desde crates.io; requiere Rust 1.88+):
cargo install sshelf.
La autocompletación por tabulación del shell se incluye con cada paquete. Abre una nueva shell después de instalar. En Linux,
los secretos usan un backend de Secret Service en Rust puro (sin dependencias de compilación libdbus/OpenSSL).
Detalles completos y configuración de autocompletación: Guía de instalación.
Gestiono un par de docenas de máquinas (un homelab, algunos VPS, unas cuantas cajas detrás de un bastión), y
seguía escribiendo ssh -J bastion -i ~/.ssh/some-key -p 2222 user@host de memoria o buscando en el
historial de mi shell. Cada gestor SSH que probé quería o bien ser dueño de ~/.ssh/config o bien
darme una cuenta y sincronizar mis hosts a través del servidor de alguien. No quería ninguna de las dos cosas. Quería
un lanzador que mantuviera su propia lista, construyera el comando y se apartara del camino. Y un lugar
para guardar las contraseñas de los pocos hosts que no pueden usar claves, sin ponerlas nunca
en un archivo. Así que lo construí.
Escribe para filtrar. Enter conecta. Tus hosts más usados flotan hacia arriba por sí solos
(frecuencia: recuento de uso, atenuado por la recencia), y tag:prod / site:homelab acotan la lista
aún más. Ctrl-y copia el comando que construyó en lugar de ejecutarlo. Desde la shell,
sshelf prod-web conecta por nombre y sshelf - se reconecta al último host, ambos sin
abrir la TUI.

exec() a tu sshsshelf construye el argv a partir del registro del host, derriba su propia interfaz y luego se reemplaza a sí mismo
con OpenSSH. No hay ningún wrapper entre tú y la sesión: una TTY real, tu ssh, tus
flags sin configuración. Cuando la sesión termina vuelves a tu shell, no a un menú. El
comando que ejecuta es exactamente el que Ctrl-y te muestra.
Cómo se construye el comando.
Ctrl-t abre tus archivos a la izquierda y los del host a la derecha, sobre una única conexión
autenticada. Space marca, Ctrl-a marca todo lo que muestra el filtro, Ctrl-s envía el
conjunto completo en cualquier dirección, F7 crea un directorio. Un nombre que el destino ya tenga se omite,
nunca se sobrescribe.

Ctrl-f abre un túnel Local, Remoto o SOCKS que sigue ejecutándose después de que salgas de sshelf,
y después de que cierres la terminal. F4 lista cada uno de ellos en todos los hosts y detiene el
que elijas. Se rastrean por pid y se reconcilian contra los procesos que realmente se están
ejecutando, así que nada permanece en una lista después de morir. Sin daemon, sin supervisor.

Configura tmux = "window" o "pane" y Enter abre el host en una nueva ventana de tmux (nombrada según
el host) o en un nuevo panel en lugar de reemplazar a sshelf. Termina la sesión y el selector sigue
ahí, todavía ejecutándose.

F3 gestiona sitios: un sitio agrupa hosts y puede llevar un bastión, usuario, puerto y clave
compartidos que sus miembros heredan al conectar, rellenando solo los campos que un host deja sin configurar. Las etiquetas
son etiquetas de forma libre sobre las que filtras. Ambas aparecen en la lista, y un bastión heredado aparece
en el comando que sshelf construye.

sshpassPara los hosts que no pueden usar claves, sshelf almacena la contraseña en tu llavero del sistema operativo (o una
bóveda cifrada con age en una máquina sin cabeza) y la suministra a través de SSH_ASKPASS cuando ssh la pide.
Solo responde a avisos con la forma de una contraseña real o un aviso de passphrase, así que un servidor
no puede suplantar el secreto con texto de apariencia similar. La contraseña nunca está en un archivo, nunca en ps,
nunca en una línea de comandos. Los hosts que también quieren un código de verificación reciben un aviso antes de
que comience la conexión. Contraseñas, claves y 2FA
· Seguridad.

sshelf export escribe un fragmento de ssh_config propio y te da una única línea Include
para que pegues tú mismo en ~/.ssh/config. Después, el ssh normal, scp, rsync, git y cualquier cosa
que lea la configuración SSH (VS Code Remote-SSH, JetBrains Gateway) resuelven tus hosts de sshelf por
nombre, bastión incluido. El archivo se refresca cada vez que tus hosts cambian. sshelf sigue escribiendo
nada bajo ~/.ssh.

sshelf import lee ~/.ssh/config, estrictamente de solo lectura, y copia los hosts que puede
modelar. sshelf import --tailscale ejecuta tu propio CLI de tailscale y convierte tu tailnet en
hosts buscables, con nombres MagicDNS, el tailnet como sitio y las etiquetas ACL como etiquetas. Ambos son
de solo añadir, así que volver a ejecutarlos siempre es seguro, y ninguno ocurre a menos que lo pidas.
sshelf doctorUn comando para cuando algo no funciona. Comprueba tu versión de OpenSSH, si el backend de secretos
realmente se abre, si hosts.toml se analiza, hosts que apuntan a un sitio que
no existe, un socket de agente faltante y una exportación que se ha desviado. Nombra la solución para
cada uno. De solo lectura, sale con 1 si algo falla, y nunca contacta con un host.

Compilado en septiembre de 2026 a partir del propio README de cada proyecto (y, para Termius, su sitio). Una celda que dice "no indicado" significa que la documentación del propio proyecto no lo dice.
| sshelf | purple | omnyssh | Voltius | Termius | |
|---|---|---|---|---|---|
| Se ejecuta en | terminal (TUI) | terminal (TUI) | terminal (TUI) + aplicación de escritorio | aplicación de escritorio (Tauri) | aplicación de escritorio + móvil |
Edita ~/.ssh/config | nunca | sí, en el lugar | no, lo lee al inicio | n/d (almacén propio) | n/d (almacén propio) |
| Cuenta requerida | no | no | no | para sincronización en tiempo real | sí |
| Guarda tokens para otros servicios | no | sí, uno por proveedor de nube | no | sí, para sincronización | no indicado |
| Llamadas de red propias | ninguna | sincronización con proveedor de nube | sondeo de métricas de hosts | sincronización, actualizaciones, métricas de hosts | sincronización |
| Custodia de secretos | tu llavero del SO / bóveda age | llavero + gestores de contraseñas | no indicado | su bóveda E2EE | su bóveda cifrada |
| Conectar | exec() a tu ssh | ejecuta tu comando ssh | terminal integrada | terminal integrada | terminal integrada |
| Reenvíos de puertos | sí, sobreviven al salir | sí, monitorización en vivo | no indicado | sí | sí |
| Transferencia de archivos | SFTP de doble panel | panel dividido | SFTP de dos paneles | doble panel, arrastrar y soltar | SFTP |
| Contenedores / paneles de métricas | no | sí | sí | sí | no indicado |
| Compartir en equipo | no | no | no | niveles de pago | niveles de pago |
| Plataformas | macOS, Linux | macOS, Linux | macOS, Linux, Windows, Termux | Windows, macOS, Linux | macOS, Windows, Linux, iOS, Android |
| Licencia | MIT / Apache-2.0 | MIT | Apache-2.0 | AGPL-3.0 | propietaria |
sshelf no tiene paneles, ni gestión de contenedores, ni compartir en equipo, ni compilación para Windows. Las
primeras tres son elecciones, y PRIVACY.md explica por qué: cada una significaría
que sshelf guardara algo tuyo, o hablara con algo por su cuenta.
~/.ssh/config, y nunca escribe nada bajo ~/.ssh.hosts.toml. Ese archivo es seguro para confirmar y compartir.PRIVACY.md dice qué lee, escribe, ejecuta y envía.
SECURITY.md es el modelo de amenazas para los secretos almacenados.
sshelf # lanza la TUI (Ctrl-a añade tu primer host)
sshelf import --dry-run # previsualiza una importación de solo lectura desde ~/.ssh/config
sshelf import # ...hazlo
sshelf import --tailscale # ...o importa todo tu tailnet de Tailscale
sshelf prod-web # conéctate directamente a un host guardado (omite la TUI)
sshelf - # reconéctate al host usado más recientemente
sshelf list tag:prod --json # listado scriptable (campos + el comando ssh)
sshelf print-command db # imprime el comando ssh en lugar de ejecutarlo
sshelf export # archivo Include para que ssh/scp/VS Code normales vean tus hosts
sshelf doctor # ¿algo no funciona? comprueba la configuración y te dicen la solución
En la TUI: escribe para filtrar (más tag:NAME / site:NAME) y Enter para conectar.
F1 muestra todas las teclas.
La guía de usuario cubre todo:
Inicio rápido ·
Referencia de CLI ·
Configuración ·
FAQ ·
sshelf doctor.
Hay páginas por función para transferencia de archivos,
reenvío de puertos,
sitios y etiquetas,
contraseñas y 2FA y
exportación de configuración SSH.
La arquitectura y las decisiones de diseño viven en docs/, y hay un
llms.txt para las máquinas.
Pregunta, sugiere una función o muestra lo que construiste con él en
GitHub Discussions. Las contribuciones son
bienvenidas. Empieza con CONTRIBUTING.md.
Si sshelf te resulta útil, se agradece una propina en Bitcoin (totalmente opcional):
Bitcoin: bc1qcdeyhpwq76u97dhymx876n49uq85z4y3ccrpje
Doble licencia bajo MIT o Apache-2.0, a tu elección (la norma del ecosistema Rust).