ssh报错解决 ECDSA host key for 123.56.11.181 has changed and you have requested strict checking.

本文介绍了一种常见的SSH连接问题及解决方法。当云服务器重装系统后,原有的SSH密钥可能不再有效,这时需要清除本地关于远程服务器的缓存和公钥信息。文章提供了具体的命令来解决这一问题。

起因:云服务器重装了系统,导致本地的SSH信息便失效了,所以会报错。
解决办法:

ssh-keygen -R 123.56.11.181

目的是清除本地关于远程服务器的缓存和公钥信息。

这个错误信息: ``` ECDSA host key for 10.0.0.20 has changed and you have requested strict checking. Host key verification failed. lost connection ``` 出现在 Jenkins 执行部署任务(通常是通过 SSH 连接到远程服务器)时,表示 **SSH 客户端检测到目标主机(10.0.0.20)的 SSH 主机密钥(host key)与之前记录的不同**,出于安全考虑拒绝连接。 这通常发生在以下几种情况中: - 目标服务器(10.0.0.20)重装了操作系统或 SSH 服务。 - SSH 主机密钥被重新生成。 - IP 地址被另一台机器复用。 - 中间人攻击(较少见,但在生产环境需警惕)。 Jenkins 使用 `ssh` 命令或 `scp`/`rsync over ssh` 等方式连接目标服务器时,会依赖底层 SSH 客户端的行为。默认情况下,OpenSSH 启用了 `StrictHostKeyChecking=yes`,因此一旦发现密钥不一致,就会报错并终止连接。 --- ### ✅ 解决方案 #### 方案一:手动删除旧的 known_hosts 条目(推荐) 你需要在 **运行 Jenkins 的服务器上**,找到并删除对 `10.0.0.20` 的旧 SSH 主机密钥记录。 ```bash # 删除已知主机中关于 10.0.0.20 的记录 ssh-keygen -R 10.0.0.20 ``` > 这个命令会自动从 `~/.ssh/known_hosts` 文件中移除 `10.0.0.20` 对应的行。 然后可以手动测试连接一次以重新添加新密钥: ```bash ssh user@10.0.0.20 ``` 输入 yes 确认信任新的主机密钥。 ✅ 在 Jenkins 中再次运行部署任务即可正常连接。 --- #### 方案二:在 SSH 命令中禁用严格主机密钥检查(仅用于受控环境) 如果你是在 CI/CD 脚本中使用 `ssh` 或 `scp` 命令,可以通过参数临时关闭严格检查: ```bash ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user@10.0.0.20 'your-command' ``` 或者在 Jenkins Pipeline 脚本中这样写: ```groovy sh ''' ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user@10.0.0.20 "systemctl restart myapp" ''' ``` ⚠️ **注意:这种方式有安全风险**,容易受到中间人攻击,**仅建议在测试环境或完全可信的内网中使用**。 --- #### 方案三:预填充 known_hosts 文件(适合自动化部署) 更安全的做法是提前将目标服务器的公钥加入 Jenkins 节点的 `~/.ssh/known_hosts` 文件。 获取目标服务器的 SSH 公钥指纹: ```bash ssh-keyscan 10.0.0.20 >> ~/.ssh/known_hosts ``` 或者只获取特定类型的密钥: ```bash ssh-keyscan -t ecdsa 10.0.0.20 >> ~/.ssh/known_hosts ``` 你也可以将该步骤作为 Jenkins Job 的前置步骤执行。 --- ### 🔐 如何确认是否是合法变更? 在执行上述操作前,请确认 `10.0.0.20` 的 SSH 密钥确实是因为合法原因改变(如重装系统),而不是遭受攻击。 你可以登录到 `10.0.0.20`,查看其当前主机公钥: ```bash sudo cat /etc/ssh/ssh_host_ecdsa_key.pub ``` 然后用本地命令比对: ```bash ssh-keygen -l -f <(ssh-keyscan 10.0.0.20) ``` 如果匹配,则说明是合法密钥。 --- ### 🛠 Jenkins Pipeline 示例(安全做法) ```groovy pipeline { agent any stages { stage('Deploy') { steps { script { // 清除旧的 known_hosts 记录 sh 'ssh-keygen -R 10.0.0.20 || true' // 可选:添加新的公钥(更安全) sh 'ssh-keyscan 10.0.0.20 >> ~/.ssh/known_hosts' // 执行远程命令 sh ''' ssh user@10.0.0.20 << 'EOF' cd /var/www/myapp git pull origin main systemctl restart myapp EOF ''' } } } } } ``` --- ### 总结 | 方法 | 是否推荐 | 说明 | |------|----------|------| | `ssh-keygen -R 10.0.0.20` | ✅ 推荐 | 安全、标准做法 | | `-o StrictHostKeyChecking=no` | ⚠️ 谨慎使用 | 快速但有安全隐患 | | 预填充 known_hosts | ✅ 生产推荐 | 自动化部署最佳实践 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值