远程服务器配置 Codex CLI 与 VSCode Codex 扩展流程
0、前言
本文整理自我在配置远程服务器 Codex CLI 与 VSCode Codex 扩展过程中,与 AI 助手多轮排查、反复试错后的聊天记录。由于服务器无外网、无 root 权限,同时还涉及本地代理、SSH 反向端口转发、VSCode Remote 环境变量、CA 证书、Codex 登录状态与扩展通信等多个环节,整个过程并不是简单照抄几条命令就能完成的。本文的价值不在于提供一套“保证一次成功”的固定脚本,而是从实际排错过程中总结出关键配置流程、核心检查方法和常见问题的解决思路。
需要特别说明的是,我最终虽然配置成功了,但并没有严格按照本文整理后的顺序重新从零验证一遍。因此,读者如果完全照着本文逐步操作,仍然很可能遇到与我不同的错误。更推荐的使用方式是:将本文作为一份“问题地图”和“排错线索”,配合 ChatGPT、Claude、Copilot 或其他 AI 工具一起使用,把自己的终端输出、报错信息和当前环境告诉 AI,让它结合本文中的关键逻辑进行针对性判断。实践上,建议优先把 Codex CLI 跑通,再去配置 VSCode Codex 扩展;CLI 能验证代理、登录、证书和后端通信是否正常,插件问题也会更容易定位,这样会事半功倍。
1. 整体思路
本地 Windows 已有代理服务,例如:
127.0.0.1:7890
远程服务器没有外网,也没有 root 权限,因此通过 SSH 反向代理,把本地代理映射到远程服务器:
远程服务器 127.0.0.1:17891 → 本地电脑 127.0.0.1:7890
之后让远程服务器上的 Codex CLI 和 VSCode Codex 扩展都走:
http://127.0.0.1:17891
2. 本地 SSH 配置反向代理
在 Windows 本地 SSH 配置文件中加入:
Host NF5468M6
HostName 服务器地址
User group2
RemoteForward 17891 127.0.0.1:7890
ServerAliveInterval 30
ServerAliveCountMax 3
然后用 VSCode Remote-SSH 重新连接服务器。
连接后,在远程服务器测试端口是否可达:
python - <<'PY'
import socket
try:
s = socket.create_connection(("127.0.0.1", 17891), timeout=5)
print("OK: remote 127.0.0.1:17891 is reachable")
s.close()
except Exception as e:
print("FAILED:", repr(e))
PY
3. 准备 CA 证书文件
如果远程服务器缺少系统 CA,Codex 可能报:
no native root CA certificates found
可直接使用 conda / Python 环境中的 certifi 证书:
mkdir -p ~/.codex/certs
CERT=$(python - <<'PY'
import certifi
print(certifi.where())
PY
)
cp "$CERT" ~/.codex/certs/cacert.pem
chmod 600 ~/.codex/certs/cacert.pem
test -s ~/.codex/certs/cacert.pem && echo "CA 文件已就绪"
4. 配置远程环境变量
创建统一环境变量文件:
cat > ~/.codex/remote-env.sh <<'EOF'
export HTTP_PROXY="http://127.0.0.1:17891"
export HTTPS_PROXY="http://127.0.0.1:17891"
export http_proxy="http://127.0.0.1:17891"
export https_proxy="http://127.0.0.1:17891"
export WS_PROXY="http://127.0.0.1:17891"
export WSS_PROXY="http://127.0.0.1:17891"
export ws_proxy="http://127.0.0.1:17891"
export wss_proxy="http://127.0.0.1:17891"
export NO_PROXY="localhost,127.0.0.1,::1"
export no_proxy="localhost,127.0.0.1,::1"
export SSL_CERT_FILE="$HOME/.codex/certs/cacert.pem"
export OPENSSL_CERT_FILE="$HOME/.codex/certs/cacert.pem"
export REQUESTS_CA_BUNDLE="$HOME/.codex/certs/cacert.pem"
export CURL_CA_BUNDLE="$HOME/.codex/certs/cacert.pem"
export NODE_EXTRA_CA_CERTS="$HOME/.codex/certs/cacert.pem"
export NIX_SSL_CERT_FILE="$HOME/.codex/certs/cacert.pem"
export PATH="$HOME/bin:$HOME/.local/bin:$PATH"
EOF
chmod 600 ~/.codex/remote-env.sh
将其写入 shell 启动文件。建议放在 .bashrc 最前面:
cp ~/.bashrc ~/.bashrc.bak.$(date +%Y%m%d_%H%M%S)
grep -v 'remote-env.sh' ~/.bashrc > ~/.bashrc.tmp
{
echo '[ -f "$HOME/.codex/remote-env.sh" ] && . "$HOME/.codex/remote-env.sh"'
cat ~/.bashrc.tmp
} > ~/.bashrc
rm ~/.bashrc.tmp
grep -q 'remote-env.sh' ~/.profile 2>/dev/null || \
echo '[ -f "$HOME/.codex/remote-env.sh" ] && . "$HOME/.codex/remote-env.sh"' >> ~/.profile
grep -q 'remote-env.sh' ~/.bash_profile 2>/dev/null || \
echo '[ -f "$HOME/.codex/remote-env.sh" ] && . "$HOME/.codex/remote-env.sh"' >> ~/.bash_profile
测试是否生效:
bash -lc 'env | grep -Ei "proxy|SSL|CERT|CA_BUNDLE|NODE_EXTRA|NIX_SSL|WS_PROXY|WSS_PROXY"'
5. 配置 Codex CLI
如果 Codex CLI 已经安装在远程服务器,例如:
/home/Groups/group2/.local/bin/codex
如果没有安装可以本地下载安装包上传到服务器再进行本地安装,网上的帖子很多,这里本文不做赘述。
可以创建包装脚本,保证每次运行都带代理和证书环境:
mkdir -p ~/bin
cat > ~/bin/codex <<'EOF'
#!/usr/bin/env bash
[ -f "$HOME/.codex/remote-env.sh" ] && . "$HOME/.codex/remote-env.sh"
exec "$HOME/.local/bin/codex" "$@"
EOF
chmod +x ~/bin/codex
确保优先使用包装脚本:
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
which codex
type -a codex
运行:
codex
6. 配置 VSCode Codex 扩展
创建 VSCode Server 环境配置文件:
mkdir -p ~/.vscode-server
cat > ~/.vscode-server/server-env-setup <<'EOF'
#!/bin/sh
[ -f "$HOME/.codex/remote-env.sh" ] && . "$HOME/.codex/remote-env.sh"
EOF
chmod +x ~/.vscode-server/server-env-setup
然后在本地 VSCode 中执行:
Ctrl + Shift + P
Remote-SSH: Kill VS Code Server on Host...
重新连接服务器。
连接后检查 VSCode 远程扩展进程是否继承变量:
for pid in $(pgrep -u "$USER" -f extensionHost); do
echo "===== extensionHost PID=$pid ====="
cat /proc/$pid/environ | tr '\0' '\n' | grep -Ei 'proxy|SSL|CERT|CA_BUNDLE|NODE_EXTRA|NIX_SSL|WS_PROXY|WSS_PROXY|PATH'
done
需要看到类似内容:
HTTP_PROXY=http://127.0.0.1:17891
HTTPS_PROXY=http://127.0.0.1:17891
SSL_CERT_FILE=/home/Groups/group2/.codex/certs/cacert.pem
NODE_EXTRA_CA_CERTS=/home/Groups/group2/.codex/certs/cacert.pem
WSS_PROXY=http://127.0.0.1:17891
确认后再使用 VSCode Codex 扩展。
关键问题与解决方案
1. 远程服务器没有外网
问题表现:
error sending request for url
connection timed out
解决方案:
使用 SSH 反向代理:
RemoteForward 17891 127.0.0.1:7890
远程统一走:
http://127.0.0.1:17891
2. 代理端口可达,但 Codex 仍然报错
问题表现:
stream disconnected before completion
error sending request for url
原因通常不是端口问题,而是 Codex 子进程没有继承代理或证书变量。
解决方案:
检查 extensionHost 环境:
cat /proc/$(pgrep -u "$USER" -f extensionHost | head -n1)/environ \
| tr '\0' '\n' \
| grep -Ei 'proxy|SSL|CERT|NODE_EXTRA'
如果只有 HTTP_PROXY / HTTPS_PROXY,没有 SSL_CERT_FILE / NODE_EXTRA_CA_CERTS,需要重新配置远程环境变量并重启 VSCode Server。
3. 远程服务器缺少系统 CA 证书
问题表现:
no native root CA certificates found
解决方案:
使用 Python certifi 证书:
mkdir -p ~/.codex/certs
CERT=$(python - <<'PY'
import certifi
print(certifi.where())
PY
)
cp "$CERT" ~/.codex/certs/cacert.pem
chmod 600 ~/.codex/certs/cacert.pem
然后设置:
export SSL_CERT_FILE="$HOME/.codex/certs/cacert.pem"
export NODE_EXTRA_CA_CERTS="$HOME/.codex/certs/cacert.pem"
4. CLI 可以用,但 VSCode 扩展不能用
原因:
CLI 运行在当前 shell 中,可以读取 .bashrc;VSCode 扩展运行在远程 extensionHost 中,不一定继承当前终端环境。
解决方案:
同时配置:
~/.codex/remote-env.sh
~/.bashrc
~/.profile
~/.bash_profile
~/.vscode-server/server-env-setup
然后必须执行:
Remote-SSH: Kill VS Code Server on Host...
再重新连接。
5. 包装脚本路径写错
错误写法:
exec /home/Groups/group2/.codex/bin/codex "$@"
如果实际 Codex 在:
/home/Groups/group2/.local/bin/codex
应改为:
exec "$HOME/.local/bin/codex" "$@"
否则会报:
No such file or directory
6. server-env-setup 不一定单独生效
如果重连后 extensionHost 仍然没有 CA 变量,说明 VSCode Server 没有正确读取该文件。
解决方案:
把环境变量也写入 .bashrc 最顶部,而不是只依赖:
~/.vscode-server/server-env-setup
关键是 .bashrc 顶部要有:
[ -f "$HOME/.codex/remote-env.sh" ] && . "$HOME/.codex/remote-env.sh"
不要放到底部,因为很多服务器的 .bashrc 中间会对非交互 shell 提前 return。
7. 登录成功后仍出现 codex/responses 报错
问题表现:
stream disconnected before completion: error sending request for url (https://chatgpt.com/backend-api/codex/responses)
排查顺序:
- 确认远程
127.0.0.1:17891可达; - 确认代理能访问
https://www.google.com或https://api.openai.com/v1/models; - 确认
extensionHost进程包含代理变量; - 确认
extensionHost进程包含 CA 变量; - Kill VSCode Server 后重新连接;
- 再打开 Codex 扩展测试。
核心判断:
for pid in $(pgrep -u "$USER" -f extensionHost); do
echo "===== extensionHost PID=$pid ====="
cat /proc/$pid/environ | tr '\0' '\n' | grep -Ei 'proxy|SSL|CERT|CA_BUNDLE|NODE_EXTRA|NIX_SSL|WS_PROXY|WSS_PROXY|PATH'
done
只要 extensionHost 同时继承代理变量和 CA 变量,VSCode Codex 扩展才有较大概率正常工作。
参考博客
[1] 傻瓜式完全解决!在远程服务器上使用codex、vscode辅助
[2] 通过VS code远程连接服务器使用codex
[3] 在 VS Code Remote SSH 中为 Codex 扩展配置远程代理教程
[4] CodeX在Vscode中与服务器不适配的Bug
[5] VS Code Remote-SSH: Codex extension stuck on “Thinking”
[6] 如何在服务器上使用Codex
[7] 服务器反向代理+vscode+ssh+服务器登陆codex cli
[8] VSCode远程连接服务器Codex无法登录+成功登录后一直thinking状态
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)