1. 为什么每次连服务器都要输密码这事到底卡在哪SSH 免密登录这件事说穿了就是把「钥匙」和「锁」分开放私钥留在你本地电脑公钥丢到云服务器的授权文件里。之后你敲ssh ubuntu1.2.3.4SSH 客户端拿本地私钥去和服务器上的公钥做一次数学配对配对成功就直接放行密码那一步自然就省了。它适合谁适合所有需要频繁登录云服务器的人——部署项目、看日志、传文件、跑脚本只要一天连超过三次配免密就是稳赚不赔的投入。但实际动手时很多人会卡在几个具体的地方本地到底有没有现成密钥、ssh-copy-id报Permission denied、公钥传上去了却还是要密码、~/.ssh/config写完了ssh 别名连不上。这些问题的根子往往不在 SSH 本身而在权限、路径、以及多环境凭据散落各处没统一管理。这篇就按「本地生成 → 分发公钥 → 写 config → 验证 → 排错」的顺序走一遍目标是一次配置三分钟连通同时把多台服务器、多个环境的 Key 和 API 通道用 TaoToken 收拢到一处省得以后每加一台机器就翻一遍笔记。我试过最笨的办法是每台服务器都手动cat authorized_keys结果三台机器三种写法最后自己都记不清哪台配过。后来固定成一套模板才真正稳定下来。2. 前置准备本地密钥、服务器信息与 TaoToken 统一凭据动手前先确认三样东西本地终端macOS/Linux 自带Windows 用 PowerShell 或 WSL、一台能密码登录的云服务器Ubuntu/CentOS 都行、以及服务器的公网 IP 和登录用户名。用户名别想当然腾讯云 Ubuntu 镜像默认是ubuntuCentOS 常见是root或centos阿里云部分镜像是ecs-user填错了ssh-copy-id会直接拒绝。这里插一个容易被忽略的点当你后面要管理多台服务器、多个项目环境时SSH Key 只是凭据的一部分API Key、模型调用通道同样是凭据。如果每台机器、每个项目都单独记一套迟早乱。我的做法是用 TaoToken 把这类统一 Key/API 通道集中管理本地只维护一份配置换机器时不用重新翻找。它的控制台在 https://taotoken.net/api API Keys 管理页在 https://taotoken.net/api-keys 接入文档在 https://taotoken.net/doc 需要对话调试模型可以走 https://taotoken.net/models 长期编码或跑 Agent 场景则看 https://taotoken.net/coding-plan 。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 先注册拿到统一 Key后面配置里直接引用比散落各处强很多。注意私钥文件如id_ed25519绝对不能外传、不能提交到 Git、不能贴进聊天窗口。公钥id_ed25519.pub才是可以分发的那个。3. 可复制配置ssh-keygen 生成、ssh-copy-id 分发、config 骨架3.1 检查本地是否已有密钥先看本地有没有现成的有就跳过生成步骤别重复造ls -la ~/.ssh/如果输出里出现id_ed25519和id_ed25519.pub说明已经有了。只有known_hosts没有密钥对才需要往下走。3.2 生成 Ed25519 密钥对ssh-keygen -t ed25519 -C your_emailexample.com执行后会问三件事保存路径直接回车用默认~/.ssh/id_ed25519、passphrase想要真免密就留空直接回车、确认 passphrase再回车。-C后面是注释写个能认出这台机器的标识就行方便以后在服务器authorized_keys里辨认是谁的钥匙。3.3 用 ssh-copy-id 分发公钥ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu182.254.137.33把ubuntu换成你的用户名IP 换成你的公网 IP。这一步会要求输入一次服务器密码输完公钥就追加到服务器的~/.ssh/authorized_keys里了。如果提示ssh-copy-id: command not foundWindows 常见用下面这条替代type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh ubuntu182.254.137.33 mkdir -p ~/.ssh chmod 700 ~/.ssh cat ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys注意我在这里补了chmod 700和chmod 600原版命令没带权限设置是后面「传了公钥还要密码」的高频原因。3.4 写 ~/.ssh/config 骨架每次敲一长串ubuntu182.254.137.33也烦用别名收一下。编辑~/.ssh/configHost myserver HostName 182.254.137.33 User ubuntu IdentityFile ~/.ssh/id_ed25519 IdentitiesOnly yes ServerAliveInterval 60IdentitiesOnly yes很关键它强制只用指定的这把私钥避免本地有多把钥匙时 SSH 挨个试导致被服务器拒绝。ServerAliveInterval 60是防长时间空闲断连。写完记得改权限chmod 600 ~/.ssh/config chmod 700 ~/.ssh权限不对SSH 会直接忽略这个 config 文件表现为「配了别名却连不上」。4. 验证请求免密登录成功与结果确认配置完先做一次最朴素的验证ssh myserver如果直接进入服务器、没有提示password:就成功了。想更明确地确认走的是密钥而不是缓存加-v看握手细节ssh -v myserver 21 | grep -i publickey\|authenticated看到Authenticated to 182.254.137.33且前面有Offering public key字样说明公钥认证生效。再补一条非交互验证适合写进脚本ssh -o BatchModeyes myserver echo connected hostnameBatchModeyes会禁止任何密码交互能返回connected和主机名就证明免密链路完全通了。这一步过了后面部署项目、跑自动化脚本都不会再被密码卡住。5. 本篇常见错排查报错一Permission denied (publickey)。九成是服务器端权限问题。登录服务器用密码方式执行chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys家目录权限也不能太开放chmod 755 ~是安全上限777会被 SSH 拒绝。报错二ssh-copy-id提示REMOTE HOST IDENTIFICATION HAS CHANGED。服务器重装过系统指纹变了。确认是同一台机器后清掉旧指纹ssh-keygen -R 182.254.137.33报错三公钥传了还是要密码。检查服务器authorized_keys里公钥是不是被换行截断了一条公钥必须在一行内。另外确认sshd_config里PubkeyAuthentication yes没被注释掉改完sudo systemctl restart sshd。报错四ssh myserver提示Bad owner or permissions on ~/.ssh/config。就是前面说的权限问题chmod 600 ~/.ssh/config即可。报错五多把密钥时连错机器。在 config 里给每个 Host 都加IdentitiesOnly yes并明确IdentityFile别让 SSH 自己猜。6. 多环境凭据收口用 TaoToken 统一 Key 与 API 通道SSH 免密解决的是「登录服务器」这一层但真正跑项目时你还会遇到另一层凭据模型 API Key、不同环境开发/测试/生产的调用通道。如果每台服务器、每个项目都单独配一套换机器、加环境时就会重复踩坑。我的做法是把这类统一 Key 和 API 通道交给 TaoToken 管理本地和服务器都只引用同一份配置减少散落。具体操作上先去 https://taotoken.net/api-keys 生成统一 Key接入方式参考 https://taotoken.net/doc 需要调试模型对话走 https://taotoken.net/models 长期编码或 Agent 场景看 https://taotoken.net/coding-plan 控制台总入口是 https://taotoken.net/api 。这样 SSH 负责「进得去机器」TaoToken 负责「机器上的项目拿得到凭据」两层分开管互不干扰。如果你在排障或接入阶段卡住优先看 API Keys 和接入文档验证模型是否通用模型对话页长期编码和 Agent 场景直接上 Coding Plan。把这两层都收口之后加一台新服务器就是复制 config 片段 跑一次ssh-copy-id三分钟确实能搞定。