VS Code Remote-SSH 服务器环境使用 Codex 插件实操与故障排查笔记
- 第一篇:2026-06-12-GitHub_Pages3
- 如果你已经完成第一步,可以直接从这里继续排查或补充配置。
0. 背景
目标是在本地 VS Code 通过 Remote-SSH 连接远程服务器,并在远程项目中使用 OpenAI Codex 插件。
常见现象包括:
1
2
3
4
5
6
Codex 一直显示云朵图标
Codex 卡在 Thinking...
Token exchange failed: token endpoint returned status 403 Forbidden
listen EACCES: permission denied /tmp/codex-ipc/ipc-1001.sock
failed to initialize sqlite state runtime
migration 1 was previously applied but has been modified
本笔记分为三部分:
- 如何用 VS Code 连接服务器
- 如何在远程服务器环境开启 Codex
- 如何按日志排查 Codex 启动失败问题
1. 在 VS Code 中连接远程服务器
1.1 本地安装 Remote-SSH
在本地 VS Code 中安装扩展:
1
Remote - SSH
或者安装扩展包:
1
Remote Development
1.2 本地配置 SSH
先确认本地终端可以连接服务器:
1
ssh user@服务器地址
如果使用 SSH config,可以在本地配置文件中添加:
Host myserver
HostName 服务器地址
User user
Port 22
IdentityFile ~/.ssh/id_rsa
测试:
1
ssh myserver
确认能正常进入服务器后,再用 VS Code 连接。
1.3 VS Code 连接服务器
在 VS Code 中:
1
2
3
Ctrl + Shift + P
Remote-SSH: Connect to Host...
选择 myserver
连接成功后,VS Code 左下角会显示类似:
1
SSH: myserver
然后打开远程项目目录:
1
File → Open Folder...
例如:
1
/home/dm/project_name
2. 在远程 VS Code 中安装 Codex 插件
2.1 注意安装位置
Remote-SSH 模式下,VS Code 有本地环境和远程环境之分。
确认左下角已经显示:
1
SSH: myserver
然后在扩展面板中搜索:
1
Codex
安装:
1
Codex — OpenAI's coding agent
如果 VS Code 显示:
1
Install in SSH: myserver
优先选择安装到远程服务器环境。
2.2 打开 Codex
安装后:
1
2
Ctrl + Shift + P
Developer: Reload Window
然后在 VS Code 侧边栏打开 Codex 图标。
如果看不到图标,可以查看日志:
1
View → Output → Codex
3. Codex 登录方案
Codex 在 Remote-SSH 环境中登录时,可能遇到:
1
Token exchange failed: token endpoint returned status 403 Forbidden
或者登录成功后一直停留在:
1
Thinking...
这通常和远程服务器访问 Codex 登录接口、ChatGPT 接口或 OpenAI 相关服务的网络环境有关。
4. 网络方案选择:先判断是否真的需要 SSH 端口转发
这里分两种情况。
情况 A:服务器已经配置了代理或 TUN 模式
如果服务器上已经配置了 Clash Meta、TUN 模式或其他系统级代理,并且下面命令可以成功访问:
1
curl https://api.openai.com/v1/models
返回:
1
2
3
4
5
{
"error": {
"message": "Missing bearer authentication in header"
}
}
这反而说明 OpenAI API 已经可以访问。
如果执行:
1
curl -v --proxy http://127.0.0.1:7897 https://chat.openai.com
返回类似:
1
2
HTTP/2 308
location: https://chatgpt.com/
也说明:
1
2
3
4
Clash 代理正常
TLS 握手正常
DNS 正常
OpenAI / ChatGPT 链路可访问
如果同时:
1
env | grep -i proxy
没有输出,也不一定是问题。
因为 TUN 模式可能已经接管了服务器流量,不依赖 HTTP_PROXY / HTTPS_PROXY 环境变量。
这种情况下:
1
2
3
不需要配置 SSH RemoteForward
不需要额外代理转发
不应该把网络问题作为第一怀疑对象
继续看:
1
View → Output → Codex
根据 Codex 日志排查。
情况 B:服务器网络受限,本地电脑能访问,服务器不能访问
如果服务器无法直接访问 OpenAI / ChatGPT / Codex 所需服务,但本地电脑可以访问,可以使用 SSH 端口转发。
整体思路:
1
2
3
4
5
先在本地 VS Code 完成 Codex 登录
把登录认证文件复制到服务器
通过 SSH RemoteForward 把服务器端口转发到本地代理端口
在服务器配置代理环境变量
重启 VS Code Remote Server
5. 本地登录 Codex 并同步认证文件
5.1 本地 VS Code 登录 Codex
注意:这里不要连接服务器。
在本地 VS Code 中:
1
2
3
安装 Codex 插件
打开 Codex
完成 ChatGPT 登录
本地会生成 Codex 配置目录。
Windows 通常是:
1
C:\Users\<你的用户名>\.codex
Linux / macOS 通常是:
1
~/.codex
5.2 复制认证文件到服务器
知乎方案中是复制整个 .codex 目录:
1
scp -r C:\Users\<你的用户名>\.codex user@server:~/
但是更稳妥的做法是:
1
2
优先只复制 auth.json 和 config.toml
不要优先复制 state_*.sqlite / logs_*.sqlite / goals_*.sqlite / memories_*.sqlite
原因是 SQLite 状态库可能和不同平台、不同 Codex 版本的 migration 记录不一致,复制整个目录后可能触发:
1
migration 1 was previously applied but has been modified
推荐方式如下。
在服务器上先创建目录:
1
2
mkdir -p ~/.codex
chmod 700 ~/.codex
从 Windows PowerShell 复制:
1
2
scp "$env:USERPROFILE\.codex\auth.json" user@server:~/.codex/
scp "$env:USERPROFILE\.codex\config.toml" user@server:~/.codex/
如果本地没有 config.toml,可以只复制 auth.json。
服务器上设置权限:
1
2
chmod 600 ~/.codex/auth.json 2>/dev/null || true
chmod 600 ~/.codex/config.toml 2>/dev/null || true
然后重新连接 Remote-SSH。
6. 配置 SSH RemoteForward 端口转发
只有在“服务器不能直接访问,但本地电脑可以访问”的情况下才需要这一步。
如果你的服务器已经通过 Clash Meta TUN 模式正常访问 OpenAI,则跳过本节。
6.1 本地打开 SSH 配置文件
在 VS Code 中:
1
2
Ctrl + Shift + P
Remote-SSH: Open SSH Configuration File...
选择本地 SSH config 文件。
例如:
1
C:\Users\<你的用户名>\.ssh\config
或者:
1
~/.ssh/config
6.2 添加 RemoteForward
假设本地代理端口是:
1
127.0.0.1:7897
则在对应 Host 下添加:
Host myserver
HostName 服务器地址
User dm
Port 22
IdentityFile ~/.ssh/id_rsa
RemoteForward 7897 127.0.0.1:7897
含义是:
1
2
3
4
5
6
7
8
9
服务器上的 127.0.0.1:7897
↓
通过 SSH 隧道
↓
本地 Windows / macOS / Linux 的 127.0.0.1:7897
↓
本地代理软件
↓
访问 OpenAI / ChatGPT / Codex 相关服务
注意:
1
2
RemoteForward 写在本地 SSH config 中
不是写在服务器上的 ~/.ssh/config 中
6.3 常见本地代理端口
不同代理工具端口可能不同:
1
2
3
Clash / Clash Verge / Clash Meta: 7890 / 7897
SOCKS 工具: 1080
其他工具:以实际本地监听端口为准
确认本地代理监听端口后,再配置 RemoteForward。
6.4 避免端口冲突
如果服务器自己已经有服务监听了:
1
127.0.0.1:7897
例如服务器本身已经运行 Clash,那么不要再写:
RemoteForward 7897 127.0.0.1:7897
否则可能出现端口绑定失败或转发不生效。
可换一个服务器端监听端口,例如:
RemoteForward 17897 127.0.0.1:7897
然后服务器环境变量也对应改成:
1
2
3
export HTTP_PROXY=http://127.0.0.1:17897
export HTTPS_PROXY=http://127.0.0.1:17897
export ALL_PROXY=http://127.0.0.1:17897
7. 在服务器配置代理环境变量
如果使用 RemoteForward,需要在服务器上设置代理环境变量。
编辑服务器上的:
1
~/.bashrc
添加:
1
2
3
export HTTP_PROXY=http://127.0.0.1:7897
export HTTPS_PROXY=http://127.0.0.1:7897
export ALL_PROXY=http://127.0.0.1:7897
保存后执行:
1
source ~/.bashrc
验证:
1
env | grep -i proxy
应该看到:
1
2
3
HTTP_PROXY=http://127.0.0.1:7897
HTTPS_PROXY=http://127.0.0.1:7897
ALL_PROXY=http://127.0.0.1:7897
如果使用了自定义端口,例如 17897,这里也要同步改成 17897。
8. 重启 VS Code Remote Server
修改 SSH config、RemoteForward、环境变量后,建议重启 VS Code Remote Server。
在 VS Code 中执行:
1
2
Ctrl + Shift + P
Remote-SSH: Kill VS Code Server on Host
然后重新连接服务器:
1
Remote-SSH: Connect to Host...
9. 测试网络转发是否成功
在服务器终端执行:
1
curl -v --proxy http://127.0.0.1:7897 https://chat.openai.com
如果返回类似:
1
2
HTTP/2 308
location: https://chatgpt.com/
说明代理链路是通的。
也可以测试 OpenAI API:
1
curl https://api.openai.com/v1/models
如果返回:
1
2
3
4
5
{
"error": {
"message": "Missing bearer authentication in header"
}
}
说明服务器已经能访问 OpenAI API,只是没有带认证 token。
这是正常结果,不是失败。
10. Codex 故障排查总入口
Codex 卡住时,不要只看界面状态。
优先打开:
1
View → Output → Codex
找第一条真实错误。
常见错误分为三类:
1
2
3
网络 / 认证错误
IPC socket 权限错误
SQLite migration 状态库错误
11. 问题一:Token exchange failed 403
现象
1
Token exchange failed: token endpoint returned status 403 Forbidden
或者登录后一直:
1
Thinking...
可能原因
1
2
3
4
服务器无法访问 Codex 认证服务
远程环境代理配置不完整
VS Code Server 没继承 HTTP_PROXY / HTTPS_PROXY
服务器 DNS / TLS / 代理链路异常
处理顺序
- 在本地 VS Code 完成 Codex 登录
- 只复制
auth.json/config.toml到服务器 - 如果服务器不能直连,则配置 SSH
RemoteForward - 在服务器设置
HTTP_PROXY/HTTPS_PROXY/ALL_PROXY - 执行
Remote-SSH: Kill VS Code Server on Host - 重新连接服务器
- 重新打开 Codex
12. 问题二:listen EACCES /tmp/codex-ipc
现象
Codex 日志中出现:
1
2
listen EACCES: permission denied
/tmp/codex-ipc/ipc-1001.sock
含义
Codex 启动时需要创建 IPC socket:
1
/tmp/codex-ipc/ipc-1001.sock
但当前用户没有在 /tmp/codex-ipc 目录下创建文件的权限。
检查权限
1
ls -ld /tmp/codex-ipc
本次看到类似:
1
drwxrwxr-x 2 wyh wyh ...
当前用户是:
1
whoami
输出:
1
dm
对于用户 dm 来说:
1
2
other 权限 = r-x
没有 w
因此无法创建 socket 文件。
修复方式
执行:
1
sudo chmod 1777 /tmp/codex-ipc
如果没有 sudo 权限,需要联系服务器管理员执行。
再次检查:
1
ls -ld /tmp/codex-ipc
期望看到:
1
drwxrwxrwt
含义:
1
2
3
4
所有用户都可以创建自己的 socket
sticky bit 生效
不能随便删除别人的文件
适合共享服务器上的临时 IPC 目录
判断是否修复成功
重新打开 Codex 日志:
1
View → Output → Codex
如果:
1
listen EACCES
消失,说明 IPC 权限问题已经解决。
13. 问题三:SQLite migration 校验失败
现象
IPC 权限修复后,日志变成:
1
2
3
failed to initialize sqlite state runtime
migration 1 was previously applied but has been modified
under /home/dm/.codex
或类似:
1
2
3
4
5
Codex cannot access its local database
Database path:
~/.codex/state_5.sqlite
migration 1 was previously applied but has been modified
含义
Codex 启动时会读取:
1
~/.codex/state_5.sqlite
并校验 migration 记录。
现在的问题是:
1
2
3
数据库中记录的 migration
和当前 Codex 版本内置的 migration
不一致
因此 Codex 主动退出。
高风险来源
如果你曾经做过这些操作,更容易触发:
1
2
3
4
从 Windows 复制整个 .codex 到 Linux 服务器
从 WSL / Windows / Desktop App 共用同一个 .codex
不同版本 Codex 共用同一个 state_5.sqlite
复制了 state_*.sqlite / logs_*.sqlite 等状态库
所以不要优先复制整个 .codex 目录。
更推荐:
1
2
3
只复制 auth.json
必要时复制 config.toml
不要复制 SQLite 状态库
14. 修复 SQLite migration 问题
14.1 不要直接删除整个 ~/.codex
不要一上来执行:
1
rm -rf ~/.codex
因为里面可能有:
1
2
auth.json
config.toml
删除后可能需要重新登录或重新配置。
14.2 先备份
关闭 VS Code 远程窗口后,在服务器执行:
1
pkill -f codex || true
然后备份:
1
2
TS=$(date +%Y%m%d-%H%M%S)
cp -a ~/.codex ~/.codex.backup-$TS
确认备份存在:
1
ls -ld ~/.codex.backup-$TS
14.3 第一轮:只移动 state_5.sqlite
这是最可疑的文件。
1
2
3
4
TS=$(date +%Y%m%d-%H%M%S)
mkdir -p ~/.codex/recover-$TS
mv ~/.codex/state_5.sqlite* ~/.codex/recover-$TS/ 2>/dev/null || true
然后重新连接 VS Code Remote-SSH,打开 Codex。
如果成功,说明问题就是 state_5.sqlite。
14.4 第二轮:移动 logs 数据库
如果仍然报:
1
migration 1 was previously applied but has been modified
继续执行:
1
2
3
4
TS=$(date +%Y%m%d-%H%M%S)
mkdir -p ~/.codex/recover-$TS
mv ~/.codex/logs_*.sqlite* ~/.codex/recover-$TS/ 2>/dev/null || true
然后重启 VS Code Remote-SSH。
14.5 第三轮:移动所有 SQLite 状态库
如果仍然失败,可以移动所有 SQLite 状态文件,但保留 auth.json 和 config.toml。
1
2
3
4
TS=$(date +%Y%m%d-%H%M%S)
mkdir -p ~/.codex/recover-$TS
mv ~/.codex/*.sqlite* ~/.codex/recover-$TS/ 2>/dev/null || true
然后重新启动 Codex。
15. 当前这次问题的实际结论
根据目前记录,本次不是网络问题。
已经确认:
1
2
3
4
5
6
7
Clash Meta 正常
TUN 模式正常
OpenAI API 可访问
ChatGPT 入口可访问
TLS 正常
DNS 正常
不需要 SSH RemoteForward
执行:
1
curl https://api.openai.com/v1/models
返回:
1
2
3
4
5
{
"error": {
"message": "Missing bearer authentication in header"
}
}
说明 API 链路正常。
执行:
1
curl -v --proxy http://127.0.0.1:7897 https://chat.openai.com
返回:
1
2
HTTP/2 308
location: https://chatgpt.com/
说明代理链路正常。
已解决的问题
原始错误:
1
2
listen EACCES: permission denied
/tmp/codex-ipc/ipc-1001.sock
原因:
1
2
/tmp/codex-ipc 属于 wyh:wyh
当前用户 dm 对该目录没有写权限
修复:
1
sudo chmod 1777 /tmp/codex-ipc
修复后:
1
listen EACCES 消失
当前剩余问题
当前错误:
1
2
3
failed to initialize sqlite state runtime
migration 1 was previously applied but has been modified
under /home/dm/.codex
最可疑文件:
1
/home/dm/.codex/state_5.sqlite
推荐下一步:
1
2
3
4
5
6
7
pkill -f codex || true
TS=$(date +%Y%m%d-%H%M%S)
cp -a ~/.codex ~/.codex.backup-$TS
mkdir -p ~/.codex/recover-$TS
mv ~/.codex/state_5.sqlite* ~/.codex/recover-$TS/ 2>/dev/null || true
然后:
1
2
3
4
Ctrl + Shift + P
Remote-SSH: Kill VS Code Server on Host
重新连接服务器
打开 Codex
如果仍失败,再执行:
1
2
3
4
TS=$(date +%Y%m%d-%H%M%S)
mkdir -p ~/.codex/recover-$TS
mv ~/.codex/logs_*.sqlite* ~/.codex/recover-$TS/ 2>/dev/null || true
最后才考虑:
1
2
3
4
TS=$(date +%Y%m%d-%H%M%S)
mkdir -p ~/.codex/recover-$TS
mv ~/.codex/*.sqlite* ~/.codex/recover-$TS/ 2>/dev/null || true
但始终保留:
1
2
auth.json
config.toml
16. 总排查流程图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Codex 卡住 / 云朵图标 / Thinking...
|
v
View → Output → Codex
|
v
先看第一条真实错误
|
+-- Token exchange failed 403?
| |
| +-- 服务器不能访问,只有本地能访问:
| | 本地登录 Codex
| | 复制 auth.json / config.toml
| | 配置 RemoteForward
| | 配置 HTTP_PROXY / HTTPS_PROXY / ALL_PROXY
| | Kill VS Code Server
| |
| +-- 服务器已经 TUN 接管且 curl 正常:
| 不要继续纠结代理
| 继续看后续日志
|
+-- listen EACCES /tmp/codex-ipc?
| |
| +-- 检查:
| | ls -ld /tmp/codex-ipc
| |
| +-- 修复:
| sudo chmod 1777 /tmp/codex-ipc
|
+-- failed to initialize sqlite state runtime?
|
+-- 备份:
| cp -a ~/.codex ~/.codex.backup-$TS
|
+-- 第一轮:
| mv ~/.codex/state_5.sqlite* ~/.codex/recover-$TS/
|
+-- 第二轮:
| mv ~/.codex/logs_*.sqlite* ~/.codex/recover-$TS/
|
+-- 第三轮:
mv ~/.codex/*.sqlite* ~/.codex/recover-$TS/
保留 auth.json 和 config.toml
17. 最终一句话总结
在 VS Code Remote-SSH 环境中使用 Codex 时,先区分“网络认证问题”和“本地运行时问题”。
如果服务器网络不通,可以用:
1
2
3
4
5
本地登录 Codex
复制 auth.json / config.toml
SSH RemoteForward
服务器代理环境变量
重启 VS Code Remote Server
如果服务器网络已经通过 Clash Meta TUN 正常访问 OpenAI,则不要把问题继续归因于代理。
本次实际问题链路是:
1
2
3
4
5
6
7
第一阶段:
/tmp/codex-ipc 没有写权限
导致 listen EACCES
第二阶段:
~/.codex/state_5.sqlite migration 校验不一致
导致 sqlite state runtime 初始化失败
处理顺序应该是:
1
2
3
4
看 Codex 日志
先修 /tmp/codex-ipc 权限
再处理 ~/.codex 下的 SQLite 状态库
尽量保留 auth.json 和 config.toml