0%

服务器 Codex Device Code 切换账户登录说明

服务器 Codex Device Code 切换账户登录说明

本文记录在服务器环境中使用 codex-proxy login --device-auth 退出旧账户并登录新账户的流程。

这篇文章和《服务器 Codex 反向代理使用说明》是同一套使用场景:服务器本身无法直接访问 OpenAI,需要先通过本地 Windows 电脑的 v2rayN、Clash、Clash Verge 等代理建立 SSH 反向隧道,再让服务器上的 Codex 通过 codex-proxy 访问外网。

适用场景:

  1. 服务器已经安装 codexcodex-proxy
  2. 本地电脑已经建立 SSH 反向代理。
  3. 需要从旧 ChatGPT/Codex 账户切换到新账户。
  4. 服务器没有浏览器,需要使用 device code 在本地浏览器完成登录。

1. 前提条件

开始前,建议先确认上一篇文章中的反向代理链路已经可用。

本地 Windows PowerShell 中需要保持 SSH 反向隧道窗口打开:

1
ssh -N -T -o ExitOnForwardFailure=yes -R 43897:127.0.0.1:7897 your_user@your_server_ip

其中:

  • 43897:服务器端监听端口;
  • 7897:本地代理端口,例如 v2rayN、Clash、Clash Verge 等;
  • your_user:服务器用户名;
  • your_server_ip:服务器 IP 地址。

注意:这个 PowerShell 窗口需要一直保持打开,关闭后服务器上的反向代理会断开。

2. 检查当前 Codex 状态

登录服务器后,先检查当前用户、Codex 命令位置和认证文件:

1
2
3
4
5
6
7
whoami
which codex
which codex-proxy
codex-proxy --version

ls -la ~/.codex
ls -l ~/.codex/auth.json 2>/dev/null || echo "no auth.json"

如果需要查看 auth.json 的基本结构,但不暴露 token,可以执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
python3 - <<'PY'
import json, os

p = os.path.expanduser("~/.codex/auth.json")

if not os.path.exists(p):
print("auth.json not found")
else:
with open(p) as f:
data = json.load(f)

print("auth.json exists")
print("top-level keys:", list(data.keys()))
PY

3. 退出当前 Codex 账户

优先使用官方退出命令:

1
codex-proxy logout

然后检查认证文件是否仍然存在:

1
ls -l ~/.codex/auth.json 2>/dev/null || echo "auth.json removed"

如果退出后仍然存在认证问题,可以手动备份并删除 auth.json

1
2
3
mkdir -p ~/.codex_auth_backup
cp ~/.codex/auth.json ~/.codex_auth_backup/auth.json.$(date +%Y%m%d_%H%M%S) 2>/dev/null || true
rm -f ~/.codex/auth.json

4. 清理旧的 Codex 后台进程

如果之前启动过 codex app-server,建议在重新登录前清理旧进程。

先查看当前用户下的 Codex 相关进程:

1
ps -u "$(whoami)" -o pid=,cmd= | grep '[c]odex' || echo "no codex process"

如果存在旧的 app-server 进程,可以只清理当前用户下的相关进程:

1
2
3
4
5
ps -u "$(whoami)" -o pid=,cmd= \
| grep 'codex app-server' \
| grep -v grep \
| awk '{print $1}' \
| xargs -r kill -9

不要在多用户服务器上直接使用不带用户限制的 pkill -f codex,否则可能误匹配其他用户的 Codex 进程。

再次检查是否还有残留进程:

1
ps -u "$(whoami)" -o pid=,cmd= | grep '[c]odex' || echo "no codex process"

5. 检查反向代理是否可用

在服务器上测试 OpenAI 是否能通过反向代理访问:

1
curl -I -x http://127.0.0.1:43897 https://api.openai.com

如果能看到 HTTP 响应,说明反向代理可用。

如果连接失败,先回到本地 Windows PowerShell,确认 SSH 反向隧道仍然打开:

1
ssh -N -T -o ExitOnForwardFailure=yes -R 43897:127.0.0.1:7897 your_user@your_server_ip

也可以在本地电脑测试本地代理端口:

1
curl.exe -I -x http://127.0.0.1:7897 https://www.google.com

6. 使用 Device Code 登录新账户

在服务器上执行:

1
codex-proxy login --device-auth

终端一般会输出:

  • 一个登录链接;
  • 一个一次性 device code。

操作步骤:

  1. 在本地浏览器中打开终端显示的登录链接。
  2. 登录你要切换到的新 ChatGPT/Codex 账户。
  3. 输入服务器终端显示的 device code。
  4. 等待服务器终端显示登录成功。

建议使用浏览器无痕窗口,避免浏览器自动复用旧账户。

7. 检查新账户登录状态

登录完成后,在服务器上执行:

1
ls -l ~/.codex/auth.json

继续检查认证文件结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
python3 - <<'PY'
import json, os

p = os.path.expanduser("~/.codex/auth.json")

print("exists:", os.path.exists(p))

if os.path.exists(p):
with open(p) as f:
data = json.load(f)

print("keys:", list(data.keys()))
PY

如果 auth.json 存在,并且能正常读取,说明新的本地认证文件已经生成。

8. 启动 Codex

进入你的项目目录:

1
cd /path/to/your/project

通过代理启动 Codex:

1
codex-proxy

不要直接执行:

1
codex

因为直接运行 codex 可能不会带上你在 codex-proxy 中配置的代理环境变量。

9. 一键完整流程

如果只是想快速完成“退出旧账户并登录新账户”,可以直接执行下面的完整命令:

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
echo "== current =="
whoami
which codex || true
which codex-proxy || true
codex-proxy --version || true
ls -l ~/.codex/auth.json 2>/dev/null || echo "no auth.json"

echo "== logout =="
codex-proxy logout || true
mkdir -p ~/.codex_auth_backup
cp ~/.codex/auth.json ~/.codex_auth_backup/auth.json.$(date +%Y%m%d_%H%M%S) 2>/dev/null || true
rm -f ~/.codex/auth.json

echo "== kill old app-server =="
ps -u "$(whoami)" -o pid=,cmd= \
| grep 'codex app-server' \
| grep -v grep \
| awk '{print $1}' \
| xargs -r kill -9
ps -u "$(whoami)" -o pid=,cmd= | grep '[c]odex' || echo "no codex process"

echo "== test proxy =="
curl -I -x http://127.0.0.1:43897 https://api.openai.com

echo "== login new account =="
codex-proxy login --device-auth

echo "== check auth =="
ls -l ~/.codex/auth.json

10. 常见问题

10.1 codex-proxy login --device-auth 无法打开登录页面

可能原因:

  1. 服务器代理不可用。
  2. SSH 反向隧道未启动。
  3. 本地代理端口不正确。
  4. 本地代理软件未开启 HTTP 代理端口。

检查命令:

1
curl -I -x http://127.0.0.1:43897 https://api.openai.com

如果该命令失败,优先修复代理。

10.2 登录后仍然是旧账户

可能原因:

  1. 旧的 auth.json 未删除。
  2. 旧的 codex app-server 进程仍在运行。
  3. 登录时浏览器自动使用了旧账户。

处理方法:

1
2
3
4
5
6
7
8
codex-proxy logout || true
rm -f ~/.codex/auth.json
ps -u "$(whoami)" -o pid=,cmd= \
| grep 'codex app-server' \
| grep -v grep \
| awk '{print $1}' \
| xargs -r kill -9
codex-proxy login --device-auth

登录时建议使用浏览器无痕窗口,确保登录的是新账户。

10.3 auth.json 不存在

可能原因:

  1. device-code 登录没有完成。
  2. 登录过程中网络中断。
  3. 没有使用 codex-proxy login --device-auth
  4. 登录成功后文件写入失败。

重新登录:

1
codex-proxy login --device-auth

10.4 启动 Codex 后网络错误

确认不是直接运行了 codex

1
codex-proxy

同时确认代理可用:

1
curl -I -x http://127.0.0.1:43897 https://api.openai.com

如果 codex-proxy 仍然无法访问网络,可以回到《服务器 Codex 反向代理使用说明》中重新检查 SSH 反向隧道、代理端口和 codex-proxy 包装脚本。

11. 日常使用流程

第一步:本地电脑打开 SSH 反向隧道

1
ssh -N -T -o ExitOnForwardFailure=yes -R 43897:127.0.0.1:7897 your_user@your_server_ip

保持该窗口不关闭。

第二步:登录服务器并进入项目目录

1
ssh your_user@your_server_ip
1
cd /path/to/your/project

第三步:启动 Codex

1
codex-proxy

第四步:需要换号时重新登录

1
2
3
codex-proxy logout
rm -f ~/.codex/auth.json
codex-proxy login --device-auth

12. 最小命令汇总

本地电脑

1
ssh -N -T -o ExitOnForwardFailure=yes -R 43897:127.0.0.1:7897 your_user@your_server_ip

服务器测试代理

1
curl -I -x http://127.0.0.1:43897 https://api.openai.com

服务器切换账户

1
2
3
codex-proxy logout || true
rm -f ~/.codex/auth.json
codex-proxy login --device-auth

服务器启动 Codex

1
codex-proxy