栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

关于使用JSch连接sftp服务器的时候报UnknownHostKey异常

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于使用JSch连接sftp服务器的时候报UnknownHostKey异常

问题场景:

因项目上需要下载第三方的sftp文件,这里用的是JSch连接的sftp服务器,JSch只需要在pom文件引入即可

        
        
            com.jcraft
            jsch
            0.1.55
        

在连接服务器的时候出现如下异常

连接代码如下:

     
    public ChannelSftp connect() {
        JSch jSch = new JSch();
        Session session = null;
        ChannelSftp sftp = null;
        try {
            //密钥登录指定密钥文件位置
            jSch.addIdentity("D:\WorkSoft\baidu\file\key.pem");
            session = jSch.getSession(loginName, server, port);
            //密码登录需要指定密码
            //session.setPassword(loginPassword);
            //设置超时时间
            session.connect(3000);

            Properties properties = new Properties();
            //设置StrictHostKeyChecking 代表公钥检查机制,为no表示最不安全的级别(比如不提示一些安全警告)
            properties.put("StrictHostKeyChecking", "no");
            session.setConfig(properties);
            sftp = (ChannelSftp) session.openChannel("sftp");
            sftp.connect();

            logger.info("登录成功:" + sftp.getServerVersion());

        } catch (Exception e) {
            logger.error("连接sftp服务器发生异常!", e);
            return null;
        }
        return sftp;
    }

出现错误的原因是因为我们在使用ssh或者sftp命令第一次连接指定终端的时候会提示你保存一个指纹信息比如输入yes/no , 之后信息会被保存在known_hosts里面(也不一定会在这个文件里面比如我用xshell6先连接一下服务器会在这个文件里面缓存公钥信息,但用xshell7就不会,xshell7会缓存到别的位置),但是在代码里面没法这样操作,需要自己指定known_hosts文件的位置才行。所以代码里加入下面这段话就可以了,我本地的known_hosts文件位置是:C:Userslenovo.sshknown_hosts
一般known_hosts文件里面需要有这样的内容如下所示:

127.0.0.1 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCCkUbYb6F1reUNzAGEd3x7cgWEoJanW0t4xQVgTViUkA1yw3rtU6BuzHdpycn7G4s97M5BsCSHsb/vJliO0//uR9Ls2E9tQWIJNiurectR6j8pe0y/7OCVHvA79IuDYzvHdPBx8Zi+L5CVc0ip9ShCbmEY8FN6lkmpChkwxVNGC4nlKEzCbcxdMnhUw9xKk/VUFAJGC/RMnmzf2uAKmAciTcuRxaLMNEU/Au3XTjUuVwm4SyAHG5Pa3Us6fjVrzgYeThRxcEOymM3oVPqbXNHEwZsE404IDfB6phxkEGqKSjb4B/uEcqhCoQ8BCfXcLDmj6umt8fapiPUDN8eddoXm

自己连接的sftp服务器信息要在known_hosts文件里面有才行否则还是会报错

//设定指纹(比如在shell终端会提示用户输入yes/no 来保存,但是代码里需要手动指定才行, 就是把自己ssh的known_hosts路径指定上就行了)
jSch.setKnownHosts("C:\Users\lenovo\.ssh\known_hosts");
当然如果不指定known_hosts地址也可以这么写
jSch.setKnownHosts(new FileInputStream("你的文件地址"));

你的文件地址里面内容其实就是缓存的目标主机的公钥信息,没有的话可以自己生成一下即可

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/882437.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号