1. 为什么每次连服务器都要输密码,这事得治
如果你每天要在 VS Code 或 Cursor 里连远程服务器写代码,大概率经历过这种循环:打开 Remote-SSH,输入密码,写两小时代码,窗口一关,下次再连又得输一遍。密码复杂点还得翻备忘录,服务器多几台就更乱,root 一台、ubuntu 一台、跳板机一台,端口还各不相同。
这套流程的本质问题不是「密码难记」,而是每次连接都在做一次身份验证的重复劳动。SSH 密钥认证要解决的就是这件事:客户端持有一把私钥,服务器上放对应的公钥,连接时双方做一次密码学握手,验证通过就直接放行。配好之后,VS Code 和 Cursor 的 Remote-SSH 插件走的是同一套 SSH 配置,所以一次配置,两个编辑器都能免密登录。
这篇面向的是需要频繁远程开发的工程师,交付的是可以直接复制的~/.ssh/config骨架和服务器端authorized_keys配置,外加连接验证和常见报错排查。整个流程分两块:客户端生成密钥并写配置,服务器端接收公钥并确认 sshd 允许公钥认证。中间如果涉及模型调用或 Agent 类工具需要统一管理密钥,可以顺带用 TaoToken 的 API Keys 页面集中托管,避免密钥散落在各个.env里。
先说清楚一个前提:下面所有操作都在你自己的开发机和你有权限登录的服务器之间进行,不涉及任何网络层改造,纯粹是 SSH 协议本身的密钥认证配置。
2. 前置准备:客户端密钥、服务器权限与 TaoToken 的定位
动手之前,先确认三件事。
第一,客户端有没有现成的密钥对。打开终端执行:
ls -al ~/.ssh如果看到id_rsa和id_rsa.pub(或者id_ed25519/id_ed25519.pub),说明已经有密钥对了,可以跳过生成步骤。如果没有,下一步生成。这里建议用 ed25519,比 RSA 更短、更安全,现代 OpenSSH 都支持。
第二,服务器上你有没有一个能登录的账号,并且知道它的密码或已有登录方式。配置密钥的前提是「你至少能进去一次」,把公钥放进去之后才能免密。
第三,服务器 sshd 是否允许公钥认证。绝大多数云主机默认是开的,但有些镜像或安全加固过的系统会关掉,需要改/etc/ssh/sshd_config。
TaoToken 在这里的角色是「密钥与模型访问的统一入口」。当你在 VS Code 或 Cursor 里跑 Claude Code、Cline 这类编码 Agent 时,它们通常需要 API Key 去调用模型。与其把 Key 硬编码在项目里,不如在 TaoToken 控制台生成一个专用 Key,通过环境变量注入。这样 SSH 免密解决的是「怎么进服务器」,TaoToken 的 API Keys 解决的是「进去之后 Agent 怎么调模型」,两件事分开管理,互不污染。
TaoToken 的接入文档在 https://taotoken.net/api ,API Keys 管理页面在 https://taotoken.net/api-keys ,模型对话调试入口在 https://taotoken.net/models 。如果你只是配 SSH,这些可以先放着,等 Agent 跑起来再回来配。
3. 可复制配置:客户端生成密钥 + 服务器写入 authorized_keys
3.1 客户端生成密钥对
在本地终端执行(不要加 sudo,密钥要属于当前用户):
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519参数说明:-t ed25519指定算法;-C是注释,方便你日后辨认这把钥匙是谁的;-f指定输出路径。执行后会提示你设置 passphrase,如果追求完全免密,直接回车留空;如果在意私钥安全,设一个 passphrase,配合 ssh-agent 也能做到只输一次。
生成完检查一下:
ls -al ~/.ssh/id_ed25519*应该看到id_ed25519(私钥,权限 600)和id_ed25519.pub(公钥)。私钥权限不对 SSH 会拒绝使用,如果权限是 644,执行chmod 600 ~/.ssh/id_ed25519。
3.2 把公钥推到服务器
最省事的方式是用ssh-copy-id:
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 22 root@36.103.199.000它会提示你输入一次服务器密码,然后把公钥追加到服务器的~/.ssh/authorized_keys。如果本地没有ssh-copy-id(比如某些 Windows 环境),用这条等价命令:
cat ~/.ssh/id_ed25519.pub | ssh -p 22 root@36.103.199.000 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"注意这里对目录和文件权限做了收紧:.ssh必须是 700,authorized_keys必须是 600,否则 sshd 会因为权限过松拒绝读取公钥,这是新手最常踩的坑之一。
3.3 服务器端确认 sshd 配置
登录服务器,编辑/etc/ssh/sshd_config,确认这几项:
PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication yes PermitRootLogin prohibit-password逐条解释:PubkeyAuthentication yes是公钥认证的总开关,必须开;AuthorizedKeysFile指定公钥文件位置,默认就是.ssh/authorized_keys;PasswordAuthentication yes建议先保留,等确认密钥能登录了再考虑关掉,否则配错了会把自己锁在外面;PermitRootLogin如果要用 root 登录,设成prohibit-password表示只允许密钥不允许密码,比yes安全。
改完重启 sshd:
sudo systemctl restart sshd容器场景里可能没有 systemd,用:
sudo service ssh restart3.4 客户端写 ~/.ssh/config
这是让 VS Code 和 Cursor 都能识别的主配置。编辑~/.ssh/config:
Host myserver HostName 36.103.199.000 User root Port 22 IdentityFile ~/.ssh/id_ed25519 IdentitiesOnly yes ForwardAgent yes ServerAliveInterval 60 ServerAliveCountMax 3参数逐个说:Host myserver是你自己起的别名,之后ssh myserver就能连;HostName是真实 IP 或域名;IdentityFile指向私钥;IdentitiesOnly yes强制只用指定的这把钥匙,避免 SSH 把本地所有密钥挨个试一遍导致认证失败;ForwardAgent yes允许在服务器上复用本地 agent,跳板机场景有用;ServerAliveInterval 60每 60 秒发一次心跳,防止长时间不操作被防火墙断开,VS Code 远程开发时这个很关键。
配好之后,VS Code 的 Remote-SSH 插件和 Cursor 的 Remote-SSH 都会读取这个文件,在连接列表里直接选myserver即可,不用再手填 IP 和端口。
4. 验证请求:从命令行到编辑器的完整链路
4.1 命令行验证
先别急着开编辑器,用命令行确认密钥认证通了:
ssh -v myserver-v会打印详细握手过程。重点看输出里有没有这几行:
debug1: Offering public key: /Users/you/.ssh/id_ed25519 ED25519 debug1: Server accepts key: /Users/you/.ssh/id_ed25519 ED25519 debug1: Authentication succeeded (publickey).看到Authentication succeeded (publickey)就说明免密成功,全程没提示输密码。如果还提示密码,说明公钥没被服务器接受,跳到第 5 节排查。
4.2 VS Code 连接
打开 VS Code,安装 Remote - SSH 扩展,按F1输入Remote-SSH: Connect to Host,选择myserver。首次连接会在服务器上装 VS Code Server,装完就能直接进远程目录。之后每次连接都是秒进,不再问密码。
4.3 Cursor 连接
Cursor 基于 VS Code,操作几乎一样。Cmd/Ctrl + Shift + P打开命令面板,输入Remote-SSH: Connect to Host,选myserver。Cursor 会复用同一份~/.ssh/config,所以不用重复配置。
4.4 验证 Agent 侧的模型调用
如果你在远程环境里跑 Claude Code 或 Cline,需要让它们能调模型。在服务器上设置环境变量:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="你的TaoToken密钥"密钥在 https://taotoken.net/api-keys 生成。设置完在远程终端里跑一次模型对话验证:
curl https://taotoken.net/api/v1/messages \ -H "x-api-key: $ANTHROPIC_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{"model":"claude-sonnet-4-20250514","max_tokens":64,"messages":[{"role":"user","content":"ping"}]}'返回正常 JSON 就说明远程环境到模型的链路通了。这一步和 SSH 免密是独立的,但组合起来才是完整的「远程开发 + Agent 编码」工作流。长期跑编码 Agent 的话,可以在 https://taotoken.net/coding-plan 看套餐,避免按量计费跑飞。
5. 本篇常见错排查
5.1 Permission denied (publickey)
最常见。按顺序查:服务器~/.ssh/authorized_keys里有没有你的公钥内容(cat ~/.ssh/authorized_keys对比本地cat ~/.ssh/id_ed25519.pub);权限对不对(.ssh700,authorized_keys600,家目录不能是 777);sshd_config 里PubkeyAuthentication是不是 yes;改完有没有重启 sshd。
5.2 一直提示输密码,但密码正确也进不去
多半是IdentitiesOnly没设,SSH 把本地一堆密钥挨个试,试到次数上限被服务器拒绝。在 config 里加上IdentitiesOnly yes并明确IdentityFile。
5.3 VS Code 连上了但频繁断线
远程开发时长时间不操作,中间的网络设备会掐掉空闲连接。config 里加ServerAliveInterval 60和ServerAliveCountMax 3,让客户端定期发心跳。如果还断,检查服务器 sshd_config 里的ClientAliveInterval。
5.4 改了 sshd_config 后 SSH 服务起不来
九成是配置语法错误。改之前先备份,改完用sshd -t测试语法:
sudo sshd -t没输出就是语法 OK,有报错按行号改。千万别在没测试的情况下重启,否则可能把自己锁在外面,只能走云厂商的 VNC 控制台救。
5.5 私钥权限报错
报Permissions 0644 for 'id_ed25519' are too open就是私钥权限太松。执行chmod 600 ~/.ssh/id_ed25519即可。Windows 上如果用的是 WSL,同样按 Linux 权限处理;如果是原生 OpenSSH,需要在文件属性里收紧 ACL。
5.6 多台服务器密钥混用
如果你有多把密钥对应不同服务器,在 config 里为每个 Host 指定不同的IdentityFile,并都加上IdentitiesOnly yes。不要指望 SSH 自己猜对。
6. 配好之后,把密钥和模型访问都收进统一入口
SSH 免密配完,日常远程开发的体验会有明显变化:VS Code 和 Cursor 打开即连,终端ssh myserver直接进,跳板机、多服务器切换都靠 config 里的别名搞定。这套配置一次写好,长期受益。
接下来值得做的是把「密钥管理」这件事也规范化。SSH 私钥留在本地~/.ssh,权限收紧;模型 API Key 不要散落在各个项目的.env里,统一在 TaoToken 控制台生成和管理。需要调试模型时用 https://taotoken.net/models 的对话入口快速验证;需要看接入细节翻 https://taotoken.net/api 的文档;跑长期编码 Agent 前先在 https://taotoken.net/coding-plan 确认套餐额度,避免中途断供。
一个实用习惯:把~/.ssh/config纳入你的 dotfiles 仓库管理(私钥本身不要提交),换机器时 clone 下来就能恢复所有服务器别名。服务器端的authorized_keys则按需追加,离职或换机时记得把旧公钥删掉,这是很多人会忽略的安全细节。