SSH 常见报错速查
开发中常遇到的 SSH 报错信息,快速定位原因和解决方案。
Permission denied (publickey)
出现场景:使用密钥认证连接远程服务器时
原因:SSH 服务器拒绝了密钥认证,可能是公钥未添加到服务器、密钥文件权限不正确、或使用了错误的密钥
解决方案:
- 确认公钥已添加到服务器:ssh user@host 'cat ~/.ssh/authorized_keys' 检查是否包含你的公钥
- 检查本地私钥权限:chmod 600 ~/.ssh/id_ed25519(必须为 600)
- 检查远程 .ssh 目录权限:chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
- 指定正确的密钥文件:ssh -i ~/.ssh/correct_key user@host
- 用 -v 调试查看使用了哪个密钥:ssh -v user@host,找 Offering public key 行
- 确认服务端开启了密钥认证:PubkeyAuthentication yes(在 /etc/ssh/sshd_config)
预防:使用 ssh-copy-id 自动配置公钥和权限,在 ~/.ssh/config 中为每个 Host 指定 IdentityFile 避免密钥混淆
ssh: connect to host xxx port 22: Connection refused
出现场景:尝试连接远程服务器时
原因:目标主机的 SSH 服务未运行、端口不正确、或防火墙阻止了连接
解决方案:
- 确认 SSH 服务正在运行:systemctl status sshd 或 service ssh status
- 启动 SSH 服务:sudo systemctl start sshd
- 确认 SSH 监听端口:ss -tlnp | grep ssh,如果改了端口用 ssh -p 端口号 连接
- 检查防火墙规则:sudo ufw status 或 sudo iptables -L -n | grep 22
- 开放防火墙端口:sudo ufw allow 22/tcp 或 sudo firewall-cmd --add-port=22/tcp --permanent
- 如果是云服务器,检查安全组/网络 ACL 是否放行了 SSH 端口
预防:部署服务器时确保 SSH 服务设为开机自启(systemctl enable sshd),配置防火墙时优先放行 SSH 端口避免锁死自己
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! ... Host key verification failed.
出现场景:连接之前连接过的服务器时
原因:服务器的主机密钥与本地 known_hosts 中记录的不一致,可能是服务器重装、IP 变更、或遭受中间人攻击
解决方案:
- 如果确认是服务器重装/重建,移除旧记录:ssh-keygen -R hostname
- 移除后重新连接,确认新的主机指纹:ssh user@host
- 如果是 IP 复用(如云服务器释放后重新分配),同样移除旧记录即可
- 如果不确定原因,联系服务器管理员确认主机密钥是否变更
- 手动编辑 known_hosts 删除对应行:vim ~/.ssh/known_hosts,找到对应 IP 的行删除
预防:服务器重装后主动通知团队主机密钥已变更。使用 ssh-keyscan 获取新密钥并验证指纹。不要养成无脑 StrictHostKeyChecking=no 的习惯,这会让你对中间人攻击毫无防备
ssh: connect to host xxx port 22: Connection timed out
出现场景:尝试连接远程服务器时长时间无响应
原因:网络不通、目标主机不可达、防火墙静默丢弃数据包(DROP 而非 REJECT)、或路由问题
解决方案:
- 检查网络连通性:ping host 确认主机是否可达
- 检查端口是否开放:telnet host 22 或 nc -zv host 22
- 如果是内网服务器,确认 VPN 是否已连接
- 检查本地防火墙是否阻止了出站连接
- 尝试 traceroute host 查看网络路径在哪里中断
- 如果是云服务器,检查安全组入站规则是否允许你的 IP 访问 SSH 端口
预防:在 ~/.ssh/config 中设置 ConnectTimeout 10 避免长时间等待。使用 ServerAliveInterval 60 保持连接活跃防止空闲断开。确保安全组/防火墙规则正确配置
Received disconnect from host: Too many authentication failures
出现场景:连接服务器时,SSH 客户端尝试了多个密钥都失败
原因:ssh-agent 中加载了太多密钥,SSH 客户端逐个尝试直到超过服务器的 MaxAuthTries 限制
解决方案:
- 在 ~/.ssh/config 中为目标主机指定密钥:IdentityFile ~/.ssh/specific_key
- 添加 IdentitiesOnly yes 禁止 agent 自动尝试其他密钥
- 减少 agent 中的密钥数量:ssh-add -D 清除后只添加需要的
- 临时指定密钥连接:ssh -o IdentitiesOnly=yes -i ~/.ssh/key user@host
- 增加服务端限制(不推荐):MaxAuthTries 6(在 /etc/ssh/sshd_config)
预防:在 ~/.ssh/config 中为每个 Host 明确指定 IdentityFile 和 IdentitiesOnly yes,避免 SSH 客户端盲目尝试所有密钥。保持 agent 中只加载常用密钥