IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 关于使用JSch连接sftp服务器的时候报UnknownHostKey异常 -> 正文阅读

[系统运维]关于使用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("你的文件地址"));

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

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:43:29  更:2022-05-12 16:45:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:24:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码