known_hosts 第 18 行让 SSH 连不上?Codex 走 TaoToken 对着报错清旧密钥
known_hosts:18 和 Host key verification failed. 一起出现时问题在 SSH 主机指纹变更不在密码。TaoToken 的统一 API 通道https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end可以给远端那台 Windows 上的 Codex 提供模型能力让它帮你读报错原文但删行、执行 ssh-keygen 这类动作仍然要在你自己的终端里完成。控制端执行 ssh win-debug、ssh syz192.168.60.136 时屏幕不会先问你密码而是先甩出 REMOTE HOST IDENTIFICATION HAS CHANGED!接着点名 Offending ECDSA key in C:\Users\VISION16Pro.ssh\known_hosts:18最后以 Host key verification failed. 收尾。很多人第一反应是密码错了、sshd 没起来其实跟这些都没关系SSH 在用户认证之前先做主机密钥校验校验没过就直接把连接掐断提示里那句可能是中间人攻击看着吓人但九成以上是自己重建过机器。远端 Windows 大概率刚重装过、克隆过虚拟机或者 OpenSSH Server 被重新安装、host key 被重新生成指纹自然对不上。处理思路不复杂清掉本地那条旧记录再重新确认一次新指纹。真正费时间的是细节——到底清哪一行、要不要先备份、用命令还是记事本、以后换了机器怎么再确认。这些正好可以让 Codex 对着报错原文帮你拆开讲。下面按原文的排查路线走一遍中间涉及注册、拿 Key、填 Base URL 的步骤都落在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 上。1. 把 ssh syz192.168.60.136 那屏报错读完整1.1 REMOTE HOST IDENTIFICATION HAS CHANGED 校验的到底是什么SSH 连接分成两段先校验主机身份再做用户认证。远端 Windows 上的 OpenSSH Server 启动时会加载自己的主机密钥常见的是 C:\ProgramData\ssh\ 下的 ssh_host_ecdsa_key 与配套的 .pub 文件连接建立时服务器把公钥推给客户端客户端拿它去本机 known_hosts 里比对指纹对得上才继续对不上就按严格校验策略直接拒绝。这里特别容易混淆的是报错说的不是你自己的 id_ed25519、id_rsa 私钥也不是 authorized_keys 里的授权公钥而是服务器这一侧的身份变了。换句话说你的钥匙没换是门锁换了。判断逻辑也很直接——如果这台机器你刚重装、刚回滚过快照指纹变化在预期内清记录再确认即可如果这台机器你完全没碰过却突然报变更先别急着删去找机器归属人核对一遍确认无误再动手。1.2 Offending ECDSA key in ...known_hosts:18 的行号从 1 开始数known_hosts 里每一行大致长这样字段是「主机名 密钥类型 Base64 公钥 注释」[192.168.60.136]:22 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBB...如果客户端开了 HashKnownHosts主机名那一段会被哈希成 |1|xxxx|yyyy 之类的形式你在文件里直接搜 IP 是搜不到的这也是明明报错说第 18 行我翻遍文件也没找到那台机器的常见原因。报错里的 :18 是文件里第 18 行从 1 开始数它同时点名了 ECDSA说明服务器这次推的是 ecdsa-sha2-nistp256而客户端恰好在这一行找到同类型但不同值的旧记录。同一台主机在 known_hosts 里可能占好几行——ecdsa、ed25519、rsa 各一行取决于历史连接时服务器提供过哪些类型。所以搜一下 IP 把那一行删掉经常会删错或者删不干净。想先看位置又不动文件可以跑ssh-keygen -F 192.168.60.136它会把匹配到的行打印出来配合-f还能指定要查的 known_hosts 路径。2. 远端 Windows 上那台 Codex 先接上 TaoToken 的模型通道2.1 打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册并创建 YOUR_API_KEY原文第 3 步是在远端 Windows 安装 Codex。装完之后别急着让它裸奔先给它一条能用的模型通道打开 TaoToken注册账号、登录在控制台里创建一把 API Key 并复制出来。往后所有配置文件里这把 Key 一律写成占位符 YOUR_API_KEY——真 Key 不要贴进博客、聊天记录、截图或者 Git 仓库。顺手在同一个站点的模型广场把模型 ID 抄下来。模型名字和可用列表会随时间调整别凭记忆写直接从列表里复制当下可用的那个 ID 填进配置。这一步花不了一分钟却能把后面模型不存在调用被拒之类莫名其妙的报错直接掐掉。2.2 C:\Users\VISION16Pro.codex\config.toml 里把 Base URL 指到 https://taotoken.net/apiCodex 在 Windows 上的配置放在用户目录下的 .codex\config.toml也就是 C:\Users\VISION16Pro.codex\config.toml。这里的做法是定义一个自定义模型供应商把它指向 TaoToken 的兼容通道model YOUR_MODEL_ID model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat三条注意base_url 填https://taotoken.net/api末尾不要带 /v1也不要挂任何 UTM 参数env_key 是环境变量的名字不是 Key 本身真正的 Key 放进环境变量里model 用你刚从模型广场复制下来的 ID。接着在 PowerShell 里把 Key 写进环境变量setx TAOTOKEN_API_KEY YOUR_API_KEYsetx 只对之后新开的窗口生效所以设完要关掉当前 PowerShell重新开一个再启动 codex。另外别把 Anthropic 的那套 ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN 抄到 Codex 上——Codex 读的是 config.toml 里的 model_provider 段两套配置互不相干混着填只会让你在排错时多做无用功。3. 让 Codex 对着 known_hosts:18 这份报错逐条拆3.1 提问模板只解释、不执行把控制端那屏报错完整复制下来贴进远端 Windows 上 Codex 的会话。下面这段提示词可以直接改改就用下面是我在控制端执行 ssh 的完整报错请只做解释不要生成要我在远端机器上直接执行的重置命令 1) Offending ECDSA key in C:\Users\VISION16Pro\.ssh\known_hosts:18 具体指哪一行这一行的字段分别是什么含义 2) 动手之前应该备份哪个文件备份成什么名字 3) ssh-keygen -R 192.168.60.136 和手工删掉第 18 行两种做法分别会发生什么 4) 远端主机指纹在什么情况下会变我怎么区分是我自己重建过和是别人动了机器。 [把报错全文粘在这里]边界要划清楚Codex 不会也不能替你连到远端去改 known_hosts它做的是读报错、解释字段含义、给出你可以在本机执行的命令。真正执行的那一下——敲 ssh-keygen 或者在记事本里删行——由你在控制端、以实际发起连接的账户完成。出了问题再把新的输出贴回对话让它继续解释。3.2 主机指纹为什么会变三种常见情况第一种是远端 Windows 重装或恢复出厂C:\ProgramData\ssh\ 下的 ssh_host_* 文件随系统一起重建ECDSA 主机密钥就是全新的。第二种是虚拟机克隆、快照回滚、换主板一类操作同一个 IP 背后其实已经是另一份系统镜像。第三种是手工卸载重装 OpenSSH Server或者清理过 ProgramData\ssh 目录重装过程会重新生成主机密钥。还有一类容易被误判的IP 被 DHCP 分给了另一台机器你连上的压根不是原来那台。这种情况删 known_hosts 只治标先把机器对上号更重要。判断方法很土但有效——重新连接时 SSH 会把新指纹打在屏幕上顺手和机器归属人给的指纹核一下对得上就说明只是换了锁不是有人在中间看你的流量。4. 清掉 known_hosts 第 18 行的两条路4.1 ssh-keygen -R 192.168.60.136命令行方式最稳想一次性把某台主机的所有记录都清干净最省事的是 -R 参数ssh-keygen -R 192.168.60.136它会做三件事把匹配到的行从 known_hosts 里移除把被移除的内容另存成 known_hosts.old相当于自动备份而且对哈希过的记录同样有效——这正是手工搜索做不到的地方。如果 SSH 端口不是 22ssh-keygen -R [192.168.60.136]:2222执行时注意账户控制端以哪个用户跑的 ssh就清哪个用户目录下的 known_hosts。用管理员窗口跑命令、却用普通账户连接删了个寂寞是常有的事。4.2 记事本打开 C:\Users\VISION16Pro.ssh\known_hosts 删第 18 行不想用命令也可以手工改文件步骤不复杂但得细心先把 C:\Users\VISION16Pro.ssh\known_hosts 复制一份改名 known_hosts.bak出问题随时回退用记事本打开原文件先关掉自动换行再用 CtrlG 跳到第 18 行确认这一行末尾是不是 ecdsa-sha2-nistp256主机名部分是不是 192.168.60.136 或者对应的哈希串整行删除连行尾换行一起删保存保存时别改编码别引入 BOM否则整份文件都可能读不动。手工改的好处是所见即所得坏处是遇到 HashKnownHosts 打开的情况你根本认不出哪行对应哪台机器这时候还是回到 4.1 用 ssh-keygen -R 更省心。两种方式选一种就行别一边删一边又跑 -R把自己绕晕。4.3 重新 ssh 一次把 yes 完整敲进去清完之后重新连ssh syz192.168.60.136第一次会提示 The authenticity of host ... cant be established并给出新指纹这里要输入完整的 yes光敲一个 y 不认。确认后新记录会被追加到 known_hosts 末尾第 18 行那个位置就翻篇了。如果这台机器刚重装趁这个机会把新指纹记下来以后再收到变更提示时就有对照物不用每次都猜是自己改的还是别人动的。5. 回到 ssh win-debug 验收顺手把 authorized_keys 也理一遍5.1 用 ssh-keygen -lf 确认第 18 行已经换人ssh-keygen -lf C:\Users\VISION16Pro\.ssh\known_hosts输出是一行行「位数 指纹 主机名类型」行号也在前面可以直接看到旧的那条 ECDSA 记录没了、或者换成了新的。再跑一次 ssh win-debug能进到密码或公钥认证环节就说明主机指纹这一关过了。如果到这一步还卡在 Host key verification failed.八成是改错了文件比如连接其实跑在管理员会话里读的是另一个账户的 .ssh。主机指纹通过之后才轮到 authorized_keys 的活远端 Windows 上普通用户的公钥要写进 C:\Users\syz.ssh\authorized_keys管理员账户则看 C:\ProgramData\ssh\administrators_authorized_keys文件名大小写和权限都容易踩坑。这类问题同样可以把远端 sshd 日志、本地ssh -vvv syz192.168.60.136的输出贴给 Codex 让它逐行解释然后你自己在本机敲验证命令、把结果贴回去。5.2 排障这几类错最像没清干净报错一字不变核对发起 ssh 的账户和改的 known_hosts 是不是同一份哈希过的记录只能用 ssh-keygen -R 清。Codex 侧报 401多半是 env_key 写的变量名和 setx 设的不一致或者设完没重开窗口。Key 本身也可以回 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 重新创建一把。提示模型不存在model 填成了记忆里的名字去模型广场复制当前列表里的 ID 即可。6. 跑通之后去控制台对一下这次调用6.1 用同一把 Key 在模型对话里试一条配置保存、PowerShell 也重开过之后先在 TaoToken 模型对话 里发一句解释 known_hosts 里 ecdsa-sha2-nistp256 这一行的字段含义。如果回复正常说明 Key、模型 ID、Base URL 三件套都对上了剩下的问题只可能在 config.toml 的写法上如果这里就报错先把通道问题解决别在 SSH 那边兜圈子。6.2 长期用下去看套餐和文档如果这台机器上的 Codex 你要长期用来读日志、拆 SSH 报错可以到 Coding Plan 看看当前套餐是否够用需要新建或吊销 Key在 控制台 API Keys 里操作即可。要是后来在控制端也装了 Claude Code环境变量对照表在 接入文档照着填那一套 ANTHROPIC_* 变量就行注意别和 Codex 的配置混用。说个个人体会known_hosts 这类报错删行本身只要一秒真正花时间的是判断这次指纹变化该不该接受。把报错原文交给 Codex 解释清楚、自己再去机器上核实一遍比闷头删行稳得多——毕竟主机指纹这道校验存在的意义就是防止你在不知情的情况下连到别的机器上。