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

问题场景:

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

        <!-- sftp -->
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.55</version>
        </dependency>

在连接服务器的时候出现如下异常
在这里插入图片描述
连接代码如下:

     /**
     * 连接登陆远程服务器
     * 连接成功之后就可以用ChannelSftp 来操作服务器上的文件了
     *
     * @return
     */
    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:\Users\lenovo\.ssh\known_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("你的文件地址"));

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值