
Быстрый терминальный интерфейс для ваших SSH-хостов: нечёткий поиск и подключение в два нажатия клавиш, двухпанельная передача файлов по SFTP и фоновое перенаправление портов. Ведёт собственную базу хостов и генерирует команду ssh — никогда не изменяет ~/.ssh/config.

macOS и Linux, x86_64 и arm64. Готовым пакетам не нужен Rust-тулчейн. Во время работы sshelf требует OpenSSH 8.4+ — именно оттуда берётся автоподстановка пароля.
Homebrew (macOS или Linux):
brew install max-rh/tap/sshelf
Установщик через shell (готовый бинарник, определяет вашу платформу):
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-rh/sshelf/releases/latest/download/sshelf-installer.sh | sh
Debian/Ubuntu: возьмите .deb из
последнего релиза, затем
sudo apt install ./sshelf_*_amd64.deb (или *_arm64.deb).
Fedora / RHEL / Rocky / openSUSE: возьмите .rpm (статическая сборка, работает на любом RPM-дистрибутиве) из последнего релиза, затем
sudo dnf install ./sshelf-*.x86_64.rpm (или .aarch64.rpm).
Gentoo: оверлей, поддерживаемый сообществом (неофициальный, спасибо @masterwolf-git). Выполните
eselect repository enable masterwolf && emerge --sync && emerge --ask app-admin/sshelf.
Cargo (с crates.io; нужен Rust 1.88+):
cargo install sshelf.
Автодополнение в shell поставляется с каждым пакетом. Откройте новый shell после установки. На Linux секреты используют бэкенд Secret Service на чистом Rust (без зависимостей сборки libdbus/OpenSSL).
Полные детали и настройка автодополнения: Руководство по установке.
У меня несколько десятков машин (домашний сервер, пара VPS, несколько машин за бастионом), и я постоянно вводил ssh -J bastion -i ~/.ssh/some-key -p 2222 user@host по памяти или искал это в истории shell. Каждый SSH-менеджер, который я пробовал, хотел либо владеть ~/.ssh/config, либо завести мне аккаунт и синхронизировать хосты через чей-то сервер. Мне не нужно было ни то, ни другое. Мне нужен был лаунчер, который ведёт собственный список, собирает команду и уходит с дороги. А ещё место, где можно хранить пароли для тех немногих хостов, которые не могут использовать ключи, — и никогда не класть их в файл. Поэтому я его создал.
Вводите текст — список фильтруется. Enter подключает. Ваши самые используемые хосты сами всплывают наверх (frecency: частота использования, затухающая со временем), а tag:prod / site:homelab сужают список дальше. Ctrl-y копирует собранную команду вместо её запуска. Из shell sshelf prod-web подключается по имени, а sshelf - переподключается к последнему хосту — оба варианта без открытия TUI.

exec() в ваш sshsshelf собирает argv из записи хоста, закрывает свой UI и затем заменяет себя OpenSSH. Между вами и сессией нет никакой обёртки: настоящий TTY, ваш ssh, ваши флаги без конфига. Когда сессия завершается, вы возвращаетесь в свой shell, а не в меню. Команда, которую он запускает, — ровно та, что показывает Ctrl-y.
Как собирается команда.
Ctrl-t открывает ваши файлы слева и файлы хоста справа через одно аутентифицированное соединение. Space отмечает, Ctrl-a отмечает всё, что показывает фильтр, Ctrl-s отправляет весь набор в любую сторону, F7 создаёт каталог. Имя, которое уже есть у получателя, пропускается — никогда не перезаписывается.

Ctrl-f открывает Local, Remote или SOCKS-туннель, который продолжает работать после выхода из sshelf и после закрытия терминала. F4 показывает список всех туннелей на всех хостах и останавливает выбранный. Они отслеживаются по pid и сверяются с реально запущенными процессами, так что в списке ничего не задерживается после завершения. Никаких демонов и супервизоров.

Задайте tmux = "window" или "pane" — и Enter откроет хост в новом окне tmux (названном по имени хоста) или в новой панели вместо замены sshelf. Завершите сессию — и пикер всё ещё на месте и всё ещё работает.

F3 управляет сайтами: сайт группирует хосты и может нести общий бастион, пользователя, порт и ключ, которые его участники наследуют при подключении, заполняя только те поля, которые хост оставил пустыми. Теги — это свободные метки, по которым можно фильтровать. И то и другое видно в списке, а унаследованный бастион появляется в команде, которую собирает sshelf.

sshpassДля хостов, которые не могут использовать ключи, sshelf хранит пароль в системной связке ключей (или в зашифрованном age-хранилище на машине без головы) и передаёт его через SSH_ASKPASS, когда ssh запрашивает. Он отвечает только на запросы, имеющие форму настоящего пароля или passphrase, так что сервер не может выманить секрет похожим текстом. Пароль никогда не лежит в файле, никогда не виден в ps, никогда не попадает в командную строку. Хосты, которым также нужен код подтверждения, получают запрос на него до начала подключения. Пароли, ключи и 2FA
· Безопасность.

sshelf export записывает один фрагмент ssh_config от себя и даёт вам одну строку Include, которую вы сами вставляете в ~/.ssh/config. После этого обычные ssh, scp, rsync, git и всё, что читает SSH-конфиг (VS Code Remote-SSH, JetBrains Gateway), находят ваши хосты sshelf по имени, включая бастион. Файл обновляется при каждом изменении хостов. sshelf по-прежнему ничего не пишет в ~/.ssh.

sshelf import читает ~/.ssh/config строго в режиме только для чтения и копирует хосты, которые может смоделировать. sshelf import --tailscale запускает ваш собственный CLI tailscale и превращает вашу tailnet в доступные для поиска хосты: с именами MagicDNS, tailnet как сайт и ACL-тегами как тегами. Оба режима только добавляют, так что повторный запуск всегда безопасен, и ни один из них не происходит, пока вы об этом не попросите.
sshelf doctorОдна команда на случай, когда что-то не работает. Она проверяет версию вашего OpenSSH, открывается ли бэкенд секретов, парсится ли hosts.toml, указывают ли хосты на несуществующий сайт, отсутствует ли сокет агента и не разошёлся ли экспорт. Она называет исправление для каждой проблемы. Только чтение, возвращает 1, если что-то не удалось, и никогда не связывается с хостом.

Составлено в сентябре 2026 года по README каждого проекта (а для Termius — по его сайту). Ячейка «не указано» означает, что в документации проекта об этом не сказано.
| sshelf | purple | omnyssh | Voltius | Termius | |
|---|---|---|---|---|---|
| Где работает | терминал (TUI) | терминал (TUI) | терминал (TUI) + десктоп-приложение | десктоп-приложение (Tauri) | десктоп + мобильное приложение |
Редактирует ~/.ssh/config | никогда | да, на месте | нет, читает при запуске | н/д (своё хранилище) | н/д (своё хранилище) |
| Требуется аккаунт | нет | нет | нет | для синхронизации в реальном времени | да |
| Хранит токены для других сервисов | нет | да, по одному на облачного провайдера | нет | да, для синхронизации | не указано |
| Собственные сетевые вызовы | нет | синхронизация облачных провайдеров | опрос метрик хостов | синхронизация, обновления, метрики хостов | синхронизация |
| Хранение секретов | ваша системная связка ключей / age-хранилище | связка ключей + менеджеры паролей | не указано | его E2EE-хранилище | его зашифрованное хранилище |
| Подключение | exec() в ваш ssh | запускает вашу команду ssh | встроенный терминал | встроенный терминал | встроенный терминал |
| Проброс портов | да, переживают выход | да, живой мониторинг | не указано | да | да |
| Передача файлов | двухпанельный SFTP | разделённые панели | двухпанельный SFTP | двухпанельный, drag & drop | SFTP |
| Контейнеры / дашборды метрик | нет | да | да | да | не указано |
| Командная работа | нет | нет | нет | платные тарифы | платные тарифы |
| Платформы | macOS, Linux | macOS, Linux | macOS, Linux, Windows, Termux | Windows, macOS, Linux | macOS, Windows, Linux, iOS, Android |
| Лицензия | MIT / Apache-2.0 | MIT | Apache-2.0 | AGPL-3.0 | проприетарная |
У sshelf нет дашбордов, управления контейнерами, командной работы и сборки под Windows. Первые три — осознанный выбор, и PRIVACY.md объясняет почему: каждая из этих функций означала бы, что sshelf хранит что-то ваше или сам с чем-то разговаривает.
~/.ssh/config и ничего не пишет в ~/.ssh.hosts.toml. Этот файл безопасно коммитить и публиковать.PRIVACY.md описывает, что он читает, пишет, запускает и отправляет.
SECURITY.md — это модель угроз для хранимых секретов.
sshelf # запуск TUI (Ctrl-a добавляет первый хост)
sshelf import --dry-run # предпросмотр импорта только для чтения из ~/.ssh/config
sshelf import # ...выполнить
sshelf import --tailscale # ...или импортировать всю вашу tailnet Tailscale
sshelf prod-web # подключиться напрямую к сохранённому хосту (без TUI)
sshelf - # переподключиться к недавно использованному хосту
sshelf list tag:prod --json # вывод для скриптов (поля + команда ssh)
sshelf print-command db # вывести команду ssh вместо её запуска
sshelf export # Include-файл, чтобы обычные ssh/scp/VS Code видели ваши хосты
sshelf doctor # что-то не работает? проверьте настройку и узнайте исправление
В TUI: вводите для фильтрации (плюс tag:NAME / site:NAME) и нажимайте Enter для подключения.
F1 показывает все клавиши.
Руководство пользователя охватывает всё:
Быстрый старт ·
Справочник CLI ·
Конфигурация ·
FAQ ·
sshelf doctor.
Есть страницы по каждой функции: передача файлов,
проброс портов,
сайты и теги,
пароли и 2FA и
экспорт SSH-конфига.
Архитектура и проектные решения — в docs/, а для машин есть
llms.txt.
Спрашивайте, предлагайте функции или показывайте, что вы построили с его помощью, в
GitHub Discussions. Вклад приветствуется. Начните с CONTRIBUTING.md.
Если sshelf вам полезен, будет признателен за Bitcoin-пожертвование (совершенно необязательно):
Bitcoin: bc1qcdeyhpwq76u97dhymx876n49uq85z4y3ccrpje
Двойное лицензирование: либо MIT, либо Apache-2.0, на ваш выбор (норма экосистемы Rust).