Коротко
Автор создал локальную панель ssh-commander, объединяющую SSH-терминал, SFTP, Docker и AI-агента, который анализирует сервер и предлагает действия. Ключевой урок эксплуатации — изменения требуют подтверждения, а команды чтения ограничены allowlist: при расследовании обнаружилось, что нехватка прав на удаление в Yandex S3 остановила обновление бэкапа.
Контекст
Автор — разработчик нескольких веб-проектов и создатель открытого проекта lexuss1979/ssh-commander под лицензией MIT. Изначально ему требовалось изучить конфигурацию старого сервера и подготовить план переноса проектов; затем он решил объединить работу с серверами и помощь AI в одной локальной панели, сохранив ручную проверку действий.
Главное
- Проект называется ssh-commander, репозиторий — lexuss1979/ssh-commander; лицензия MIT, подписки нет.
- Приложение запускается локально через Docker Compose v2 и подключается к серверам Linux по SSH; интерфейс по умолчанию доступен на 127.0.0.1.
- Инструменты включают терминал с вкладками и восстановлением сессии, SFTP-менеджер с редактором и просмотром растущих логов, а также управление Docker и Compose.
- Дополнительные разделы охватывают PostgreSQL, MySQL, Nginx, systemd, сетевые порты и cron.
- У каждого сервера есть локальная память MEMORY.md; один диалог может включать несколько серверов, а команды помечаются именем машины.
- Прочитывание обычных файлов и логов может выполняться без подтверждения; запись, перезапуск контейнера и shell-команды требуют подтверждения.
- Без подтверждения работают только команды из allowlist exec_readonly с проверенными флагами; find /tmp -delete и sort -o /tmp/list.txt /etc/hosts не проходят.
- Режим планирования не вызывает инструменты и использует уже собранные сведения; после одобрения плана отдельные изменения всё равно нужно подтверждать.
- В демонстрационном расследовании удаление дублей PDF нарушило синхронизацию с Yandex S3 из-за отсутствия у сервисного аккаунта прав на удаление; автор сообщает об освобождении почти 1,5 ГБ.
- Для запуска версии 0.1.1 приведены Docker-команды и адрес http://localhost:8080; агент требует отдельный API-ключ, а автор использует deepseek-v4-flash.
Как сделано
Приложение запускается локально в Docker, интерфейс доступен в браузере, а к Linux-серверам подключается по SSH. В панели есть вкладки терминала, файлового менеджера SFTP, Docker и дополнительных разделов для PostgreSQL, MySQL, Nginx, systemd, портов и cron. Вывод терминала или логов можно передать агенту прямо из интерфейса; у каждого сервера есть файл памяти MEMORY.md, загрузка которого происходит в начале новой сессии, а изменения памяти требуют подтверждения.
Агент может самостоятельно читать обычные файлы, логи, сведения о контейнерах и свободном месте. Запись файлов, перезапуск контейнеров и команды оболочки требуют подтверждения. Для безопасного чтения используется exec_readonly с разрешающим списком команд и проверкой флагов; конвейеры, перенаправления и подстановки запрещены. Интерпретаторы и сетевые клиенты не входят в список. Режим планирования строит план по уже собранным сведениям, без инструментов; одобрение плана не снимает подтверждений для отдельных изменений.
Версия 0.1.1 запускается в Linux или macOS командами: 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, задать пароль панели и добавить сервер. AI требует собственного API-ключа; доступны пресеты провайдеров и настройка OpenAI-совместимого API с вызовом инструментов. В статье указаны TypeScript, Node.js и ssh2 на бэкенде, React и xterm.js на фронтенде; автор использует deepseek-v4-flash.
Результаты
В рабочем примере агент обнаружил дубли PDF и предложил освободить почти 1,5 ГБ. При расследовании последствий переноса документов в Yandex S3 выяснилось, что удаление дублей вызвало попытку удалить соответствующие объекты в S3, но у сервисного аккаунта не было нужных прав. Синхронизация падала, и бэкап перестал обновляться. Приложение помогло выявить проблему до удаления оставшихся локальных файлов. Автор не приводит формальных замеров производительности или сравнений с другими инструментами.
Ограничения
Агент может предложить ошибочную команду: её нужно прочитать до подтверждения и проверить результат после выполнения; резервные копии всё равно необходимы. При использовании внешнего провайдера файлы и логи передаются ему. Защита секретов основана на шаблонах, может пропускать данные и не обезличивает логи; prompt injection в содержимом файлов и логов остаётся риском. Приложение рассчитано на одного пользователя и по умолчанию слушает 127.0.0.1. SSH-пароли, пароли БД и API-ключи хранятся локально открытым текстом, поэтому каталоги data/ и keys/ и резервные копии нужно защищать. Allowlist иногда требует подтверждать даже безобидные команды. Цена использования AI зависит от тарифа провайдера; конкретные расходы в статье не указаны.
Что взять себе
- Для AI-агента с доступом к серверу безопаснее разрешать небольшой набор команд чтения, чем пытаться отсеивать опасные команды общим denylist.
- Подтверждение должно оставаться обязательным для изменений, даже если агент подготовил план; команды и их результаты стоит проверять вручную.
- Проверяйте фактическое обновление бэкапов после изменений в синхронизации: настроенная ранее резервная копия может незаметно перестать работать из-за прав доступа.
- Перед отправкой логов и файлов внешнему AI-провайдеру учитывайте риск утечки секретов и prompt injection; локальное хранение учётных данных также требует защиты.
Читать оригинал, если…
Откройте оригинал, если нужны README и архитектура проекта, полный список функций, тесты фильтра команд или инструкции по установке на Windows.