termal.in

← Блог

Подключите OpenAI Codex к серверам по SSH — безопасно

· Termalin Team codexmcpai-agentssshtutorial

Codex подключается к вашим серверам через MCP (на английском): добавьте одну запись о сервере Termalin в раздел mcp_servers файла ~/.codex/config.toml — и Codex выполняет команды, читает и пишет файлы на ваших хостах, ни разу не держа ключ в руках. Настройка занимает минут двадцать. (Если Codex нужен всего на одной машине, куда вы и так заходите по SSH, то удалённые подключения самого приложения Codex делают это с вашим собственным ключом и командой codex, установленной на удалённой стороне, — MCP не нужен.)

Почему через MCP, а не очевидным путём? Codex прекрасно чувствует себя внутри репозитория. За доступом к серверу вы идёте ровно тогда, когда задача выходит за его пределы: деплой упал, миграция зависла, служба не поднимается на самой машине. Соблазнительное решение — дать Codex запускать ssh самому: он и так выполняет команды оболочки на вашей машине, так что если ключ лежит разблокированным в ~/.ssh или в запущенном ssh-agent, то ssh prod сработает у него без всякого вашего решения. Это не «дать Codex доступ» — это обнаружить, что вы отдали его по умолчанию.

Схема та же, что в настройках для Claude Code (на английском) и Cursor; ниже — версия под Codex, шаг за шагом.

Почему Codex говорит, что SSH запрещён в его песочнице

Попросите Codex зайти по ssh на машину — и обычно он этого не сделает: команда возвращается заблокированной, или Codex останавливается и просит подтверждение, которое автоматический запуск дать не может. Так и задумано. Codex выполняет ваши команды в песочнице, где сеть и запись на диск отгорожены, — именно для того, чтобы сбитый с толку или скомпрометированный инъекцией агент не смог сам дотянуться до вашей инфраструктуры; а исходящее SSH-соединение — ровно то, что это ограждение и призвано останавливать.

Обходные приёмы, которые передают из рук в руки, убирают ограждение, а не работают вместе с ним:

  • Флаги обхода. codex --dangerously-bypass-approvals-and-sandbox (и --full-auto) отключают песочницу, чтобы ssh прошёл. Вот только флаг не ограничен одним SSH — он снимает подтверждения и песочницу для каждой команды в этом запуске. Вы разблокировали одно, а ограничитель сняли со всего.
  • sshpass. sshpass -p 'hunter2' ssh user@host подаёт пароль неинтерактивно. Пароль оказывается открытым текстом в командной строке — его видно в списке процессов и в истории оболочки, — и это приучает агента носить с собой учётные данные сервера, то есть ровно ту привычку, которой стоит избегать.
  • Ключ в песочнице. Примонтировать ~/.ssh или пробросить ключ в окружение Codex — работает, но стоит ключу пройти через контекст агента, и вы уже не докажете, что он не утёк; рейтинг по радиусу поражения (на английском) не зря ставит этот вариант в самый низ, и единственное честное решение после — сменить ключ везде, где ему доверяют.

Все три отвечают на вопрос «как протащить SSH мимо песочницы», тогда как вопрос получше звучит так: «как агенту выполнить команду на моём сервере, не держа ключ и не отключая песочницу». Это и есть путь через MCP ниже. SSH-соединение устанавливает Termalin; Codex лишь вызывает инструмент. Песочница остаётся включённой для всего остального, что делает Codex, а поскольку session_open / session_exec держат постоянную сессию, агент получает настоящую оболочку с состоянием — cd, экспортированная переменная, долго работающий процесс переживают вызовы — вместо вереницы разрозненных одноразовых команд.

Что понадобится

  • Termalin — десктоп-приложение; тарифа Free достаточно. Именно его встроенный MCP-сервер и будет собеседником Codex.
  • Codex CLI на той же машине.
  • Один хост, сохранённый в Termalin. Выберите то, что не жалко дать агенту потрогать в первый раз, — staging или одноразовый VPS.

Шаг 1 — включите доступ агента и задайте политику

Доступ агента выключен по умолчанию. В Termalin откройте Настройки → «Доступ агента (MCP)», включите его и отметьте хосты, до которых Codex можно дотягиваться. Всего, что вне этого списка, для агента попросту не существует; добавление хоста — ваше решение в приложении, а не то, на что Codex способен уговорить.

Под капотом происходит два события. Termalin записывает для MCP-сервера опись хостов с записями авторизации только для агента — ни паролей, ни ключей в этот файл не попадает. А аутентификация остаётся за хранителем ключей приложения: вы разблокируете его один раз, и Termalin подписывает от имени агента. Файла с ключом, который Codex мог бы прочитать, просто нет, а значит, и утекать нечему — заодно это закрывает ту самую лазейку с ~/.ssh выше.

Пока вы здесь, задайте для каждого хоста политику агента: полный доступ, список разрешённых команд или блокировка. Для всего, что вам дорого, начните со списка разрешённых — самого короткого, которого хватает Codex на задуманную вами задачу.

Шаг 2 — зарегистрируйте сервер в config.toml

Codex читает MCP-серверы из раздела mcp_servers файла ~/.codex/config.toml. Добавьте одну запись, указывающую на встроенный бинарник termalin-mcp:

[mcp_servers.termalin]
command = "<path>/termalin-mcp"

Свежие сборки Codex умеют добавлять его прямо из командной строки — результат тот же:

codex mcp add termalin -- <path>/termalin-mcp

Это вся интеграция, и та же конфигурация управляет Codex в IDE. Перезапустите Codex, убедитесь, что сервер отмечен как подключённый, — и инструменты становятся видны агенту: hosts_list, ssh_exec, постоянные сессии (session_open / session_exec), чтение и запись по SFTP, проброс портов. Полный список инструментов (на английском) описывает каждый.

Одну привычку Codex стоит сохранить на первые сессии: оставьте подтверждения команд включёнными. Codex спрашивает, прежде чем действовать, если вы не велели ему не спрашивать, — пока не велите. Расширяйте это так же, как список хостов: по одной скучной вещи за раз, после того как понаблюдаете за его поведением.

Шаг 3 — дайте ему настоящее дело

Пропустите демонстрационную команду. Поручите то, что вы и правда стали бы делать:

Деплой на staging-1 прошёл, но health-check то проходит, то падает. Найди причину и почини.

Codex вызывает hosts_list, видит staging-1, открывает сессию и начинает тянуть за ниточки — статус службы, последние сто строк лога, различия конфига с тем, что запущено. Он предлагает исправление, применяет его в рамках заданной вами политики и подтверждает, что проверка стала зелёной.

Спокойно, а не нервно, здесь оттого, что ничего из этого не скрыто. Каждая открытая Codex сессия появляется в Termalin как живая вкладка терминала, а сетка наблюдения (на английском) ставит все открытые сессии рядом, и плитки, которыми управляет агент, подсвечиваются. Вы видите, как команды выполняются в реальном времени, а не читаете сводку задним числом — и можете вмешаться посреди сессии в любой момент.

Где проходят границы

Настройки по умолчанию, которые стоит знать, прежде чем направлять Codex на что-то важное:

  • Ваши ключи никогда не попадают в окружение Codex. Подписывает хранитель, запрашивает агент. Отзыв доступа — это переключатель в настройках, а не смена ключа по всему парку.
  • Его досягаемость — это список хостов, который вы отметили на шаге 1, а политика команд каждого хоста ограничивает, что он может там выполнять. «Полный доступ» на проде — это всё равно полная оболочка, так что задавайте его осознанно.
  • Печатать в вашей сессии — это отдельно. По умолчанию Codex открывает собственные сессии; присоединиться к уже открытой вами — отдельный переключатель согласия. Молча он не подсаживается.
  • Каждая команда зафиксирована. Запись сессий сохраняет только вывод — никогда не нажатия клавиш, — и каждая команда агента помечена как его (на английском) в журнале аудита, вместе с устройством и IP, откуда она пришла. «Это сделал агент» — это фильтр, который вы применяете, а не история, которую приходится восстанавливать.

Когда Codex работает там, где нет вашего десктопа

Если Codex работает в CI или в облачной песочнице, а не на вашем ноутбуке, до локального stdio-бинарника не дотянуться — зато дотянуться до облачного эндпоинта MCP у Termalin. Там, где есть кому войти, добавьте https://termal.in/mcp в Codex как удалённый MCP-сервер и подтвердите один раз на странице входа Termalin (OAuth, никакого ключа вставлять не нужно). Для автоматических запусков создайте в веб-кабинете API-ключ, ограничьте его областью действия до серверов, которых должна касаться задача, переведите его в режим «только чтение» или на список разрешённых и задайте срок действия. Эндпоинт дотягивается до ваших серверов, подключённых через Connector, без ключа, подтверждая каждый запуск краткосрочным сертификатом, — ключ никому не выдаётся, ничего не остаётся лежать. Полный шаблон, с примером конвейера для копирования, — в статье как дать агенту доступ по SSH в CI/CD (на английском).

Привычка, которая всё закрепляет

Отнеситесь к первой неделе как к адаптации нового коллеги, который быстро печатает. Держите сетку наблюдения открытой. Давайте Codex дела с понятным признаком готовности — «добейся, чтобы health-check проходил», «обнови сертификат» — и читайте, как он к этому идёт. Оставляйте подтверждения включёнными, пока он не заслужит авто-подтверждение для скучных инструментов, и расширяйте список хостов по одной непримечательной машине за раз.

Вся суть — в асимметрии: Codex получает настоящую досягаемость, а вы сохраняете у себя единственное, что нельзя вернуть обратно, стоит ему утечь.


Termalin — это кроссплатформенный SSH-клиент со встроенным MCP-сервером, хранителем ключей и политикой агента для каждого хоста. Начните со страницы о Codex и SSH, прочитайте справочник по MCP или скачайте приложение — у тарифа Free нет ограничений на число хостов.

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

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

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

Добавьте Termalin в предпочитаемые источники в Google