termal.in

← Блог

Дайте Hermes Agent доступ по SSH к серверам, не передавая ему ключ

· Termalin Team ai-agentsmcpsshsecuritytutorial

Hermes Agent уже выполняет команды оболочки на удалённой машине. Его SSH-бэкенд терминала нацелен на один хост и запускает каждую команду через ssh. Для единственного сервера это нормально. Но как только их становится больше одного — или вы не хотите, чтобы приватный ключ лежал на машине, где работает агент, — этот бэкенд становится не тем инструментом. Чище — подключить Hermes к удалённому MCP-серверу, который дотягивается до серверов за него: без ключа на машине с агентом, много хостов, правила для каждого подключения и журнал аудита. Этот пост про оба: как SSH-бэкенд работает сегодня и как вместо него подключить Termalin в качестве MCP-сервера.

Оговорюсь: мы делаем Termalin. Детали о Hermes Agent ниже — из его публичной документации и трекера задач, проверенных 15 октября 2026 года.

Как Hermes Agent использует SSH сегодня

Hermes Agent выполняет свои инструменты через терминальный бэкенд. Один из таких бэкендов — SSH. Вы задаёте его в ~/.hermes/config.yaml:

terminal:
  backend: ssh

Учётные данные идут в ~/.hermes/.env:

TERMINAL_SSH_HOST=my-server.example.com
TERMINAL_SSH_USER=ubuntu

TERMINAL_SSH_PORT по умолчанию 22, а TERMINAL_SSH_KEY — это путь к приватному ключу (если оставить пустым, берётся системный по умолчанию). Документация описывает механизм прямо: он «выполняет команды на удалённом сервере по SSH», переиспользует соединение через ControlMaster с 5-минутным keepalive по простою, и каждая команда — это свежий ssh … bash -c.

Из этой схемы следуют три факта, и именно они — причина, по которой люди ищут что-то другое:

  • Один бэкенд — это один хост. TERMINAL_SSH_HOST и TERMINAL_SSH_USER оба обязательны, а у бэкенда нет инвентаря на много хостов. Чтобы поработать со вторым сервером, вы перенастраиваете.
  • Приватный ключ живёт на машине Hermes — либо как файл, либо через системный ssh-agent. Всё, что может прочитать эту машину, может воспользоваться ключом, а ключ открывает каждый хост, который ему доверяет.
  • Hermes копирует собственные учётные данные на удалённую машину. В документации отмечено, что для бэкендов SSH, Modal и Daytona Hermes заливает ваше состояние ~/.hermes/ — файлы учётных данных, навыки, кэш — в удалённую песочницу на время сессии и синхронизирует изменённые файлы состояния обратно при завершении.

У документации есть и справедливый довод в пользу SSH-бэкенда: поскольку агент работает на другой машине, он «не может изменить собственный код». Эта изоляция реальна, и мы вернёмся к ней ниже.

Проблемы, с которыми сталкиваются

В трекере hermes-agent есть узнаваемая группа открытых задач вокруг этих SSH-путей. Приводим по номерам, не преувеличивая, что каждая из них значит для вас:

  • SSH-бэкенд падает с «path too long for Unix domain socket» при использовании именованных профилей (#133436).
  • /reload не очищает закэшированные SSH-окружения после смены конфигурации (#71085).
  • У десктопного режима SSH свой набор: проба на macOS, которая падает примерно через секунду (#80836), и зависания и таймауты OpenSSH на Windows (#118983, #138378, #127320).
  • Шторм повторных попыток при старте — около 25 входов по SSH в минуту (#134197).
  • hermes update падает в сетях, которые блокируют порт 22 (#133439).

Часть из них — про десктоп-приложение, а не про бэкенд, и часть, возможно, уже исправлена к тому моменту, как вы это читаете. Важна закономерность: SSH-бэкенд — это тонкая обёртка над одним ssh-соединением, так что он наследует все острые углы этого соединения — включая необходимость того, чтобы порт 22 был достижим.

Вариант без ключа: Termalin как удалённый MCP-сервер

Hermes Agent поддерживает MCP. Он умеет общаться с stdio-серверами и с удалёнными HTTP-серверами — либо через заголовок Bearer, либо через OAuth. Вот и зацепка. Вместо того чтобы давать агенту ключ и один хост, вы направляете его на удалённый MCP-сервер, который уже умеет дотягиваться до вашего парка.

Termalin — это SSH-клиент с облачным MCP-сервером. На каждом сервере, который должен быть достижим, работает Connector — установка в одну строку, которая звонит наружу и никогда не слушает порт, так что он работает за NAT и CGNAT, и порт 22 открывать не нужно. При подключении sshd сервера доверяет удостоверяющему центру SSH (CA) Termalin. Каждый вход затем использует краткосрочный сертификат, ограниченный вашим аккаунтом. На машине не лежит долгоживущий ключ, и ни один не передаётся агенту.

MCP-серверы идут под корневым ключом mcp_servers в ~/.hermes/config.yaml. Аутентифицироваться можно двумя способами. На VPS — обычном месте, где работает Hermes, — API-ключ проще, так что начните с него.

Вариант A — API-ключ (лучше всего на VPS)

Создайте API-ключ в веб-кабинете Termalin, ограничьте его область серверами, которых этот агент должен касаться, поставьте только чтение или список разрешённых и задайте срок действия. Положите его в ~/.hermes/.env:

TERMALIN_API_KEY=tk_live_your_key_here

Затем добавьте сервер. Hermes разрешает ссылки ${VAR} в момент подключения к серверу, в том числе внутри headers:

# ~/.hermes/config.yaml
mcp_servers:
  termalin:
    url: "https://termal.in/api/v1/mcp"
    headers:
      Authorization: "Bearer ${TERMALIN_API_KEY}"

Проверьте соединение, затем перезагрузите MCP внутри сессии:

hermes mcp test termalin
/reload-mcp

Streamable HTTP — транспорт по умолчанию для серверов с url, и именно на нём говорит termal.in, так что строка transport: вам не нужна.

Вариант B — вход через OAuth (для ноутбука)

Если Hermes работает на вашей собственной машине с браузером, OAuth позволяет не хранить ключ:

# ~/.hermes/config.yaml
mcp_servers:
  termalin:
    url: "https://termal.in/mcp"
    auth: oauth
hermes mcp login termalin

При первом подключении Hermes печатает URL авторизации, открывает браузер, когда может, и ждёт колбэк OAuth на локальном loopback-порту. Вход в Termalin принимает такой loopback-редирект (http://127.0.0.1:<port>/callback), так что auth: oauth работает с нашей стороны.

На headless-VPS loopback-колбэк не может достучаться до вашего ноутбука. С Termalin работают два обхода: вставить redirect-URL обратно в приглашение Hermes или пробросить порт через ssh -N -L <port>:127.0.0.1:<port> user@host и завершить вход в браузере ноутбука. У Hermes есть ещё device-code-флоу, но вход в Termalin его не предлагает — на сервере API-ключ из Варианта A — путь попроще.

Что вы получаете после подключения

После hermes mcp test termalin (или hermes mcp login termalin) и /reload-mcp инструменты Termalin появляются у агента: hosts_list — посмотреть, до каких серверов он может дотянуться, ssh_exec и ssh_exec_many — выполнять команды на одном или многих, sftp_list / sftp_read / sftp_write — для файлов, server_metrics и alerts_list — для здоровья, и job_start / job_status / job_stop / job_list — для работы, которая переживает один вызов.

Практические отличия от SSH-бэкенда:

  • Много серверов разом. ssh_exec_many запускает одну и ту же команду по набору хостов. Нет ограничения в один хост и не нужно перенастраивать, чтобы переключить машину.
  • Правила для каждого подключения. В карточке «AI-приложения» вы задаёте для этого подключения политику команд: полный доступ, список разрешённых или только чтение. Начните с только чтения, расширьте позже.
  • Журнал аудита. Каждая команда агента помечена как его, записана и показана в живой сетке наблюдения. «Это сделал агент» — это фильтр, а не реконструкция. См. аудит того, что агент делает на серверах (на английском).
  • Фоновые задачи. Долгая миграция или сборка идёт как фоновая задача, так что медленная работа не блокирует сессию и не упирается в фиксированный таймаут.
  • Без открытого порта. Connector звонит наружу, что заодно обходит класс проблем «порт 22 заблокирован».

Отзыв доступа — это один переключатель, а не ротация ключа по каждому хосту. О логике этого размена — в почему не стоит отдавать агенту свой SSH-ключ и радиусе поражения (оба — на английском).

Когда оставить SSH-бэкенд

Это не тот случай, когда один вариант выигрывает по всем пунктам.

  • Если у вас ровно одна машина, ключ на машине Hermes уже лежит и ничего лишнего в цепочке не нужно — SSH-бэкенд требует меньше всего настройки.
  • Довод документации про изоляцию верен: работа на отдельном хосте означает, что агент не может править собственный код. Путь через MCP сохраняет это свойство тоже, ведь команды выполняются на ваших серверах, а не на машине с агентом, — но если SSH-бэкенд уже даёт вам это и больше ничего не нужно, переходить незачем.
  • Инструменты MCP и мониторинга Termalin требуют тарифа Pro ($10/мес, или $8/мес при оплате за год — $96/год) или 14-дневного пробного периода, и Connector на каждом сервере. Одинокий ключ и SSH-бэкенд не стоят ничего.

Берите Termalin, когда у вас несколько серверов, когда вы не хотите ключ на машине с агентом, когда серверы сидят за NAT или когда вам нужны правила для каждого подключения и журнал аудита. Оставьте SSH-бэкенд, когда один ключ на одном хосте — действительно всё, что вам нужно.

Устранение неполадок

  • Инструменты не появляются. Запустите hermes mcp test termalin, убедитесь, что url верный и что TERMALIN_API_KEY задан в ~/.hermes/.env. Затем /reload-mcp внутри сессии.
  • 401 от эндпоинта. API-ключ отсутствует, неверен или истёк. Создайте новый в кабинете и обновите ~/.hermes/.env.
  • Ссылка ${TERMALIN_API_KEY} отправляется буквально. Hermes раскрывает ${VAR} в момент подключения; убедитесь, что переменная есть в ~/.hermes/.env (или в оболочке, которая запустила Hermes), и переподключитесь.
  • OAuth на headless-VPS не завершается. Loopback-колбэк не может достучаться до ноутбука. Пробросьте порт через ssh -N -L <port>:127.0.0.1:<port> user@host или вставьте redirect-URL обратно в приглашение. На сервере путь с API-ключом проще.
  • Неверный транспорт. Серверы с url по умолчанию используют Streamable HTTP, на котором работает termal.in. Задавайте transport: sse только для серверов, которые говорят исключительно на SSE, — это не наш случай.

Вопросы и ответы

Поддерживает ли Hermes Agent MCP? Да. Он подключается к stdio-серверам и к удалённым HTTP-серверам — через заголовок Bearer или OAuth, — настраивается под ключом mcp_servers в ~/.hermes/config.yaml.

Можно ли использовать это с Hermes Agent на VPS? Да, и путь с API-ключом там проще всего. Для OAuth-флоу нужен браузер или один из обходов для headless выше.

Нужно ли открывать порт на моих серверах? Нет. Connector звонит наружу, так что он работает за NAT и CGNAT без единого входящего порта. См. SSH за NAT (на английском).

Передаётся ли мой SSH-ключ агенту? Нет. До серверов добираются краткосрочными сертификатами, выпускаемыми на каждый вход. Долгоживущий ключ не покидает Termalin, и ни один не попадает в окружение агента.


Termalin — кроссплатформенный SSH-клиент с облачным MCP-сервером, хранителем ключей и политикой агента для каждого хоста. Работаете с другим агентом? Та же настройка без ключа подходит для OpenClaw, Codex (на английском) и других — или скачайте приложение, чтобы начать.

Попробуйте на одном хосте.

Termalin — быстрый SSH-клиент для вас и ваших агентов.

Бесплатный тариф · 14 дней Pro бесплатно · цены