You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器中Java SSH连接报错:HostKey has been changed求助

安全解决JSch非默认端口SSH连接的HostKey变更错误

核心原因

当连接非22端口的SSH主机时,known_hosts中的条目必须包含端口号(格式为[IP]:端口),否则JSch会将带端口的连接视为全新主机,触发密钥不匹配的错误。你之前的操作未针对指定端口生成正确的主机密钥条目,导致验证失败。

安全解决步骤

1. 生成带端口的主机密钥并写入known_hosts

在容器内执行以下命令(或在本地挂载的/home/myusername/.ssh目录下执行,挂载后会同步到容器):

ssh-keyscan -t rsa,ecdsa -p <你的端口号> 192.xx.xx.xx >> /root/.ssh/known_hosts

执行后检查known_hosts文件,确认存在类似如下格式的条目:

[192.xx.xx.xx]:<端口号> ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...
[192.xx.xx.xx]:<端口号> ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBB...

2. 修正.ssh目录及文件权限

SSH对权限要求严格,挂载后的目录/文件权限可能不符合要求,导致JSch无法正常读取验证信息:

# 容器内修正权限
chmod 700 /root/.ssh
chmod 644 /root/.ssh/known_hosts
chmod 600 /root/.ssh/id_rsa

如果在本地修改挂载目录权限,对应执行:

chmod 700 /home/myusername/.ssh
chmod 644 /home/myusername/.ssh/known_hosts
chmod 600 /home/myusername/.ssh/id_rsa

3. 验证JSch加载known_hosts的逻辑

确认代码中jsch.setKnownHosts("/root/.ssh/known_hosts")路径正确,可添加调试输出检查加载的主机密钥:

// 调试:打印已加载的主机密钥
HostKeyRepository repo = jsch.getHostKeyRepository();
HostKey[] keys = repo.getHostKeys();
for(HostKey key : keys){
    System.out.println("加载的主机密钥:" + key.getHost() + " " + key.getType());
}

确认输出中包含[192.xx.xx.xx]:<端口号>的条目。

额外注意事项

  • 不要直接删除整个known_hosts后用普通ssh命令连接,若容器内ssh配置与代码使用的配置不一致,仍可能生成不匹配的条目。
  • 确保代码中获取的host和port与known_hosts中的条目完全匹配(IP+端口的格式)。

内容的提问来源于stack exchange,提问作者MKRabbit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:48:10