科技 · 实用指南
SSH 提示“too many authentication failures”?改服务器前先数清已提交的密钥
正确密钥即使存在,也可能还没轮到就被断开。先证明实际主机、用户、身份列表和提交顺序,再做单密钥测试,不要先清空代理或提高 MaxAuthTries。

“Too many authentication failures”表示一次连接的认证尝试额度已耗尽,并不等于有人反复输错密码。OpenSSH 客户端可能从配置文件和代理提交多个公钥;每个被拒绝的尝试都会消耗服务器额度,因此服务器可能在正确密钥之前断开连接。
保留出错终端并核对实际路径。不要一开始就运行`ssh-add -D`、全局设置`IdentitiesOnly yes`、删除密钥文件或普遍提高`MaxAuthTries`。这些做法会抹掉证据、影响其他主机,或在未证明原因时削弱服务器保护。
1. 固定出错目标并查看实际配置
使用发生失败的同一终端、主机别名和用户名,记录命令但不要复制秘密。如果由 Git、IDE 或自动化包装器启动 SSH,先确认它真正传入的主机和用户。
运行`ssh -G your-host | grep -Ei "^(hostname|user|identityfile|identityagent|identitiesonly|preferredauthentications) "`。先核对 HostName 和 User,再查看全部 IdentityFile;Include 和匹配块可能让这些条目累加。
若主机或用户错误,先修正路由并重复诊断,不要靠删除身份去补偿错误账户。
2. 对照可用身份与实际提交顺序
在出错终端运行`ssh-add -l -E sha256`。它列出接触到的代理指纹,但不代表每个都会被提交,也不包含客户端直接加载的所有文件;无法联系代理时应如实记录。
执行一次`ssh -vvv user@your-host`,找到每条“Offering public key”,仅按顺序记录密钥类型和 SHA256 指纹。分享日志前遮盖地址、用户名和私有路径。关键是正确指纹是否在断开前出现。
若多个意外密钥排在前面,这是选择顺序问题。若只提交一个正确密钥仍被拒绝,应转查用户名、authorized_keys、证书主体、代理签名或服务器策略。
3. 不删除任何内容地做单密钥测试
用`ssh-keygen -lf /path/to/key.pub -E sha256`确认目标公钥指纹,然后运行`ssh -o IdentitiesOnly=yes -i /path/to/key user@your-host`。它只约束这次连接,不改变代理和其他密钥。
若测试成功,说明服务器、账户与密钥能够配合,原故障来自更广客户端环境的选择或顺序。为该别名保存窄范围 Host 块,写明 HostName、User、IdentityFile 与`IdentitiesOnly yes`,再用`ssh -G`和`ssh -vvv`复核。
若测试失败,保留详细日志。单个正确密钥后的“Permission denied”或代理签名拒绝属于不同分支;提高 MaxAuthTries 或清空代理都不能证明密钥已获授权且可用。
4. 只做最小的持久修复
单一主机优先使用主机专属配置。除非审计过全部目标,不要把 IdentityFile 放在错误范围或把`IdentitiesOnly yes`设为全局。GitHub 与 GitLab 都记录了多账户/多密钥的按主机选择方式。
其他代理身份若仍服务于别的系统就保留。只有独立确认密钥已废弃时才卸载;不要把删除当诊断捷径。GUI 客户端若不遵循 OpenSSH 配置,应确认其自身的身份和代理设置。
只有在单独的服务器策略审查中才考虑 MaxAuthTries。此次故障的完成条件是客户端能提交正确指纹并成功认证,而不是得到更大的尝试额度。
决策表
HostName 或 User 错误 — 先修正目标,保持密钥状态不变。
断开前出现多个意外指纹 — 做单密钥测试,再配置窄范围 Host 块。
只提交正确指纹仍被拒绝 — 转入服务器授权或签名诊断。
单密钥测试成功 — 保留其他身份并复核修复后的实际配置。
客户端不是 OpenSSH 或忽略 ssh_config — 先识别它自己的代理与密钥选择控制。
