前言在一次生产环境的 SSH 密钥轮换中我遇到了一个极其令人困惑的问题在 Jenkins 服务器上手动执行ssh -i命令测试新密钥到目标服务器直接报Permission denied将同样的命令放入 Jenkins 任务脚本中同样失败。 在排除了文件权限、换行符、known_hosts等所有常见原因后最终发现是ssh-agent缓存的老密钥在“作祟”而解决方法是在~/.ssh/config中为堡垒机单独配置IdentitiesOnly yes。本文记录了完整的排查过程希望能帮助遇到类似“幽灵”故障的运维人员快速定位问题。一、现象手动测试失败Jenkins 任务也失败在 Jenkins 服务器上执行以下命令手动测试新密钥ssh-i~/.ssh/id_ed25519_new-Juserbastion_ip:22222 target_ipecho 连通结果报Permission denied。再将同样的命令放入 Jenkins 任务脚本中scp-i~/.ssh/id_ed25519_new-oProxyJump userbastion_ip:22222...结果Jenkins 控制台同样输出Permission denied。手动与脚本表现一致——说明问题不在 Jenkins 任务执行环境而在基础的 SSH 连接链路本身。二、排查绕过的弯路检查服务器端authorized_keys确认新公钥已正确添加权限为600文件末尾有换行符。重置known_hostsssh-keygen -R bastion_ip无效。在脚本中增加参数-o StrictHostKeyCheckingno依然报Permission denied。清空ssh-agent缓存ssh-add -D依然无效。这些操作均无法解决问题说明问题不在表面而在 SSH 认证的深层机制。三、真相SSH 的密钥优先级顺序经过反复验证发现 SSH 在认证时的密钥优先级是最高优先级ssh-agent中缓存的密钥。中间优先级命令行-i参数指定的密钥。最低优先级~/.ssh/id_rsa等默认密钥。在 Jenkins 节点上后台进程悄悄地启动了ssh-agent并将旧的id_rsa密钥加载了进去。当我们在手动测试或 Jenkins 脚本中执行ssh -i ~/.ssh/id_ed25519_new ...时SSH 客户端会优先问ssh-agent“你有能用的钥匙吗”ssh-agent回答“有我这里有id_rsa。”于是 SSH 尝试用旧密钥id_rsa去连接堡垒机。此时堡垒机上的老公钥已被删除认证失败连接被服务端直接切断。切断后SSH 根本没机会再去尝试你-i指定的新密钥。这就是为什么手动测试和 Jenkins 任务都失败的根本原因。四、终极解决方案配置~/.ssh/config在 Jenkins 节点上修改~/.ssh/config文件为堡垒机添加强制隔离配置Host bastion_ip IdentitiesOnlyyesIdentityFile ~/.ssh/id_ed25519_new StrictHostKeyChecking no UserKnownHostsFile /dev/null核心参数解析bastion_ip指构建任务时的目标服务器的ip这里可以配制多个用空格隔开比如10.0.0.1 10.0.0.2 10.0.0.3。IdentitiesOnly yes强制 SSH 客户端只使用IdentityFile指定的密钥完全忽略ssh-agent中缓存的所有密钥。这是解决“-i参数失效”的关键。IdentityFile指定要使用的新密钥文件。StrictHostKeyChecking noUserKnownHostsFile /dev/null跳过主机指纹校验避免 SSH 在自动化环境中卡住。五、验证与成果添加配置后再次执行手动测试命令不再需要-i参数ssh-Juserbastion_ip:22222 target_ipecho 连通结果成功输出连通。直接重跑 Jenkins 任务——构建成功密钥轮换完成。六、经验总结下次轮换密钥该怎么做不要依赖脚本里的-i参数在 Jenkins 这种有ssh-agent的环境里单独指定-i往往不可靠因为ssh-agent的优先级更高。善用~/.ssh/config为跳板机或目标服务器单独配置IdentitiesOnly yes和IdentityFile可以做到“一劳永逸”。清理服务器端的旧公钥确保新公钥是唯一可用的。后续轮换下次更新密钥时你只需要修改~/.ssh/config里的IdentityFile路径所有 Jenkins 任务会自动切换到新密钥无需修改任何 Jenkins 脚本。希望这篇博客能帮你快速定位这类 Jenkins 密钥更新后的连接失败问题。如果你也遇到过类似的“幽灵”报错不妨试试在~/.ssh/config里加上IdentitiesOnly yes或许能节省数小时的不必要排查。