为什么SSH使用任意甚至不存在的私钥都可连接服务器?如何清除缓存?
SSH任意指定私钥仍可连接问题解答
原因说明
你遇到的情况确实是SSH私钥缓存导致的,默认大多数操作系统会自动运行ssh-agent进程用于缓存已解锁的私钥凭证:
- 当你第一次使用正确私钥完成身份验证后,对应私钥的解锁状态会被保存在
ssh-agent的会话缓存中 - 后续发起SSH连接时,客户端会优先尝试使用
ssh-agent中已缓存的有效私钥完成认证,优先级高于你通过-i参数指定的私钥文件,因此哪怕指定的文件不存在,只要缓存中存在匹配的有效私钥就可以正常连接。
验证方法
你可以通过添加-v参数打印SSH调试日志确认该逻辑:
ssh -v -i /anything meliwex@server_ip
如果日志中存在Offering public key from agent类的输出,即可确认当前使用的是agent缓存的私钥。

解决方案
1. 清除当前ssh-agent的所有缓存私钥
执行以下命令即可删除agent中所有已缓存的私钥凭证:
ssh-add -D
执行完成后再发起连接,就会读取你通过-i指定的私钥文件,若指定文件不存在或无效会直接认证失败。
2. 单次连接禁用缓存私钥
如果不需要清除所有缓存,仅想让当前连接强制使用你指定的私钥,可以添加IdentitiesOnly=yes参数:
ssh -o IdentitiesOnly=yes -i /path/to/actual/private_key meliwex@server_ip
该参数会告知SSH客户端仅使用命令行显式指定的私钥进行认证,不会读取ssh-agent的缓存内容。
内容的提问来源于stack exchange,提问作者Hayk
相关产品推荐
相关产品推荐

