Codex se conecta a tus servidores a través de MCP (en inglés): añade una entrada de Termalin a la sección mcp_servers de ~/.codex/config.toml, y Codex ejecuta comandos y lee o escribe archivos en tus hosts — sin tener nunca una clave. La configuración lleva unos veinte minutos. (Si solo quieres Codex en una máquina a la que ya entras por SSH, las propias conexiones remotas de la app de Codex lo hacen con tu propia clave y el comando codex instalado en la máquina remota — sin MCP.)
¿Por qué la vía MCP y no la obvia? Codex está a gusto dentro de un repo. La tarea que te manda a buscar acceso al servidor es justo la que se sale de él — el despliegue falló, la migración se colgó, el servicio no vuelve a levantar en la máquina de verdad. El arreglo tentador es dejar que Codex ejecute ssh por su cuenta: ya ejecuta comandos de shell en tu máquina, así que si hay una clave desbloqueada en ~/.ssh o un ssh-agent en marcha, ssh prod le funciona sin que tú decidas nada. Eso no es «darle acceso a Codex» — es descubrir que lo regalaste por defecto.
Tiene la misma forma que las configuraciones de Claude Code (en inglés) y Cursor; abajo está la versión específica para Codex, paso a paso.
Por qué Codex dice que SSH no está permitido en su sandbox
Pídele a Codex que entre por ssh a una máquina y normalmente no lo hará: el comando vuelve bloqueado, o Codex se detiene a pedir una aprobación que una ejecución desatendida no puede conceder. Eso funciona según lo previsto. Codex ejecuta tus comandos dentro de un sandbox con el acceso a la red y la escritura acotados, precisamente para que un agente confundido o manipulado no pueda llegar a tu infraestructura por su cuenta — y una conexión SSH saliente es justo la clase de cosa que esa barrera existe para frenar.
Los apaños que circulan quitan la barrera en lugar de trabajar con ella:
- Flags para saltarse el sandbox.
codex --dangerously-bypass-approvals-and-sandbox(y--full-auto) apagan el sandbox para quesshpase. Pero el flag no está acotado a SSH — descarta las aprobaciones y el sandbox para todos los comandos de esa ejecución. Desbloqueaste una cosa y le quitaste la salvaguarda a todo lo demás. sshpass.sshpass -p 'hunter2' ssh user@hostpasa una contraseña de forma no interactiva. Deja la contraseña en texto plano en la línea de comandos — visible en la lista de procesos y en el historial del shell — y le enseña al agente a cargar con una credencial de servidor, justo el hábito que conviene evitar.- Una clave en el sandbox. Montar
~/.ssho exportar una clave al entorno de Codex funciona, pero una vez que la clave ha pasado por el contexto del agente no puedes demostrar que no se haya filtrado; la clasificación por radio de impacto (en inglés) lo pone en el último lugar por algo, y el único arreglo honesto después es rotar la clave en todos los sitios donde se confíe en ella.
Las tres responden a «cómo cuelo SSH más allá del sandbox» cuando la mejor pregunta es «cómo ejecuta el agente un comando en mi servidor sin tener la clave ni apagar el sandbox». Esa es la vía MCP de abajo. Termalin hace la conexión SSH; Codex llama a una herramienta. El sandbox sigue activo para todo lo demás que hace Codex, y como session_open / session_exec mantienen una sesión persistente, el agente obtiene un shell real con estado — un cd, una variable exportada, un proceso de larga duración sobreviven todos entre llamadas — en lugar de una ristra de ejecuciones puntuales e inconexas.
Lo que necesitas
- Termalin — la app de escritorio; el plan Free vale. Su servidor MCP integrado es con lo que hablará Codex.
- El Codex CLI, en la misma máquina.
- Un host guardado en Termalin. Elige algo que no te importe que un agente toquetee en la primera ejecución — staging, un VPS desechable.
Paso 1 — activa el acceso de agentes y fija una política
El acceso de agentes está desactivado por defecto. En Termalin, abre Ajustes → MCP, actívalo, y marca los hosts a los que Codex puede llegar. Nada fuera de esa lista existe en lo que respecta al agente; añadir un host es una decisión que tomas en la app, no algo a lo que Codex pueda colarse hablando.
Por debajo pasan dos cosas. Termalin escribe un inventario de hosts para el servidor MCP con entradas de auth solo para el agente — ninguna contraseña ni clave aterriza en ese archivo. Y la autenticación se queda con el custodio de claves de la app: desbloqueas una vez, y Termalin firma en nombre del agente. No hay archivo de clave que Codex pueda leer, así que no hay nada que filtrar — con lo que también se cierra la puerta trasera de ~/.ssh de arriba.
Ya que estás, fija la política de agente de cada host: acceso completo, una lista de comandos permitidos, o bloqueado. Para cualquier cosa que te importe, empieza con una lista de permitidos — la lista más corta que le permita a Codex hacer el trabajo que tienes en mente.
Paso 2 — registra el servidor en config.toml
Codex lee los servidores MCP de la sección mcp_servers de ~/.codex/config.toml. Añade una entrada que apunte al binario termalin-mcp incluido:
[mcp_servers.termalin]
command = "<path>/termalin-mcp"
Las versiones recientes de Codex también pueden añadirlo desde la línea de comandos — el mismo resultado:
codex mcp add termalin -- <path>/termalin-mcp
Esa es toda la integración, y la misma configuración vale para Codex en el IDE. Reinicia Codex, confirma que el servidor aparece como conectado, y las herramientas aparecen ante el agente: hosts_list, ssh_exec, sesiones persistentes (session_open / session_exec), lecturas y escrituras SFTP, y reenvíos de puertos. La lista completa de herramientas (en inglés) documenta cada una.
Un hábito de Codex que conviene conservar en las primeras sesiones: deja activadas sus aprobaciones de comandos. Codex pregunta antes de actuar a menos que le digas que no lo haga — no se lo digas todavía. Amplía eso igual que amplías la lista de hosts: una cosa aburrida cada vez, después de haber observado cómo se comporta.
Paso 3 — dale una tarea de verdad
Sáltate el comando de demo. Dale algo que harías de verdad:
El despliegue a staging-1 terminó pero la comprobación de salud sigue oscilando. Averigua por qué y arréglalo.
Codex llama a hosts_list, ve staging-1, abre una sesión, y empieza a tirar de los hilos — estado del servicio, las últimas cien líneas de registro, el diff de configuración frente a lo que está corriendo. Propone un arreglo, lo aplica dentro de la política que fijaste, y confirma que la comprobación se pone en verde.
Lo que hace esto cómodo en lugar de angustiante es que nada de ello está oculto. Cada sesión que abre Codex aparece en Termalin como una pestaña de terminal en vivo, y el watch grid (en inglés) pone todas las sesiones abiertas lado a lado con los mosaicos que conduce el agente brillando. Ves los comandos aterrizar según se ejecutan, no lees un resumen después — y puedes intervenir a mitad de sesión en cualquier momento.
Dónde están los límites
Los valores por defecto que vale la pena conocer antes de apuntar Codex a algo que importe:
- Tus claves nunca entran en el entorno de Codex. El custodio firma; el agente solicita. Revocar el acceso es un interruptor en Ajustes, no una rotación de claves por toda tu flota.
- Su alcance es la lista de hosts que marcaste en el Paso 1, y la política de comandos de cada host acota lo que puede ejecutar ahí. «Completa» en producción sigue siendo una shell completa — fíjala con intención.
- Teclear en tu sesión es aparte. Por defecto Codex abre sus propias sesiones; unirse a una que ya tienes abierta es su propio interruptor de consentimiento. Nunca va de acompañante en silencio.
- Cada comando queda registrado. Las grabaciones de sesión capturan solo la salida — nunca las pulsaciones — y cada comando del agente queda marcado como del agente (en inglés) en el registro de auditoría, con el dispositivo y la IP de los que vino. «Esto lo hizo el agente» es un filtro que aplicas, no una historia que reconstruyes.
Cuando Codex corre donde tu escritorio no está
Si Codex corre en CI o en un sandbox en la nube en lugar de en tu portátil, el binario local por stdio no es alcanzable — pero el endpoint MCP alojado de Termalin sí. Donde alguien pueda iniciar sesión, añade https://termal.in/mcp a Codex como servidor MCP remoto y aprueba una vez en la página de inicio de sesión de Termalin (OAuth, sin clave que pegar). Para las ejecuciones desatendidas, crea una clave API en el panel web, acótala a los servidores que ese trabajo deba tocar, ponla en solo lectura o en una lista de permitidos, y dale una caducidad. El endpoint llega a tus servidores dados de alta con un Connector sin clave, autenticando cada ejecución con un certificado de corta duración — ninguna clave entregada, ninguna credencial permanente. El patrón completo, con un ejemplo de pipeline listo para copiar y pegar, está en dar a un agente acceso SSH en CI/CD (en inglés).
El hábito que lo afianza
Trata la primera semana como la incorporación de un compañero que teclea rápido. Mantén el watch grid abierto. Dale a Codex tareas con un estado de «hecho» claro — «haz que pase la comprobación de salud», «renueva el certificado» — y lee cómo llega ahí. Mantén las aprobaciones activadas hasta que se haya ganado la auto-aprobación para las herramientas aburridas, y amplía la lista de hosts una máquina poco emocionante cada vez.
La asimetría es el quid: Codex obtiene alcance real, y tú conservas lo único que no se puede recuperar una vez que ha salido.
Termalin es un cliente SSH multiplataforma con un servidor MCP integrado, un custodio de claves y política de agente por host. Empieza por la página de Codex SSH, lee la referencia MCP, o descarga la app — el plan Free no tiene límite de hosts.