SSH 常见报错速查

开发中常遇到的 SSH 报错信息,快速定位原因和解决方案。

Permission denied (publickey)

出现场景:使用密钥认证连接远程服务器时

原因:SSH 服务器拒绝了密钥认证,可能是公钥未添加到服务器、密钥文件权限不正确、或使用了错误的密钥

解决方案:

  1. 确认公钥已添加到服务器:ssh user@host 'cat ~/.ssh/authorized_keys' 检查是否包含你的公钥
  2. 检查本地私钥权限:chmod 600 ~/.ssh/id_ed25519(必须为 600)
  3. 检查远程 .ssh 目录权限:chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
  4. 指定正确的密钥文件:ssh -i ~/.ssh/correct_key user@host
  5. 用 -v 调试查看使用了哪个密钥:ssh -v user@host,找 Offering public key 行
  6. 确认服务端开启了密钥认证:PubkeyAuthentication yes(在 /etc/ssh/sshd_config)

预防:使用 ssh-copy-id 自动配置公钥和权限,在 ~/.ssh/config 中为每个 Host 指定 IdentityFile 避免密钥混淆

ssh: connect to host xxx port 22: Connection refused

出现场景:尝试连接远程服务器时

原因:目标主机的 SSH 服务未运行、端口不正确、或防火墙阻止了连接

解决方案:

  1. 确认 SSH 服务正在运行:systemctl status sshd 或 service ssh status
  2. 启动 SSH 服务:sudo systemctl start sshd
  3. 确认 SSH 监听端口:ss -tlnp | grep ssh,如果改了端口用 ssh -p 端口号 连接
  4. 检查防火墙规则:sudo ufw status 或 sudo iptables -L -n | grep 22
  5. 开放防火墙端口:sudo ufw allow 22/tcp 或 sudo firewall-cmd --add-port=22/tcp --permanent
  6. 如果是云服务器,检查安全组/网络 ACL 是否放行了 SSH 端口

预防:部署服务器时确保 SSH 服务设为开机自启(systemctl enable sshd),配置防火墙时优先放行 SSH 端口避免锁死自己

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! ... Host key verification failed.

出现场景:连接之前连接过的服务器时

原因:服务器的主机密钥与本地 known_hosts 中记录的不一致,可能是服务器重装、IP 变更、或遭受中间人攻击

解决方案:

  1. 如果确认是服务器重装/重建,移除旧记录:ssh-keygen -R hostname
  2. 移除后重新连接,确认新的主机指纹:ssh user@host
  3. 如果是 IP 复用(如云服务器释放后重新分配),同样移除旧记录即可
  4. 如果不确定原因,联系服务器管理员确认主机密钥是否变更
  5. 手动编辑 known_hosts 删除对应行:vim ~/.ssh/known_hosts,找到对应 IP 的行删除

预防:服务器重装后主动通知团队主机密钥已变更。使用 ssh-keyscan 获取新密钥并验证指纹。不要养成无脑 StrictHostKeyChecking=no 的习惯,这会让你对中间人攻击毫无防备

ssh: connect to host xxx port 22: Connection timed out

出现场景:尝试连接远程服务器时长时间无响应

原因:网络不通、目标主机不可达、防火墙静默丢弃数据包(DROP 而非 REJECT)、或路由问题

解决方案:

  1. 检查网络连通性:ping host 确认主机是否可达
  2. 检查端口是否开放:telnet host 22 或 nc -zv host 22
  3. 如果是内网服务器,确认 VPN 是否已连接
  4. 检查本地防火墙是否阻止了出站连接
  5. 尝试 traceroute host 查看网络路径在哪里中断
  6. 如果是云服务器,检查安全组入站规则是否允许你的 IP 访问 SSH 端口

预防:在 ~/.ssh/config 中设置 ConnectTimeout 10 避免长时间等待。使用 ServerAliveInterval 60 保持连接活跃防止空闲断开。确保安全组/防火墙规则正确配置

Received disconnect from host: Too many authentication failures

出现场景:连接服务器时,SSH 客户端尝试了多个密钥都失败

原因:ssh-agent 中加载了太多密钥,SSH 客户端逐个尝试直到超过服务器的 MaxAuthTries 限制

解决方案:

  1. 在 ~/.ssh/config 中为目标主机指定密钥:IdentityFile ~/.ssh/specific_key
  2. 添加 IdentitiesOnly yes 禁止 agent 自动尝试其他密钥
  3. 减少 agent 中的密钥数量:ssh-add -D 清除后只添加需要的
  4. 临时指定密钥连接:ssh -o IdentitiesOnly=yes -i ~/.ssh/key user@host
  5. 增加服务端限制(不推荐):MaxAuthTries 6(在 /etc/ssh/sshd_config)

预防:在 ~/.ssh/config 中为每个 Host 明确指定 IdentityFile 和 IdentitiesOnly yes,避免 SSH 客户端盲目尝试所有密钥。保持 agent 中只加载常用密钥