Сделал для себя ssh‑commander: терминал, файловый менеджер, управление Docker и AI‑агент в одном окне. Можно работать с сервером руками, а когда нужна помощь, передать вывод агенту или поставить ему задачу. Он сам смотрит файлы и логи, предлагает команды, а изменения выполняет после подтверждения.
Приложение запускается локально через Docker, интерфейс открывается в браузере. К серверам подключается по SSH. Код открыт под MIT, подписки нет. Для агента нужен свой API‑ключ; без него ручные инструменты тоже работают.

Зачем я это сделал
Несколько моих веб‑проектов нужно было перевезти на новый сервер. Чтобы ничего не забыть, я запустил AI‑агента на старом сервере и попросил изучить конфигурацию и собрать документ для переноса. Где лежат проекты, как запускаются сервисы, какие конфиги нужно забрать.
Потом подумал: если агент может все это изучить, почему бы не поручить ему и настройку? При этом хотелось видеть, что он собирается делать, и иметь возможность проверить результат самому.
Так появился ssh‑commander. Слева выбираешь сервер, сверху переключаешься между терминалом, файлами и другими разделами. Справа остается чат с агентом. Можно открыть лог, отправить нужный фрагмент в чат и продолжить разбираться в том же окне.
Запускать агента прямо на сервере тоже можно, с этого я и начал. Мне оказалось удобнее собрать подключения и ручные инструменты в одной панели.
Что есть в приложении
Терминал. Несколько вкладок на сервер, история команд, восстановление сессии после перезагрузки страницы. Выделение или последний вывод можно отправить агенту одним кликом.
Файлы по SFTP. Загрузка и скачивание, редактор с подсветкой, поиск, просмотр растущих логов. Есть анализатор занятого места: можно пройти от большого каталога до конкретных файлов.
Docker. Контейнеры, образы, логи, запуск и остановка, Compose, терминал внутри контейнера.
Еще есть разделы для PostgreSQL и MySQL, Nginx, systemd, портов и cron. Полный перечень возможностей есть в README.

У агента есть память для каждого сервера: локальный файл MEMORY.md, который подгружается в начале следующей сессии. Туда можно записать, где лежат проекты и как они запускаются. Запись требует подтверждения. В один диалог можно подключить несколько серверов; у каждой команды видно, на какой машине она выполняется.
Пример из использования: PDF, свободное место и сломанный бэкап
Когда приложение уже работало, на одном из серверов закончилось место. Агент нашел дубли больших PDF и предложил освободить почти 1,5 ГБ. Заодно предложил перевести работу с PDF на Yandex S3.
Мы убрали дубли, потом настроили работу с S3 и перенесли туда документы. Когда понадобилось удалить с диска PDF, которые уже были перенесены, выяснилось, что нет актуального бэкапа всех медиафайлов в S3. Хотя резервное копирование было настроено раньше.
Агент быстро выяснил причину. Синхронизация сломалась, когда мы удалили дубли PDF: процесс бэкапа попытался удалить соответствующие файлы в S3, но у сервисного аккаунта не хватало прав на удаление. Операция падала, и бэкап перестал обновляться.
То есть перед очисткой оставшихся локальных файлов нашлась проблема с резервным копированием. Агент связал ее с нашим предыдущим действием и нашел недостающие права.
Что агент делает сам, а что нужно подтверждать
Агент может сам прочитать обычный файл, посмотреть логи, список контейнеров или свободное место. Для записи файла, перезапуска контейнера и произвольной shell‑команды нужно подтверждение. Внизу чата появляется плашка: можно раскрыть команду целиком, затем подтвердить или отклонить ее.

Для команд чтения есть отдельный инструмент exec_readonly с разрешающим списком. Изначально я использовал запрещающий список, но при проверке обнаружились обходы: например, /bin/rm и \rm не совпадали с проверяемым именем. Поэтому теперь автоматически проходит только ограниченный набор команд. У них отдельно проверяются флаги, а конвейеры, перенаправления и подстановки запрещены.
Команда |
Пройдет без подтверждения |
|---|---|
|
Да |
|
Да |
|
Нет: удаление файлов |
|
Нет: запись в файл |
Интерпретаторов и сетевых клиентов в этом списке нет. Сложную команду агент может предложить через обычный exec, с подтверждением. Иногда так приходится подтверждать и безобидный запрос. Для своего инструмента я считаю этот компромисс приемлемым. Вот фильтр и его тесты.
Для больших задач есть режим планирования. Модель составляет план по уже собранным сведениям, без вызова инструментов. Если нужна свежая информация, ее нужно получить до перехода в этот режим. Одобрение плана запускает работу, но не отменяет подтверждения отдельных изменений.
Ограничения
Агент может предложить неправильную команду. Перед подтверждением ее нужно прочитать, а после выполнения проверить результат. Бэкапы по‑прежнему нужны.
При работе с внешним AI‑провайдером прочитанные файлы и логи передаются ему. Чтение путей, похожих на файлы секретов, например .env или приватных ключей, требует подтверждения. В выводе инструментов скрываются распознанные секреты. Это проверки по шаблонам: они могут что‑то пропустить и не обезличивают логи.
Prompt injection тоже остается проблемой: в файле или логе может оказаться текст с посторонними инструкциями для модели. Проверки команд и подтверждения при этом сохраняются, но гарантировать правильность предложений агента они не могут.
Панель рассчитана на одного пользователя, по умолчанию доступна только на 127.0.0.1 и защищена паролем. SSH‑пароли, пароли БД и API‑ключ хранятся локально открытым текстом; пароль панели хранится как хеш. Каталоги data/ и keys/ вместе с резервными копиями нужно защищать от чужого доступа.
Как попробовать
Нужны Docker с Compose v2 на вашем компьютере и SSH‑доступ к Linux‑серверу. В Linux или macOS готовый образ версии 0.1.1 запускается так:
mkdir ssh-commander cd ssh-commander curl --fail --location https://raw.githubusercontent.com/lexuss1979/ssh-commander/v0.1.1/docker-compose.release.yml --output compose.yaml docker compose up -d
Откройте http://localhost:8080, задайте пароль панели и добавьте сервер. В поле адреса укажите IP или hostname VPS. localhost здесь будет адресом самого контейнера.
Для агента добавьте API‑ключ в настройках. Есть пресеты провайдеров и настройка собственного OpenAI‑совместимого API с поддержкой вызова инструментов. Расходы идут по тарифу провайдера, в приложении есть учет токенов и оценка стоимости по диалогам. На скриншотах используется deepseek-v4-flash. И сам я использую именно эту модель — это очень быстро и недорого.
Установка, в том числе на Windows и первое подключение описаны отдельно. Если хочется посмотреть код: TypeScript, Node.js и ssh2 на бэкенде, React и xterm.js во фронтенде. Есть описание архитектуры.
Репозиторий: lexuss1979/ssh‑commander. Если попробуете, напишите, что получилось и чего не хватило. Ошибки и предложения можно оставлять в issues.
Комментарии (15)

Axell87
01.10.2026 15:41А можно подключить агента без api ключа и платных ИИ к lm studio локальной? (Сервер отдельный на порту 1234) если да то как

Lexuss1979 Автор
01.10.2026 15:41Я так не пробовал, у меня локальная Ollama есть. Думаю, что можно, важно чтобы локальный endpoint был openai совместим. Ну и важно, чтобы моделька была достаточно умной, чтобы инструменты дергать. Спасибо за идею!

kamaz1
01.10.2026 15:41Наверно не плохо, но по большому счету, можно же сказать агенту, обычному агенту, "разберись", и он предложит команду по ssh. Что я и делаю

Lexuss1979 Автор
01.10.2026 15:41Я тоже так делал. Поэтому и написал ssh-commander. Он мне сэкономил кучу времени. Простите за саморекламу. Но это бесплатно, мне с этого ни денег ни славы не нужно :). Делюсь, потому что реально очень удобно.

mlavrinenko
01.10.2026 15:41Если в Zed Editor открыть папку удалённого сервера как проект, то в рамках одного окна доступна консоль сервера, файлы проекта и ИИ-помощник который сможет взаимодействовать с сервером. Надеюсь, что когда-нибудь они осилят сделать полноценную систему плагинов, чтобы можно было добавить туда дополнительный функционал.

ToniDoni
01.10.2026 15:41А можно было просто кинуть агенту в телегу креды и попросить настроить)

Lexuss1979 Автор
01.10.2026 15:41Можно, но как подтверждать рискованные операции? В сети много пишут про всякие неприятные ситуации, которые умные агенты иногда создают в помрачении. У меня лично диск пока не удаляли, но вот тесты на рабочей базе с migration refresh запускали. И это opus 4.8. В общем тут у каждого свое мнение, я предпочитаю видеть, что он делает, хотя бы в мутирующих сценариях.

mike_new
01.10.2026 15:41@Lexuss1979 очень забавно) буквально недавно сделал что-то очень похоже как замену MobaXterm для команды
у меня только все на Go + Wails второй и на фронте React
перенес по сути весь фунционал основной MobaxTerm + оркестратор докеров, работу в ДБ визуальную, SFTP удобный прям как проводник и драг-дропом скачивание файлов и оттуда же быстрое проигрывание видео и фоточек
так что если хотите - могу поделиться на бэта тест. на гит пока не очень хочу выкладывать)

AlexandrArt
01.10.2026 15:41Решал похожую проблему. Хотелось давать доступ агенту в текущий терминал, плюс были ограничения с тем, что на большинстве серверов настроен OTP на sudo. В итоге подумал, почему бы не использовать remote debug в Termius, раз уж это браузер. Родилось вот такое: https://github.com/yapp/termius-mcp
Можно докрутить и до SFTP использования, пока необходимости не было
becefi
На чем бекенд?
Lexuss1979 Автор
TS
becefi
NodeJS?