Codex 在 VS Code + ModelArts 场景下的登录与配置总结
1. 目标
本次配置的目标是:
- 在 本机 Windows + VS Code 中完成 Codex 登录
- 在 ModelArts Notebook / Remote-SSH 场景下,让 Codex 相关请求能够通过本机代理转发访问外网
- 在远端环境中安装并使用
codexCLI - 最终打通 VS Code 插件 / 远端 CLI / 代理链路 / SSH 配置 这几部分
2. 主要问题与处理过程
2.1 VS Code Remote-SSH 无法连接新版本 VS Code Server
远端日志显示:
- 远端系统是
EulerOS 2.0 (SP8) libstdc++最高只有GLIBCXX_3.4.24- 新版 VS Code Server 需要更高版本(如
GLIBCXX_3.4.25+)
因此处理方式是:
- 保留新版 VS Code 用于 Codex
- 额外安装一个 旧版 VS Code 1.98.x Portable
- 专门用旧版连接 ModelArts
2.2 旧版 VS Code 和新版 VS Code 的 SSH 配置互相覆盖
原因:
- 两个 VS Code 实例如果共用同一个
~/.ssh/config,或者共用同一份用户设置,就会互相影响
解决方式:
- 给旧版 VS Code 单独准备一个 SSH 配置文件,例如:
text
C:\Users\24385\.ssh\config-modelarts
- 在旧版 VS Code 中设置:
json
{
"remote.SSH.configFile": "C:\\Users\\24385\\.ssh\\config-modelarts"
}
这样旧版只会读 config-modelarts,新版继续使用默认 config
2.3 本机 Codex 登录过程中遇到 1455 端口占用
执行:
powershell
codex login
报错:
Port 127.0.0.1:1455 is already in use
解决方式:
改用设备码登录:
powershell
codex login --device-auth
这样就不依赖本地 1455 浏览器回调端口。
2.4 本机 Codex 登录成功,但远端/插件仍然异常
后来发现:
- 旧版本 Codex CLI(如
v0.46.0)太旧 - 并且还存在自定义 API 地址覆盖问题,例如请求被发到了:
text
https://api.mczbc.cn/v1/responses
这说明不是在走默认官方 OpenAI 端点,而是某个代理或自定义 base URL 配置覆盖了请求。
处理方式:
- 升级 Codex CLI 到较新版本(如
0.125.0) - 检查并清理
OPENAI_*相关环境变量 - 检查
~/.codex/config.toml是否配置了自定义openai_base_url
2.5 ModelArts 远端安装 Codex 时出现只读文件系统问题
执行:
bash
npm install -g @openai/codex
报错:
EROFS: read-only file system
原因:
- ModelArts 环境中的全局 npm 安装目录不可写
解决方式:
改为安装到用户目录:
bash
mkdir -p ~/.local/codex
npm install -g @openai/codex --prefix ~/.local/codex
然后将 Codex 可执行目录加入 PATH:
bash
export PATH="$HOME/.local/codex/bin:$PATH"
codex --version
如果执行 codex --version 成功,说明实际上已经安装好了,只是之前 shell 找不到命令。
为了永久生效,再写入:
bash
echo 'export PATH="$HOME/.local/codex/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
2.6 新环境中 codex 命令找不到
虽然 ~/.codex 目录存在,但这并不代表 Codex 已经安装。
需要区分:
~/.codex:配置/认证/缓存目录~/.local/codex/bin/codex:真正的可执行文件
处理方式:
bash
ls -l ~/.local/codex/bin
find ~/.local -name codex 2>/dev/null
echo $PATH
如果安装目录里有 codex,但命令找不到,就执行:
bash
export PATH="$HOME/.local/codex/bin:$PATH"
2.7 远端 codex login --device-auth 报 403
在 ModelArts 上执行:
bash
codex login --device-auth
返回:
403 Forbidden
这通常表示:
- 远端 device-code 登录路径不可用
- 或服务端不接受当前环境的 device-code 登录
后续采用的思路是:
- 先在本机完成登录
- 再把本机的 Codex 凭据文件复制到远端
2.8 将本机 auth.json 复制到远端
先在远端创建目录:
powershell
ssh -F C:\Users\24385\.ssh\config-modelarts ModelArts-notebook-b828 "mkdir -p ~/.codex"
再复制本机认证文件:
powershell
scp -F C:\Users\24385\.ssh\config-modelarts $HOME\.codex\auth.json ModelArts-notebook-b828:~/.codex/auth.json
含义:
- 第一句:登录到远端并创建
~/.codex - 第二句:把本机
C:\Users\24385\.codex\auth.json复制到远端~/.codex/auth.json
需要注意:
-F表示指定读取config-modelarts- 否则 PowerShell 中的
ssh/scp只会默认读取C:\Users\24385\.ssh\config - 这也是之前出现 "Could not resolve hostname ..." 的原因
2.9 配置 SSH 反向端口转发,让远端借用本机代理
在 config-modelarts 中添加:
ssh
Host ModelArts-notebook-b828
HostName dev-XXXX
Port 31851
User ma-user
IdentityFile C:/XXXX
StrictHostKeyChecking no
UserKnownHostsFile NUL
ForwardAgent yes
RemoteForward 10240 127.0.0.1:7897
含义:
- 在远端打开
127.0.0.1:10240 - 实际流量经 SSH 回到本机
127.0.0.1:7897 - 本机
7897是 Clash Verge 的代理端口
2.10 为什么感觉 10240 没生效
后续排查发现:
远端执行:
bash
env | grep -i proxy
显示默认仍然是:
text
HTTP_PROXY=http://proxy-notebook.modelarts.com:8083
HTTPS_PROXY=http://proxy-notebook.modelarts.com:8083
说明:
- 你的 SSH
RemoteForward 10240 -> 7897很可能已经建立 - 但远端 shell 默认仍然优先使用 ModelArts 自带的代理
8083 - 所以看起来像"10240 没生效"
真正验证方式应该是显式指定代理:
bash
curl -I https://chatgpt.com -x http://127.0.0.1:10240
curl -I https://chatgpt.com/backend-api/wham/apps -x http://127.0.0.1:10240
结果显示:
chatgpt.com首页返回403 cf-mitigated: challengebackend-api/wham/apps返回405 Method Not Allowed,并带有x-oai-request-id
这实际上是成功结果,说明:
- 请求已经通过
127.0.0.1:10240 - 再通过本机
7897 - 成功到达了 OpenAI / ChatGPT 后端接口
其中:
403首页挑战:说明 Cloudflare 不让curl直接访问首页405对接口:说明接口通了,只是-I发的是HEAD,而该接口要求POST
因此最终确认:
RemoteForward 10240 127.0.0.1:7897已经生效
2.11 VS Code 里的 Http: Proxy = http://127.0.0.1:10240 为什么看起来"没生效"
这个设置主要作用于:
- VS Code 自己的网络请求
- 部分走 VS Code 网络层的扩展
它不会自动覆盖远端终端里的:
curlnpmpipcodex- 其他 shell 命令
所以要让终端默认走 10240,还需要手工切换环境变量:
bash
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY all_proxy ftp_proxy FTP_PROXY
export HTTP_PROXY=http://127.0.0.1:10240
export HTTPS_PROXY=http://127.0.0.1:10240
export http_proxy=http://127.0.0.1:10240
export https_proxy=http://127.0.0.1:10240
如果希望 npm 也使用这条链路,还可以补上:
bash
npm config set proxy http://127.0.0.1:10240
npm config set https-proxy http://127.0.0.1:10240
3. 本次配置中最关键的命令
3.1 本机登录 Codex
powershell
codex logout
codex login --device-auth
3.2 查询 Codex 版本和安装位置
powershell
codex --version
where.exe codex
Get-ChildItem Env:OPENAI*
3.3 远端用户目录安装 Codex
bash
mkdir -p ~/.local/codex
npm install -g @openai/codex --prefix ~/.local/codex
export PATH="$HOME/.local/codex/bin:$PATH"
codex --version
3.4 永久加入 PATH
bash
echo 'export PATH="$HOME/.local/codex/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
3.5 检查代理变量
bash
env | grep -i proxy
3.6 显式测试 SSH 转发代理是否通到 ChatGPT
bash
curl -I https://chatgpt.com -x http://127.0.0.1:10240
curl -I https://chatgpt.com/backend-api/wham/apps -x http://127.0.0.1:10240
3.7 在远端手工切换到自己的代理
bash
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY all_proxy ftp_proxy FTP_PROXY
export HTTP_PROXY=http://127.0.0.1:10240
export HTTPS_PROXY=http://127.0.0.1:10240
export http_proxy=http://127.0.0.1:10240
export https_proxy=http://127.0.0.1:10240
3.8 给 npm 单独设置代理
bash
npm config set proxy http://127.0.0.1:10240
npm config set https-proxy http://127.0.0.1:10240
3.9 本机凭据同步到远端
powershell
ssh -F C:\Users\24385\.ssh\config-modelarts ModelArts-notebook-b828 "mkdir -p ~/.codex"
scp -F C:\Users\24385\.ssh\config-modelarts $HOME\.codex\auth.json ModelArts-notebook-b828:~/.codex/auth.json
3.10 旧版 VS Code 与新版隔离 SSH 配置
旧版 VS Code 的 settings.json:
json
{
"remote.SSH.configFile": "C:\\Users\\24385\\.ssh\\config-modelarts"
}
4. 最终结论
本次成功路径本质上是:
- 本机先完成 Codex 登录
- 旧版 VS Code 专门负责连接 ModelArts
- 远端 Codex 通过用户目录安装
- 通过 SSH
RemoteForward将远端10240转发到本机 Clash7897 - 用
curl -x http://127.0.0.1:10240验证链路通到 ChatGPT/OpenAI 后端 - 必要时把本机
auth.json复制到远端 - 区分 VS Code 代理设置与 shell 环境变量代理的作用范围
一句话总结:
本次并不是单纯"登录一下 Codex",而是同时打通了 本机登录、旧版 VS Code、Remote-SSH、SSH 反向代理、远端 Codex 安装、环境变量 PATH、以及终端/插件代理链路 这几部分,最终让 Codex 在 VS Code + ModelArts 场景下可用。