Java之通过Jsch库连接Linux实现文件传输
Java之通过JSch库连接Linux实现文件传输
文章目录
- Java之通过JSch库连接Linux实现文件传输
- 1. JSch
- 2. Java通过Jsch连接Linux
- 1. poxm.xml
- 2. 工具类
- 3. 调用案例
1. JSch
官网:JSch - Java Secure Channel (jcraft.com)
JSch是SSH2的纯Java实现。
JSch 允许您连接到 sshd 服务器并使用端口 转发、X11 转发、文件传输等,以及 您可以将其功能集成到您自己的 Java 程序中。 JSch在BSD风格的许可证下获得许可。
2. Java通过Jsch连接Linux
1. poxm.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.yuan</groupId><artifactId>yuan-connect-linux</artifactId><version>1.0.0</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency><dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version></dependency></dependencies>
</project>
2. 工具类
SftpUtils.java
如下:
package com.yuan.utils;import com.jcraft.jsch.*;
import org.apache.commons.lang3.StringUtils;import java.io.*;
import java.util.*;
import java.util.logging.Logger;//在使用的的时候,需要调用 connect()开启连接,使用完后调用 disconnect() 关闭连接 。
public class SftpUtils {Logger log = Logger.getLogger(SftpUtils.class.getName());/*** 主机名称/IP*/private String host;/*** 端口,默认22*/private int port = 22;/*** 用户名*/private String userName;/*** 密码*/private String password;private ChannelSftp sftp = null;private Channel channel = null;private Session session = null;public SftpUtils(String host, String userName, String password) {this.host = host;this.userName = userName;this.password = password;}public SftpUtils(String host, int port, String userName, String password) {this.host = host;this.port = port;this.userName = userName;this.password = password;}/*** 连接到服务器** @throws JSchException*/public void connect() throws JSchException {JSch jSch = new JSch();session = jSch.getSession(userName, host, port);session.setPassword(password);session.setConfig(this.config());session.connect();channel = session.openChannel("sftp");channel.connect();sftp = (ChannelSftp) channel;log.info("以连接到主机" + host);}/*** config** @return Properties*/private Properties config() {Properties properties = new Properties();properties.put("StrictHostKeyChecking", "no");return properties;}/*** 关闭连接*/public void closeConnect() {try {if (sftp.isConnected()) {sftp.disconnect();}if (channel.isConnected()) {channel.disconnect();}if (session.isConnected()) {session.disconnect();}} catch (Throwable e) {e.printStackTrace();}}/*** 下载文件** @param remoteDir 远程服务器文件目录,不指定路径默认是FTP的根路径,指定路径是指的SFTP的根路径下开始。* 例如:SFTP根路径为:/sftp/file,那么默认下载文件会去根路径下载,而指定 sftpPath 也是从根路径下开始;* 指定 sftpPath 为 word,那么是从 /sftp/file/word 路径中查找文件下载。为空表示忽略该参数。* @param fileName 文件名,如:myTest.pdf* @param outputFilePath 下载文件保存路径,目录+文件名,例如:d:/pdf/myTest.pdf* @return*/public boolean downloadFile(String remoteDir, String fileName, String outputFilePath) {OutputStream outputStream = null;try {if (StringUtils.isNotBlank(remoteDir)) {sftp.cd(remoteDir);}outputStream = new FileOutputStream(outputFilePath);sftp.get(fileName, outputStream);return true;} catch (Exception e) {log.info("下载文件错误," + e.getMessage());} finally {if (outputStream != null) {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}return false;}/*** 文件上传** @param remotePath 远程服务器目录,不指定路径默认是FTP的根目录,指定路径是指的SFTP的根目录下开始。* 例如:SFTP根路径为:/opt/file,那么默认下载文件会去根路径下载,而指定 sftpPath 也是从根路径下开始;* 指定 sftpPath 为 word,那么是从 /sftp/file/word 路径中查找文件下载。为空表示忽略该参数。* @param fileName 上传后文件名* @param localFilePath 本地文件路径,目录+文件名,例如:d:/aa/myTest.pdf* @return*/public boolean uploadFile(String remotePath, String fileName, String localFilePath) {InputStream inputStream = null;try {if (StringUtils.isNotBlank(remotePath)) {sftp.cd(remotePath);}inputStream = new FileInputStream(localFilePath);sftp.put(inputStream, fileName);return true;} catch (Exception e) {log.info("文件上传失败:" + e.getMessage());} finally {if (null != inputStream) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}return false;}/*** 上传文件** @param remotePath 远程服务器目录,不指定路径默认是FTP的根目录,指定路径是指的SFTP的根目录下开始。* 例如:SFTP根路径为:/sftp/file,那么默认下载文件会去根路径下载,而指定 sftpPath 也是从根路径下开始;* 指定 sftpPath 为 word,那么是从 /sftp/file/word 路径中查找文件下载。为空表示忽略该参数。* @param fileName 上传后文件名* @param inputStream 文件输入流* @return*/public boolean uploadFile(String remotePath, String fileName, InputStream inputStream) {try {if (StringUtils.isNotBlank(remotePath)) {sftp.cd(remotePath);}sftp.put(inputStream, fileName);return true;} catch (Exception e) {log.info("文件上传失败:" + e.getMessage());} finally {if (null != inputStream) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}return false;}/*** 文件删除** @param remotePath 远程服务器目录,不指定路径默认是FTP的根目录,指定路径是指的SFTP的根目录下开始。* 例如:SFTP根路径为:/sftp/file,那么默认下载文件会去根路径下载,而指定 sftpPath 也是从根路径下开始;* 指定 sftpPath 为 word,那么是从 /sftp/file/word 路径中查找文件下载。为空表示忽略该参数。* @param fileName 文件名* @return*/public boolean deleteFile(String remotePath, String fileName) {try {if (StringUtils.isNotBlank(remotePath)) {sftp.cd(remotePath);}sftp.rm(fileName);return true;} catch (Exception e) {log.info("删除文件失败:" + e.getMessage());}return false;}/*** 查询指定目录下所有文件** @param remotePath 远程服务器目录,不指定路径默认是FTP的根目录,指定路径是指的SFTP的根目录下开始。* 例如:SFTP根路径为:/sftp/file,那么默认下载文件会去根路径下载,而指定 sftpPath 也是从根路径下开始;* 指定 sftpPath 为 word,那么是从 /sftp/file/word 路径中查找文件下载。为空表示忽略该参数。* @return*/public List<String> listFiles(String remotePath) throws SftpException {Vector files = sftp.ls(remotePath);List<String> result = new ArrayList<>();Iterator iterator = files.iterator();while (iterator.hasNext()) {ChannelSftp.LsEntry isEntity = (ChannelSftp.LsEntry) iterator.next();result.add(isEntity.getFilename());}return result;}
}
3. 调用案例
package com.yuan;import com.yuan.utils.SftpUtils;public class SftpDemo {public static void main(String[] args) {SftpUtils sftpUtils = null;try {sftpUtils = new SftpUtils("??", 22, "??", "??");sftpUtils.connect();sftpUtils.downloadFile("/opt/download/", "myTest.pdf", "D:\\aa\\pdf\\yuan.pdf");} catch (Exception e) {e.printStackTrace();} finally {if (sftpUtils != null) {sftpUtils.closeConnect();}}}
}
相关文章:

Java之通过Jsch库连接Linux实现文件传输
Java之通过JSch库连接Linux实现文件传输 文章目录 Java之通过JSch库连接Linux实现文件传输1. JSch2. Java通过Jsch连接Linux1. poxm.xml2. 工具类3. 调用案例 1. JSch 官网:JSch - Java Secure Channel (jcraft.com) JSch是SSH2的纯Java实现。 JSch 允许您连接到 ss…...

Nginx七层负载均衡之动静分离
思路: servera:负载均衡服务器 serverb:静态服务器 serverc:动态服务器 serverd:默认服务器 servera(192.168.233.132): # 安装 Nginx 服务器 yum install nginx -y#关闭防火墙和selinux systemctl stop firewalld setenforce 0# 切换到 Nginx 配置文…...

305_C++_定义了一个定时器池 TimerPool 类和相关的枚举类型和结构体
头文件:定义了一个定时器池 TimerPool 类和相关的枚举类型和结构体 #ifndef TIMERPOOL_H #define TIMERPOOL_H #include "rsglobal.h" #include "taskqueue.h" #incl...

大整数因数分解工具——yafu
一、安装 yafu--下载链接 二、配置环境变量,直接从cmd打开 1.找到yafu-x64.exe 所在的文件路径 2.点击设置——系统——系统信息——高级系统设置——环境变量——点击PATH(上下都可以)——新建 添加yafu-x64.exe 所在路径——点击确定 3…...

非关系型数据库(NOSQL)和关系型数据库(SQL)区别详解
前言: 在我们的日常开发中,关系型数据库和非关系型数据库的使用已经是一个成熟的软件产品开发过程中必不可却的存储数据的工具了。那么用了这么久的关系数据库和非关系型数据库你们都知道他们之间的区别了吗?下面我们来详细的介绍一下。 关系…...

7.Cloud-GateWay
0.概述 https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/ 1.入门配置 1.1 POM <!--新增gateway--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-sta…...

【Linux】Framebuffer 应用
# 前置知识 LCD 操作原理 在 Linux 系统中通过 Framebuffer 驱动程序来控制 LCD。 Frame 是帧的意思, buffer 是缓冲的意思,这意味着 Framebuffer 就是一块内存,里面保存着一帧图像。 Framebuffer 中保存着一帧图像的每一个像素颜色值&…...

markdown绘制流程图相关代码片段记录
有时候会使用typora来绘制一些流程图,进行编码之类的工作,在网络搜集了一些笔记,做个记录,方便日后进行复习,相关的记录如下: 每次作图时,代码以「graph <布局方向>」开头,如…...

云计算基础-计算虚拟化-CPU虚拟化
CPU指令系统 在CPU的工作原理中,CPU有不同的指令集,如下图,CPU有4各指令集:Ring0-3,指令集是在服务器上运行的所有命令,最终都会在CPU上执行,但是CPU并不是说所有的命令都是一视同仁的…...

MySQL数据库⑪_C/C++连接MySQL_发送请求
目录 1. 下载库文件 2. 使用库 3. 链接MySQL函数 4. C/C链接示例 5. 发送SQL请求 6. 获取查询结果 本篇完。 1. 下载库文件 要使用C/C连接MySQL,需要使用MySQL官网提供的库。 进入MySQL官网选择适合自己平台的mysql connect库,然后点击下载就行…...

选择排序和快速排序(1)
目录 选择排序 基本思想 选择排序的实现 图片实现 代码实现 快速排序 基本思想 快速排序的实现 图片实现 代码实现 选择排序 基本思想 每一次从待排序的数据元素中选出最小(最大)的元素,存放在序列的起始位置,直到全部…...

得物面试:Redis用哈希槽,而不是一致性哈希,为什么?
尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: Redis为何用哈希槽而不用一致性哈希? 最近…...

matlab发送串口数据,并进行串口数据头的添加,我们来看下pwm解析后并通过串口输出的效果
uintt16位的话会在上面前面加上00,16位的话一定是两个字节,一共16位的数据 如果是unint8的话就不会, 注意这里给的是13,但是现实的00 0D,这是大小端的问题,在matlanb里设置,我们就默认用这个模式…...

二分、快排、堆排与双指针
二分 int Binary_Search(vector<int> A,int key){int nA.size();int low0,highn-1,mid;while(low<high){mid(lowhigh)/2;if(A[mid]key)return mid;else if(A[mid]>key)highmid-1;elselowmid1; }return -1; }折半插入排序 ——找到第一个 ≥ \ge ≥tem的元素 voi…...

微信小程序步数返还的时间戳为什么返回的全是1970?
微信小程序步数返还的时间戳为什么返回的全是1970? 将返回的时间 乘以 1000 再 new Date() 转化就对了 微信返回的是秒S单位的,我们要转化为毫秒ms单位,才能进行格式化日期。 微信给我们下了个坑, 参考: https://d…...

Python函数——函数介绍
一、引言 在Python编程中,函数是构建高效代码的关键。通过创建可重用的代码块,我们可以使程序更加清晰、易读且易于维护。在本文中,我们将深入了解Python函数的基本概念及其特性。 二、Python函数的基本概念 函数是一段具有特定功能的代码块…...

【Linux系统化学习】文件重定向
目录 文件内核对象 文件描述符的分配规则 重定向 重定向的概念 dup2系统调用 输出重定向 追加重定向 输入重定向 stderr解析 重定向到同一个文件中 分离常规输出和错输出 文件内核对象 上篇文章中我们介绍到了操作系统中的文件,操作系统为了方…...

防火墙工作模式详解
防火墙工作模式是指防火墙在网络中的工作方式和策略。常见的防火墙工作模式包括以下几种: 1. 包过滤工作模式:根据事先确定的规则集合,对进出网络的网络包进行过滤和检查。根据规则,防火墙可以允许或阻止特定的网络流量。 2. 代…...

CCF编程能力等级认证GESP—C++6级—20231209
CCF编程能力等级认证GESP—C6级—20231209 单选题(每题 2 分,共 30 分)判断题(每题 2 分,共 20 分)编程题 (每题 25 分,共 50 分)闯关游戏工作沟通 答案及解析单选题判断题编程题1编程题2 单选题…...

ES6 ~ ES11 学习笔记
课程地址 ES6 let let 不能重复声明变量(var 可以) let a; let b, c, d; let e 100; let f 521, g "atguigu", h [];let 具有块级作用域,内层变量外层无法访问 let 不存在变量提升(运行前收集变量和函数&#…...

001 - Hugo, 创建一个网站
001 - Hugo, 创建一个网站安装hugoWindows系统Macos Hugo博客搭建初始化博客主题安装配置博客各个页面开始创作创建 GitHub Page 仓库本地调试和预览发布内容 教程及鸣谢文字教程视频教程 001 - Hugo, 创建一个网站 这篇文章假设你已经: 了解基本的终端命令行知识&…...

前端开发:Vue框架与前端部署
Vue Vue是一套前端框架,免除原生)avaScript中的DOM操作,简化书写。是基于MVVM(Model–View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上。简单来说,就是数据变化的时候, 页面会自动刷新, 页面变化的时…...

【leetcode】深搜、暴搜、回溯、剪枝(C++)3
深搜、暴搜、回溯、剪枝(C)3 一、解数独1、题目描述2、代码3、解析 二、单词搜索1、题目描述2、代码3、解析 三、黄金矿工1、题目描述2、代码3、解析 四、不同路径III1、题目描述2、代码3、解析 一、解数独 1、题目描述 leetcode链接 2、代码 class…...

社区养老|社区养老服务系统|基于springboot社区养老服务系统设计与实现(源码+数据库+文档)
社区养老服务系统目录 目录 基于springboot社区养老服务系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员部分功能 (1) 用户管理 (2)服务种类管理 (3)社区服务管理 (…...

云计算基础-存储虚拟化(深信服aSAN分布式存储)
什么是存储虚拟化 分布式存储是利用虚拟化技术 “池化”集群存储卷内通用X86服务器中的本地硬盘,实现服务器存储资源的统一整合、管理及调度,最终向上层提供NFS、ISCSI存储接口,供虚拟机根据自身的存储需求自由分配使用资源池中的存储空间。…...

数学实验第三版(主编:李继成 赵小艳)课后练习答案(十二)(3)
实验十二:微分方程模型 练习三 1.分别用数值解命令ode23t和ode45 计算示例3中微分方程的数值解,同用命令ode23 算得的数值解以及解析解比较,哪种方法精度较高?你用什么方法比较它们之间的精度? clc;clear; f(x,y)2*yx2; figure(1) [x,y]ode23t(f,[1,2],1); plo…...

CSS Transition:为网页元素增添优雅过渡效果
随着互联网的发展,网页的视觉效果和用户体验变得尤为重要。CSS Transition作为一种能够让网页元素在状态改变时呈现平滑过渡效果的工具,受到了广大前端开发者的青睐。本文将详细介绍CSS Transition的基本概念、使用方法以及常见应用,帮助读者…...

JDK 17 新特性 (一)
既然 Springboot 3.0 强制使用 JDK 17 那就看看 JDK17 有哪些新特性吧 参考链接 介绍一下 新特性的历史渊源 JDK 17是Java Development Kit(JDK)的一个版本,它是Java编程语言的一种实现。JDK 17于2021年9月14日发布,并作为Java …...

杨中科 ASP.NET DI综合案例
综合案例1 需求说明 1、目的:演示DI的能力; 2、有配置服务、日志服务,然后再开发一个邮件发送器服务。可以通过配置服务来从文件、环境变量、数据库等地方读取配置,可以通过日志服务来将程序运行过程中的日志信息写入文件、控制台、数据库等。 3、说明…...

蓝桥杯嵌入式第12届真题(完成) STM32G431
蓝桥杯嵌入式第12届真题(完成) STM32G431 题目 程序 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body**************************…...