termal.in

← 博客

通过 SSH 把 OpenAI Codex 安全连上你的服务器

· Termalin Team codexmcpai-agentssshtutorial

Codex 通过 MCP(英文)连上你的服务器:在 ~/.codex/config.toml 的 mcp_servers 部分加一项 Termalin 服务器条目,Codex 就能在你的主机上执行命令、读写文件——而且始终拿不到密钥。整个配置大约二十分钟。(如果你只想让 Codex 用在一台你本来就 SSH 登录的机器上,Codex 应用自带的远程连接就能做到,用你自己的密钥,并在远端装好 codex 命令——无需 MCP。)

为什么走 MCP 这条路,而不是那条显而易见的?Codex 在一个代码仓库里过得很自在。真正逼你去找服务器访问的,是那些离开仓库的活儿——部署失败了、迁移卡住了、服务在真实的机器上起不来了。诱人的做法是让 Codex 自己去跑 ssh:它本来就在你的机器上执行 shell 命令,所以只要有一把处于解锁状态的密钥放在 ~/.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 以非交互方式喂入密码。它把密码以明文放在命令行上——在进程列表和 shell 历史里都看得到——还教会代理去随身携带一份服务器凭据,而这恰恰是最该避免的习惯。
  • 把密钥放进沙箱。 挂载 ~/.ssh 或把一把密钥导入 Codex 的环境确实能用,但密钥一旦经过代理的上下文,你就无法证明它没泄露;影响范围排名(英文)把这种做法排在最末是有原因的,而事后唯一诚实的补救,就是在所有信任该密钥的地方把它轮换掉。

这三种都在回答“我怎么让 SSH 绕过沙箱”,而更好的问题是“代理怎样在不持有密钥、也不关掉沙箱的前提下,在我的服务器上执行一条命令”。答案就是下面的 MCP 这条路。由 Termalin 建立 SSH 连接,Codex 只是调用一个工具。Codex 做的其他一切,沙箱照样开着;而且因为 session_open / session_exec 会保持一个持久会话,代理拿到的是一个带状态的真正 shell——一次 cd、一个导出的变量、一个长时间运行的进程,都能在多次调用之间存活下来——而不是一串互不相连的一次性命令。

你需要什么

  • Termalin——桌面应用;Free 版就够用。Codex 要对接的,就是它内置的 MCP 服务器。
  • Codex CLI,在同一台机器上。
  • 在 Termalin 里保存一台主机。第一次运行,挑一台你不介意让代理去折腾的——预发布环境,或一台用完即弃的 VPS。

第 1 步——打开代理访问并设定策略

代理访问默认关闭。在 Termalin 里,打开**“设置 → 代理访问 (MCP)”**,启用它,然后勾选允许 Codex 访问的主机。在代理眼里,这份清单之外的一切都不存在;添加一台主机,是你在应用里做的决定,不是 Codex 能靠一张嘴说进来的。

底层会发生两件事。Termalin 为 MCP 服务器写一份主机清单,其中只有代理认证条目——没有密码或密钥落进那个文件。而认证始终留在应用的密钥托管方(替你保管密钥、代为签名的中间层)那里:你解锁一次,Termalin 就代表代理签名。没有任何密钥文件可供 Codex 读取,也就无从泄露——这同时也堵上了前面那条 ~/.ssh 后门。

既然在这个界面,顺手给每台主机设好代理策略:完全访问、命令允许列表或禁止。对于任何你在意的主机,都从允许列表开始——一份刚好够 Codex 完成你心里那件事的最短清单。

第 2 步——在 config.toml 里注册服务器

Codex 从 ~/.codex/config.toml 的 mcp_servers 部分读取 MCP 服务器。加一项,指向内置的 termalin-mcp 二进制文件:

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

较新的 Codex 版本也可以改用命令行添加——结果一样:

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

集成到此为止,而且同一份配置也作用于 IDE 中的 Codex。重启 Codex,确认服务器显示为已连接,这些工具就会出现在代理面前:hosts_list、ssh_exec、持久会话(session_open / session_exec)、SFTP 读写,以及端口转发。MCP 工具完整列表(英文)对每一个都有说明。

头几次会话,有个 Codex 的习惯值得保留:让它的命令批准保持开启。除非你叫它别问,否则 Codex 在动手前都会先问——现在先别叫它别问。放宽的方式和放宽主机清单一样:一次只放一件无关紧要的小事,而且是在你看过它的行为之后。

第 3 步——交给它一件真正的杂活

跳过演示命令。直接把你本来就要做的事交给它:

到 staging-1 的部署完成了,但健康检查一直在抖动。查清原因并修好它。

Codex 调用 hosts_list,看到 staging-1,打开一个会话,然后开始顺着线索查——服务状态、最近一百行日志、配置与正在运行版本之间的差异。它提出一个修复方案,在你设定的策略范围内实施,并确认检查转为绿色。

这件事之所以让人安心、而不是提心吊胆,是因为其中没有一处是看不见的。Codex 打开的每个会话都会在 Termalin 里显示为一个实时终端标签页,而**监控网格(英文)**把所有打开的会话并排放在一起,由代理驱动的窗格会高亮发光。你是在命令运行落地时实时盯着看,而不是事后读一份摘要——而且你随时可以在会话中途介入。

边界在哪里

在把 Codex 指向任何要紧的东西之前,有几条默认设置值得先知道:

  • **你的密钥绝不会进入 Codex 的环境。**托管方签名,代理只是发起请求。撤销访问是设置里的一个开关,而不是在你整个机群上做一次密钥轮换。
  • 它能触及的范围,就是你在第 1 步勾选的主机清单,而每台主机的命令策略又约束着它在那里能跑什么。生产环境上的“完全”依然是一个完整的 shell——要慎重设置。
  • 在你的**会话里输入是另一回事。**默认情况下 Codex 开它自己的会话;接入一个你已经打开的会话,是它单独的一个同意开关。它绝不会悄无声息地跟进来。
  • **每一条命令都在案。**会话录制只记录输出——绝不记录按键——而每条代理命令都会在审计日志里标记为代理所为(英文),连同它来自的设备和 IP。“这是代理干的”是你一键就能筛出来的,而不是要你去拼凑还原的故事。

当 Codex 跑在没有你桌面的地方

如果 Codex 跑在 CI 或一个云端沙箱里,而不是你的笔记本上,那本地的 stdio 二进制文件就够不着了——但 Termalin 的托管 MCP 端点够得着。在有人能登录的地方,把 https://termal.in/mcp 作为一个远程 MCP 服务器添加到 Codex,并在 Termalin 的登录页上批准一次(OAuth,无需粘贴任何密钥)。对于无人值守的运行,在网页控制台里创建一个 API 密钥,把它限定到那个任务该碰的服务器,设为只读或允许列表,并给它设一个有效期。该端点免密钥地连上你接入 Connector 的服务器,每次运行都用一张短期证书来认证——不分发任何密钥,也没有常驻的东西。完整的模式,连同一个可直接复制粘贴的流水线示例,都在在 CI/CD 中给代理 SSH 访问权(英文)里。

让它长久有效的习惯

把第一周当作带一个打字飞快的新同事上手。让监控网格一直开着。给 Codex 一些有明确完成标志的杂活——“让健康检查通过”“续签证书”——然后读一读它是怎么走到那一步的。把批准一直保持开启,直到它在那些枯燥的工具上挣得了自动批准,再一次一台、挑不起眼的主机,慢慢放宽主机清单。

这种不对称正是关键所在:Codex 拿到了真正的触达能力,而你守住了那样东西——它一旦交出去,就再也收不回来。


Termalin 是一款跨平台 SSH 客户端,内置 MCP 服务器、密钥托管方和按主机的代理策略。可以从 Codex SSH 页面入手,阅读 MCP 参考,或下载应用——Free 版主机数量不限。

先在一台主机上试试。

Termalin 是为你和你的智能体打造的高速 SSH 客户端。

免费版 · Pro 14 天试用 · 价格

将 Termalin 添加为 Google 上的优先来源