jsch是一个纯java实现的sftp工具包,因为历史版本原因,很多机器使用的Jsch包比较陈旧。但是服务端ssh服务可能升级到6.7以上,特别是7.0以上,服务端默认会关闭安全性较低的密钥协商算法,从而导致协商无法成功,sftp连接建立失败。
这就是为什么手工执行 sftp username@xxx.xxx.xxx.xxx 可以免密登录,而程序会一直失败,因为走的是两条不同的路径。
相关的报错信息可能类似:
no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
解放方案一、服务端修改sshd_config配置文件
/etc/ssh/sshd_config最后添加:
KexAlgorithms +diffie-hellman-group1-sha1
#然后重启ssh服务
# service sshd restart
解决方案二、客户端下载并升级Java密码学扩展JCE。或者JDK直接升级到1.8。
如何升级JCE,请参考 https://www.cnblogs.com/husbandmen/articles/7096120.html
解决方案三、jsch包更新到0.1.54版本以上,并且在代码中设置:
your Method {
session.setConfig("StrictHostKeyChecking", "no");// That solve the problem
}
//如果您需要此Java版本,则此代码可在Java 1.5或更高版本中使用。
网友评论