SSH 指定 -i 后仍报 Too many authentication failures
SSH 指定私钥后仍因 agent 提供多把身份而提前断开,通过调试日志和有效配置确认尝试集合,按主机限定身份并保留其他连接。
已经给 ssh -i 指定了正确私钥,却在输入密码或使用这把密钥之前收到 Too many authentication failures。如果调试输出显示客户端连续提供了多把 agent 中的公钥,而指定的那一把还没被提供,问题在本次连接尝试的身份集合。
OpenSSH 的 -i 用来指定身份文件,不表示只尝试这一把密钥。默认情况下,认证代理提供的其他身份也可能参加认证。服务端限制每个连接的认证尝试次数;当前 OpenSSH 的 MaxAuthTries 默认值为 6,但实际限制由服务端有效配置决定,不能把任何第六次断开都归为同一原因。
看正确的密钥是否真的被提供
以下主机、用户名与路径都是占位值,应换成当前连接使用的值。保留已有的端口、跳板机与配置文件选项,不要为了排查绕开原连接路线:
ssh -v -i /path/to/account_key operator@server.example.com
区分 Will attempt key 和 Offering public key:前者是计划尝试的身份,后者才表示正在向服务端提供公钥。若错误发生前只有多把不相关 agent 身份被提供,目标密钥尚未出现,适合按下面的方法限制身份。
如果目标密钥已经被提供但遭到拒绝,还要核对账号、服务端授权、公钥算法和权限;减少其他密钥不能让错误的密钥变成有效授权。日志可能包含用户名、地址、文件位置及公钥指纹,分享前应脱敏,私钥内容不需要出现在诊断资料中。
为这次连接限制身份,而不是清空 agent
在原命令上增加 IdentitiesOnly=yes:
ssh -v -o IdentitiesOnly=yes \
-i /path/to/account_key operator@server.example.com
它让客户端使用配置中的身份与证书文件,忽略 agent 额外提供的无关身份。所选身份仍可由 agent 持有私钥完成签名,并不要求关闭 agent。一次性的命令行选项只作用于这次调用,便于先确认行为再保存配置。
注意,这仍不是“只认命令行上的一个 -i”。OpenSSH 的多个 IdentityFile 设置会累加,匹配的配置块里另有身份文件时也可能被尝试。可以查看相同连接选项下的有效配置:
ssh -G -o IdentitiesOnly=yes \
-i /path/to/account_key operator@server.example.com
核对 identitiesonly、identityfile、certificatefile、identityagent,同时确认 hostname、user 和 port 对应预期连接。-G 用于输出配置,不能证明服务端已经接受登录。若继承了不需要的 IdentityFile,应缩小相应配置块的匹配范围,而不是反复追加另一把密钥。
按主机保存明确的身份映射
确认一次性调用有效后,可在自己的 SSH 配置中为该用途设置别名。修改前保存原配置,以下片段只演示这项身份选择:
Host app-maintenance
HostName server.example.com
User operator
IdentityFile /path/to/account_key
IdentitiesOnly yes
以后使用 ssh app-maintenance。具体配置通常放在通配默认项之前,因为多数设置使用首先取得的值;但 IdentityFile 是累加项,不能据此认为后面的通配身份会自动消失。再次用 ssh -G app-maintenance 核对最终集合。
只有明确不需要 agent、且所需私钥可从文件读取时,才考虑在这个连接上设置 IdentityAgent none。它关闭本次连接使用认证代理的能力,不会删除 agent 中其他连接正在使用的密钥,也不会清除配置里已经列出的身份文件。只有公钥文件而私钥保存在 agent 的场景,不适合这样处理。
验收同一连接,保留其他主机的登录能力
重新发起连接,确认目标公钥确实被提供、服务端接受认证,并进入预期账号。若连接复用了已有的 ControlMaster 会话,它可能没有进行新的认证;不能用这种复用结果证明身份配置修复成功,应通过原有管理方式确认是在检查新连接。
无需清空 agent 的全部密钥、删除 known_hosts 或提高全局 MaxAuthTries。前两项会影响其他连接或主机信任,后者扩大服务端允许的尝试范围,都不是限制客户端错误身份集合的必要步骤。
若保存配置后影响其他主机,恢复本次修改的 Host 块并重新核对有效配置;保留其他身份映射。一次性参数只需从后续命令中移除即可回退,不需要重启服务器。


