1. 为什么本地 VSCode 连服务器后,AI Key 反而更乱了
先说清楚这篇要解决的是什么问题。VSCode 通过 Remote SSH 连上云服务器之后,你的代码、终端、Python 环境全都跑在远端,但 AI 编程工具(Cline、Continue、Codex CLI、Claude Code 这类)的配置文件却散落在两个地方:一部分在本地 Windows/Mac 的~/.ssh/config和 VSCode 的settings.json,另一部分在服务器的~/.bashrc、~/.config目录里。结果就是每换一台机器、每加一个工具,就要重新填一遍 API Key、Base URL、Model ID,填错一个字符就报 401,排查半天发现是复制时多了个空格。
Remote SSH 本身是 VSCode 官方插件,作用是把本地编辑器的界面和远端服务器的文件系统、终端打通。你在本地敲代码,实际执行在服务器上。ssh-keygen 是 OpenSSH 自带的密钥生成工具,用来做免密登录,省掉每次输密码的麻烦。这两个东西组合起来,能让你像操作本地文件夹一样操作服务器。
但真正让人头疼的不是连接本身,而是连上之后 AI 工具的 endpoint 配置。我试过在三个工具里分别维护三套 Key,某次服务器重装系统,配置文件全丢,只能一个个重新填。后来把 endpoint 统一改到 TaoToken 的 API 地址,本地和远端共用同一个 Key,才算把这件事理顺。这篇就按「生成密钥 → 配置免密 → Remote SSH 连上 → 改 AI 工具 endpoint → 验证请求」的顺序,把整条链路走一遍,每一步都给可复制的命令和配置。
适合谁看:手上有云服务器、想用 VSCode 远程开发、同时又在用 AI 编程工具的人。不需要你懂 SSH 底层原理,照着敲命令就行。下面从 ssh-keygen 开始。
2. ssh-keygen 生成密钥与 Remote SSH 免密配置踩坑记录
2.1 ssh-keygen 生成密钥对
打开本地终端(Windows 用 PowerShell 或 CMD,Mac/Linux 用 Terminal),执行:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"-t rsa指定密钥类型,-b 4096指定长度,-C后面是注释,随便写个能标识这台机器的字符串。执行后会提示:
Enter file in which to save the key (/home/you/.ssh/id_rsa):直接回车用默认路径。接着提示输入 passphrase,做免密登录的话直接回车两次留空。生成完成后,~/.ssh/目录下会有两个文件:id_rsa是私钥,绝对不能外传;id_rsa.pub是公钥,要放到服务器上。
这里有个我踩过的坑:Windows 用户名是中文时,ssh-keygen 会报Could not create directory ... Invalid argument,因为默认路径里带了中文。解决办法是在提示Enter file in which to save the key时手动输入一个纯英文路径,比如C:\Users\Andrea\.ssh\id_rsa。如果连这个路径都建不了,最彻底的办法是新建一个英文名的 Windows 用户账号,用那个账号操作。中文用户名引发的路径问题不止影响 ssh-keygen,很多命令行工具都会中招。
2.2 把公钥上传到服务器
生成好公钥后,需要把它追加到服务器的~/.ssh/authorized_keys里。最直接的方式是用 scp 上传,但更推荐用ssh-copy-id(Mac/Linux 自带,Windows 的 Git Bash 也有):
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 2222 user@your_server_ip-p后面是 SSH 端口,默认 22 的话可以省略。执行后会让你输一次服务器密码,输完公钥就自动追加进去了。如果服务器没装 ssh-copy-id,就手动来:
cat ~/.ssh/id_rsa.pub | ssh -p 2222 user@your_server_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"权限这一步别省。~/.ssh必须是 700,authorized_keys必须是 600,权限不对 SSH 会直接拒绝免密登录,而且报错信息很含糊,容易误以为是密钥问题。
2.3 配置本地 SSH config
在本地~/.ssh/config(Windows 是C:\Users\你的用户名\.ssh\config)里加一段:
Host taotoken-server HostName 123.45.67.89 Port 2222 User ubuntu IdentityFile ~/.ssh/id_rsa ServerAliveInterval 60 ServerAliveCountMax 3Host后面是你在 VSCode 里看到的连接名,随便起;HostName是服务器真实 IP;Port是 SSH 端口,不是 22 就必须写;User是登录账号,写错连不上;IdentityFile指向私钥。ServerAliveInterval是保活,防止长时间不操作被断开。
配好后先在终端验证:
ssh taotoken-server能直接进去不输密码,说明免密通了。进不去就加-v看详细日志:
ssh -v taotoken-server日志里会显示用了哪个密钥、卡在哪一步。常见的是Permission denied (publickey),八成是公钥没传对或者权限不对。
2.4 VSCode 装 Remote SSH 插件并连接
在 VSCode 扩展市场搜Remote - SSH,安装微软官方那个。装好后按F1,输入Remote-SSH: Connect to Host,选你 config 里配的taotoken-server。第一次连会问服务器系统类型,选 Linux。连上后左下角会显示SSH: taotoken-server,说明你已经在远端环境里了。
这时候打开终端,pwd看到的是服务器路径,whoami是服务器用户名,确认没连错机器。接下来所有 AI 工具的配置,都要在这个远端终端里做,而不是本地。
3. 在远程环境把 AI 工具 endpoint 统一到 TaoToken
3.1 先拿统一 Key
打开 TaoToken 的 API Keys 页面(https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite),登录后创建一个 Key,复制出来。这个 Key 就是后面所有工具共用的凭证。注意别把它提交到 Git,建议放在环境变量里。
在远端服务器的~/.bashrc末尾加:
export TAOTOKEN_API_KEY="sk-你的key" export TAOTOKEN_BASE_URL="https://taotoken.net/api"然后source ~/.bashrc生效。这样每个新开的终端都能读到,不用每次手动 export。
3.2 配置 Cline(VSCode 插件)
Cline 是跑在 VSCode 里的 AI 编程插件,Remote SSH 连上后它默认在远端运行。打开 Cline 设置,API Provider 选OpenAI Compatible,然后填:
{ "apiProvider": "openai", "openAiBaseUrl": "https://taotoken.net/api", "openAiApiKey": "sk-你的key", "openAiModelId": "claude-sonnet-4-20250514" }Base URL 一定要带/api,Model ID 按你实际要用的模型填。填完点保存,Cline 会发一个测试请求,通了就能用。
3.3 配置 Codex CLI 的 auth.json
如果你在服务器上用 Codex CLI,它的凭证在~/.codex/auth.json。改成:
{ "OPENAI_API_KEY": "sk-你的key", "OPENAI_BASE_URL": "https://taotoken.net/api" }三件套齐了:Base URL 是https://taotoken.net/api,Key 是刚才那个,Model ID 在调用时用-m指定。改完跑一次codex "print hello"验证。
3.4 配置 Claude Code 的 settings
Claude Code 读的是环境变量或~/.claude/settings.json。用 settings 文件的方式:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的key" } }保存后重启 Claude Code。这样本地和远端用的是同一个 endpoint,换机器只要把 Key 同步过去就行,不用每个工具单独配。
4. 验证统一通道是否生效
配置改完必须验证,不然等到写代码时才发现连不上,排查成本更高。最直接的方式是用 curl 打一次请求:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "reply with ok"}], "max_tokens": 10 }'返回里如果有choices字段和内容,说明通道通了。如果返回 401,是 Key 不对;返回 404,多半是 Base URL 少了/v1或多了斜杠;返回local proxy failed,是本地网络层的问题,检查有没有多余的代理环境变量。
再验证一下工具层。在远端终端跑:
echo $TAOTOKEN_BASE_URL echo $TAOTOKEN_API_KEY | head -c 8确认环境变量读到了。然后在 Cline 里发一句「列出当前目录文件」,能正常返回就说明插件也走通了。Claude Code 的话,直接claude "say hi",看它有没有正常回复。
我实测下来,最容易出问题的是 Base URL 的写法。有人填https://taotoken.net少了/api,有人填https://taotoken.net/api/多了尾斜杠,都会导致 404。统一写成https://taotoken.net/api最稳。
5. 常见报错排查:401、local proxy failed、reading choices
5.1 401 Unauthorized
报错长这样:
{"error":{"message":"Invalid API key","type":"invalid_request_error"}}原因就三类:Key 复制时带了空格或换行、Key 已过期或被删、环境变量没生效。排查顺序:先echo $TAOTOKEN_API_KEY看值对不对,注意有没有隐藏字符;再去 TaoToken 控制台确认 Key 状态;最后检查是不是在错误的 shell 里 export 了,比如在本地 export 却想在远端用。
5.2 local proxy failed
这个报错通常出现在工具内部,意思是它尝试走本地代理但失败了。检查环境变量里有没有HTTP_PROXY、HTTPS_PROXY、ALL_PROXY:
env | grep -i proxy有的话先unset掉再试。另外确认 Base URL 是https开头,有些工具对 http 会走不同逻辑。
5.3 reading choices 相关报错
类似cannot read property 'choices' of undefined,说明返回体里没有choices字段,通常是请求根本没成功,但工具没处理好错误响应。先用第 4 节的 curl 命令单独测一次,确认 API 层是通的。如果 curl 通、工具不通,就是工具的配置问题,重点看 Model ID 是否写错、Base URL 是否完整。
5.4 OAuth 相关报错
有些工具默认走 OAuth 登录流程,报OAuth token expired或failed to refresh token。这类工具要显式切到 API Key 模式,在配置里把认证方式改成api_key,填上 TaoToken 的 Key 和 Base URL。别让它走默认的 OAuth,那条路和统一 Key 通道是两套逻辑。
5.5 SSH 连不上但密钥没问题
回到 Remote SSH 本身。如果ssh taotoken-server能通但 VSCode 连不上,检查 VSCode 的settings.json里有没有覆盖remote.SSH.configFile,指向了错误的 config 路径。另外 Windows 上 VSCode 用的 SSH 可能是系统自带的 OpenSSH,和你终端里用的 Git Bash SSH 不是同一个,密钥路径可能对不上。在 VSCode 设置里搜remote.SSH.path,显式指定你验证过的那个 ssh 可执行文件路径。
6. 把统一通道固化下来
走到这一步,本地 VSCode 通过 Remote SSH 连上了服务器,ssh-keygen 生成的密钥做了免密,AI 工具的 endpoint 和 Base URL 都指向了 TaoToken 的https://taotoken.net/api,一个 Key 管所有工具。剩下要做的就是把这套配置固化,避免下次重装或换机器时重来。
我的做法是把 SSH config、~/.bashrc里的环境变量、各工具的 settings 文件都放进一个私有 Git 仓库,新机器上 clone 下来,改一下服务器 IP 和 Key 就能用。Key 本身不提交,用.env.example占位,实际值手动填。这样换机器的时间从半天缩短到十分钟。
另外提醒一句,~/.ssh和~/.codex、~/.claude这些目录的权限要盯紧,别设成 777,SSH 和部分工具会拒绝加载权限过松的配置。定期ls -la看一眼,发现不对就chmod 700修回来。
如果后面要接更多工具,思路是一样的:找它的 Base URL 配置项,填https://taotoken.net/api,Key 填同一个,Model ID 按需选。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 有各工具的详细字段说明,遇到不确定的字段名去那里对一下。长期在服务器上跑 Agent 类任务的话,Coding Plan(https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite)的额度模型更适合持续调用,不用每次担心按量计费的波动。