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 不存在变量提升(运行前收集变量和函数&#…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...