Jsch 使用过程中遇到的问题及解决方法

Jsch 使用过程中遇到的问题及解决方法

使用版本
//maven
<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version>
</dependency>//gradle
implementation 'com.jcraft:jsch:0.1.55'

以上的版本是笔者正在使用的,目前没有发现有安全漏洞,但是,该项目已经有很长时间没有维护了。如果因为下面这些原因,可以验证使用这个Jsch。当然,这需要你自己去验证

  • 起源于 JSch-0.1.55 的子项目
  • OpenSSH 在 8.8 版本中默认禁用了 ssh-rsa,需要一个支持 rsa-sha2-256 和 rsa-sha2-512 的库。
  • 项目更新维护频繁
运行环境
Jdk 1.8
存在问题
  1. session 连接失效,无法下载文件的问题?

    使用缓存将已获取的 session 连接存储起来,每次都从缓存中获取,使用前都验证下看 session 连接是否失效。

  2. 多线程同时使用 session 连接,下载文件造成的竞争问题?

    每次获取 session 连接时,从缓存中获取,如果 session 连接失效,(该步加锁,避免竞争问题)则从缓存中删除连接,并重新获取并放到缓存中。

代码示例
	/*** session缓存*/private static final Map<String, Session> cache = new HashMap<>();private SftpConfig SftpConfig;public SftpUtils(SftpConfig SftpConfig) {this.SftpConfig = SftpConfig;}/*** 打开 Session 连接*/public Session openSession() throws JSchException {String key = this.SftpConfig.getHost() + this.SftpConfig.getUsername() + this.SftpConfig.getPort();Session session = cache.get(key);if (ObjectUtils.isEmpty(session)) {JSch jSch = new JSch();session = jSch.getSession(this.SftpConfig.getUsername(), this.SftpConfig.getHost(), this.SftpConfig.getPort());session.setConfig("StrictHostKeyChecking", "no");session.setPassword(this.SftpConfig.getPassword());session.connect(this.SftpConfig.getTimeOut());if (session.isConnected()) {log.info("session connect host:{} port:{} success", this.SftpConfig.getHost(), this.SftpConfig.getPort());}cache.put(key, session);} else {//判断session是否失效if (testSessionIsDown(key)) {//session is downcloseLongSessionByKey(key);//重新生成sessionsession = openSession();}}return session;}/*** 销毁 session** @param key*/public synchronized void closeLongSessionByKey(String key) {Session session = cache.get(key);if (session != null) {session.disconnect();cache.remove(key);}}/*** 测试session是否失效** @return*/public boolean testSessionIsDown(String key) {Session session = cache.get(key);if (session == null) {return true;}ChannelExec channelExec = null;try {channelExec = openChannelExec(session);channelExec.setCommand("true");channelExec.connect();return false;} catch (Throwable e) {//session is downreturn true;} finally {if (channelExec != null) {channelExec.disconnect();}}}/*** 新建一个 exec 通道** @return* @throws JSchException*/public ChannelExec openChannelExec(Session session) throws JSchException {ChannelExec channelExec = (ChannelExec) session.openChannel("exec");return channelExec;}/*** 打开 channel 通道*/public ChannelSftp openChannel(Session session) throws JSchException {ChannelSftp sftp = (ChannelSftp) session.openChannel("sftp");sftp.connect();if (sftp.isConnected()) {log.info("sftp channel open success");}return sftp;}/*** 关闭 channel 通道*/public void closeChannel(ChannelSftp sftp) {if (sftp != null) {sftp.disconnect();}log.info("channel closed");}

注意:笔者是通过用户名+密码的方式,获取连接,也可以通过公私钥的方式获取,就不再进行代码演示。此处的 SftpConfig 对象是自定义对象,交由 Spring 管理,将 SFTP的配置信息加载到 SftpConfig 对象中。

使用示例
	/*** 下载文件到本地* <li>srcFile 示例:/20231017/test001.txt</li>* <li>dstFile 示例:/download/file/test001.txt</li>** @param session* @param srcFile 源文件路径* @param dstFile 本地文件路径* @return true-成功 false-失败*/public boolean downloadFile(Session session, String srcFile, String dstFile) throws SftpException, JSchException {ChannelSftp sftp = null;try {sftp = openChannel(session);if (ObjectUtils.isEmpty(sftp)) {log.error("SFTP channel or session disconnect ");return false;}log.info("begin download file");sftp.get(srcFile, dstFile);log.info("download file finished");} finally {closeChannel(sftp);}return true;}

更多的使用示例,可以查看该篇文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/177199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西南科技大学数字电子技术实验二(SSI逻辑器件设计组合逻辑电路及FPGA实现 )FPGA部分

一、实验目的 1、掌握用SSI(小规模集成电路)逻辑器件设计组合电路的方法。 2、掌握组合逻辑电路的调试方法。 3、学会分析和解决实验中遇到的问题。 4、学会用FPGA实现本实验内容。 二、实验原理 包括:原理图绘制和实验原理简述 1、1位半加器 2、1位全加器 3、三…

数据结构 / day03作业

1.顺序表按元素删除 //main.c#include "head.h" int main(int argc, const char *argv[]) {sqlist *listcreate_space();// printf("&list%p\n", list);int n;int index;data_type element, key;printf("please input n;");scanf("%d&…

2021年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

文章目录 2021年全国硕士研究生入学招生考试英语二试题SectionⅠUse of EnglishSection Ⅱ Reading ComprehensionText 1Text 2Text 2Text 3Text 4 Section III TranslationSection Ⅳ Writing 2021年全国硕士研究生入学招生考试英语二试题 SectionⅠUse of English Directio…

oracle数据库备份2(expdp)

使用exp命令定时进行数据库备份的操作前面已经记录过&#xff1a; oralce数据库定时备份 下面记录下使用更加高效的expdp命令和impdp&#xff0c;这两个命令同样是用来做数据库备份和还原的&#xff0c;但速度更快&#xff0c;效率更高&#xff0c;缺点是只能用在服务器端进行…

在JavaScript中添加css样式 js追加类

一、原生js中添加类的方法 1.为 <div> 元素添加一个类: document.getElementById("div").classList.add("类名"); 2.为 <div> 元素添加多个类: document.getElementById("div").classList.add("类名1","类名2"…

阿里云ACE认证之国际版与国内版对比!

大厂疯狂裁员&#xff0c;互联网行业迎来寒冬&#xff0c;技术人员被动陷入疯狂内卷。在愈加内卷的IT领域&#xff0c;“云计算”作为少有的蓝海&#xff0c;无疑是打工人未来实现职场提升、摆脱内卷的绝佳选择&#xff01; 对于云计算行业的人来说&#xff0c;最值得考的肯定是…

洪泽湖流域建筑物、人口密度与土地利用数据技术服务

一&#xff0e;背景介绍 人类社会发展离不开土地&#xff0c;没有土地就没有人类&#xff0c;土地利用随着人类的出现而发生。人类为了一定的社会或经济方面的目的&#xff0c;会通过利用、改造等活动。从土地上获得更多的资源。土地利用既要受自然条件的制约&#xff0c;同时也…

2023年国赛试题:配置inux1 为 CA 服务器

试题内容:配置 linux1 为 CA 服务器,为 linux 主机颁发证书。证书颁发机构有 效期 10 年,公用名为 linux1.skills.lan。申请并颁发一张供 linux 服务器使用的证书,证书信息:有效期 =5 年,公用名=skills.lan, 国家=CN,省=Beijing,城市=Beijing,组织=skills,组织单位…

Unity UGUI的自动布局-LayoutGroup(水平布局)组件

Horizontal Layout Group | Unity UI | 1.0.0 1. 什么是HorizontalLayoutGroup组件&#xff1f; HorizontalLayoutGroup是Unity UGUI中的一种布局组件&#xff0c;用于在水平方向上对子物体进行排列和布局。它可以根据一定的规则自动调整子物体的位置和大小&#xff0c;使它们…

亚马逊云科技实现了奇瑞捷豹路虎SAP系统的上云目标并保持成本优化

11月23日&#xff0c;“2023第八届IDC中国数字化转型年度盛典”正式开启并揭晓“2023 IDC中国未来企业大奖-卓越奖”获奖企业&#xff0c;奇瑞捷豹路虎汽车有限公司&#xff08;以下简称“奇瑞捷豹路虎”&#xff09;凭借“基于云原生的智慧化运营平台”项目&#xff0c;继获得…

自动驾驶HWP功能规范

HWP功能规范 Highway Pilot Functional Specification 文件状态&#xff1a; 【√】草稿 【】正式发布 【】正在修改 文件起草分工 撰写&#xff1a; 审核&#xff1a; 编制&#xff1a; 签名&#xff1a; 日期&#xff1a; 审核&#xff1a; 签名&#xff1a; 日期&am…

企业业务场景如何实现自动化连接?

为什么要实现企业业务场景的自动化连接&#xff1f; 可提高效率&#xff0c;自动化连接可以减少人工操作和手动干预的需求&#xff0c;从而提高业务处理的速度和效率。通过自动化连接&#xff0c;不同的系统、应用程序和流程可以自动协同工作&#xff0c;减少了人工处理的时间和…

【计算机组成原理】存储系统

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理计算机组成原理中 存储系统的知识点和值得注意的地方 &#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以…

打游戏NVIDIA怎么设置性能最好?

打游戏NVIDIA怎么设置性能最好&#xff1f;当前很多用户都在Win10电脑上畅玩游戏&#xff0c;所以想知道NVIDIA控制面板最佳设置方法&#xff0c;更好地发挥NVIDIA控制面板性能&#xff0c;用户就能享受更棒的游戏乐趣。接下来小编给大家详细介绍NVIDIA显卡游戏最佳设置步骤教程…

【Proteus仿真】【51单片机】智能晾衣架设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD1604液晶、按键、蜂鸣器、L298N电机、PCF8591 ADC模块、DHT11温湿度传感器、雨滴传感器、风速、光线传感器等。 主要功能&#xff1a; 系统运行…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 6》(10)

《Linux操作系统原理分析之Linux 进程管理 6》&#xff08;10&#xff09; 4 Linux 进程管理4.6 Linux 管道4.6.1 管道的概念4.6.2 无名管道1.终端使用2.程序中使用 4.6.2 命名管道1.终端使用2.程序中使用 4 Linux 进程管理 4.6 Linux 管道 4.6.1 管道的概念 1、管道是 linu…

2019年10月17日: Go生态洞察:在Go 1.13中处理错误

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Mysql数据库多表数据查询问题

1、背景 线上某个业务数据分表存储在10个子表中&#xff0c;现在需要快速按照条件&#xff08;比如时间范围&#xff09;筛选出所有的数据&#xff0c;主要是想做一个可视化的数据查询工具&#xff0c;给产研团队使用。 2、实践 注意&#xff1a;不要在线上真实数据库操作&am…

用户选择PowerFlex的十大理由

既有高性能      满足AI、VDI、数据库等工作负载      又有开放架构      4个节点起步可扩展至上千节点      支撑起不断变化的新兴应用负载      还能与云互通      实现云上云下互联      Dell PowerFlex      连续八季度销量增长      …

提升企业文档处理效率,尽在Readiris PDF Corporate下载

在现代企业中&#xff0c;大量的文档处理工作是不可避免的。然而&#xff0c;传统的文档处理方法往往效率低下&#xff0c;浪费了企业宝贵的时间和资源。为了帮助企业提升文档处理效率&#xff0c;我们推荐使用Readiris PDF Corporate软件。 Readiris PDF Corporate是一款功能…