Jsch上传本地目录文件到服务器

文章目录

  • 1.Jsch简介
    • 1.1 什么是Jsch
    • 1.2 Jsch使用步骤和简单示例
  • 2.技术关键点
  • 3.Jsch实战
    • 3.1 maven依赖
    • 3.2 功能实现
    • 3.3 效果
    • 3.4 封装工具类
  • 4.总结

摘要: 在一些框架开发工作中,需要为项目使用说明文档,来指导用户如何正确使用框架。比如通过markdown编写文档,同时将文档及图片等静态资源发布到nginx服务器。往往采用编译时候结合cicd脚本一起构建,推送服务器,但无法满足日常研发实时发布需要,本文介绍通过Jsch复制本地文件目录,到资源服务器得方法。

关键词: jsch;目录上传

1.Jsch简介

1.1 什么是Jsch

Jsch 是 Java Secure Channel 的缩写,是一个纯 Java 实现的 SSH2 协议客户端库。它允许在 Java 应用程序中建立与 SSH 服务器的安全连接,并进行文件传输、远程命令执行等操作.
以下是一些Jsch的主要特点和技术应用:

  1. SSH 连接:JSch 支持通过多种身份验证方法(如密码认证、公钥认证等)建立到 SSH 服务器的安全连接。
  2. 文件传输:JSch 实现了 SCP(Secure Copy)和 SFTP(SSH File Transfer Protocol)协议,允许在本地计算机和远程服务器之间进行文件的上传、下载和管理。
  3. 远程命令执行:JSch 允许在远程服务器上执行命令,可以通过打开远程 Shell 会话来执行命令并获取输出或处理错误。
  4. 端口转发:JSch 支持端口转发功能,可以将本地端口与远程端口关联,用于安全通信和访问受限资源。

1.2 Jsch使用步骤和简单示例

使用Jsch进行SSH连接和执行远程命令的一般步骤如下:

  1. 导入Jsch库: 首先需要将Jsch库添加到Java项目的依赖中。
  2. 创建Session对象: 使用Jsch库创建一个Session对象,该对象表示与远程服务器的会话。需要指定远程服务器的主机名、用户名和密码或者SSH密钥等认证信息。
  3. 连接到远程服务器: 调用Session对象的connect方法来连接到远程服务器。
  4. 创建Channel对象: 使用Session对象创建一个Channel对象,该对象表示与远程服务器的通信通道,可以是执行远程命令的Shell通道或者用于文件传输的SFTP通道等。
  5. 打开Channel: 调用Channel对象的open方法来打开通道。
  6. 执行操作: 根据需要执行相应的操作,例如执行远程命令、上传或下载文件等。
  7. 关闭通道和会话: 操作完成后,需要关闭Channel和Session对象,释放资源

下面是一个简单的示例代码,演示了如何使用Jsch连接到远程服务器并执行一个简单的命令:

import com.jcraft.jsch.*;public class SSHExample {public static void main(String[] args) {String host = "remote_host";String user = "username";String password = "password";String command = "ls -l";try {// 创建JSch对象JSch jsch = new JSch();// 创建Session对象Session session = jsch.getSession(user, host, 22);// 设置密码session.setPassword(password);// 取消默认的HostKey检查session.setConfig("StrictHostKeyChecking", "no");// 连接到远程服务器session.connect();// 打开通道Channel channel = session.openChannel("exec");// 设置命令((ChannelExec) channel).setCommand(command);// 获取输入流channel.setInputStream(null);// 获取输出流((ChannelExec) channel).setErrStream(System.err);// 连接通道channel.connect();// 读取命令输出InputStream in = channel.getInputStream();byte[] buffer = new byte[1024];while (true) {while (in.available() > 0) {int bytesRead = in.read(buffer, 0, 1024);if (bytesRead < 0) break;System.out.print(new String(buffer, 0, bytesRead));}if (channel.isClosed()) {if (in.available() > 0) continue;System.out.println("Exit Status: " + channel.getExitStatus());break;}try {Thread.sleep(1000);} catch (Exception ee) {}}// 关闭通道和会话channel.disconnect();session.disconnect();} catch (JSchException | IOException e) {e.printStackTrace();}}
}

2.技术关键点

使用jsch的sftp功能实现单文件上传难度不大,而本地目录上传问题本质上是多目录多的文件批量上传文件问题,需要额外考虑细节问题如下:

  1. 服务器目标根目录,不一定存在存在,需要创建。
  2. 本地目录中还包含子目录,需要在父级目录中上传文件,同时判断子目录。

流程如下:

2.复制本地文件到远程目录
是否是文件
读取文件/目录
创建远程相对目录
上传文件到远程相对目录
遍历文件/子目录递归
开始
连接到目标主机
打开SFTP通道
1.创建目标远程目录
关闭连接
结束

3.Jsch实战

3.1 maven依赖

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

3.2 功能实现

v1.0 基础可以用版本

import com.jcraft.jsch.*;import java.io.File;public class LocalToRemoteFileCopy {public static void main(String[] args) {String localPath = "D:\\git\\demo\\note_codeup\\docs";String remotePath = "/root/test/docker-compose-nginx/data/docs";String hostname = "192.168.100.4";int port = 22;String username = "root";String password = "123456";copyLocalToRemote(localPath, remotePath, hostname, port, username, password);}private static void copyLocalToRemote(String localPath, String remotePath, String hostname, int port,String username, String password) {JSch jsch = new JSch();Session session = null;ChannelSftp channelSftp = null;try {// 连接到目标主机session = jsch.getSession(username, hostname, port);session.setPassword(password);session.setConfig("StrictHostKeyChecking", "no");session.connect();// 打开目标主机的 SFTP 通道Channel channel = session.openChannel("sftp");channel.connect();channelSftp = (ChannelSftp) channel;// 递归创建远程目录(如果不存在)createRemoteDirectories(channelSftp, remotePath);// 从本地复制文件到目标主机copyLocalDirectory(new File(localPath), channelSftp, remotePath);// 关闭连接channelSftp.disconnect();session.disconnect();} catch (JSchException | SftpException e) {e.printStackTrace();}}// 递归创建远程目录(如果不存在)private static void createRemoteDirectories(ChannelSftp channelSftp, String remoteDirectory) throws SftpException {String[] dirs = remoteDirectory.split("/");String currentDir = "/";for (String dir : dirs) {if (!dir.isEmpty()) {currentDir += dir + "/";try {channelSftp.stat(currentDir); // 检查目录是否存在} catch (SftpException e) {// 目录不存在,创建目录channelSftp.mkdir(currentDir);}}}}// 递归上传本地文件到远程目录private static void copyLocalDirectory(File localFile, ChannelSftp channelSftp, String remotePath)throws SftpException {if (localFile.isDirectory()) {// 获取本地目录下的所有文件和子目录File[] files = localFile.listFiles();if (files != null) {for (File file : files) {copyLocalDirectory(file, channelSftp, remotePath + "/" + localFile.getName());}}} else if (localFile.isFile()) {// 上传文件,并递归创建远程目录(如果不存在)createRemoteDirectories(channelSftp, remotePath);System.out.println(localFile.getAbsolutePath() + " ==> " + remotePath + "/" + localFile.getName());channelSftp.put(localFile.getAbsolutePath(), remotePath + "/" + localFile.getName());}}
}

3.3 效果

image.png

3.4 封装工具类

import com.jcraft.jsch.*;import java.io.File;public class SftpUtils {public static void copyLocalToRemote(String localPath, String remotePath, String hostname, int port,String username, String password) {JSch jsch = new JSch();Session session = null;ChannelSftp channelSftp = null;try {// 连接到目标主机session = jsch.getSession(username, hostname, port);session.setPassword(password);session.setConfig("StrictHostKeyChecking", "no");session.connect();// 打开目标主机的 SFTP 通道Channel channel = session.openChannel("sftp");channel.connect();channelSftp = (ChannelSftp) channel;// 递归创建远程目录(如果不存在)createRemoteDirectories(channelSftp, remotePath);// 从本地复制文件到目标主机copyLocalDirectory(new File(localPath), channelSftp, remotePath);// 关闭连接channelSftp.disconnect();session.disconnect();} catch (JSchException | SftpException e) {e.printStackTrace();}}// 递归创建远程目录(如果不存在)private static void createRemoteDirectories(ChannelSftp channelSftp, String remoteDirectory) throws SftpException {String[] dirs = remoteDirectory.split("/");String currentDir = "/";for (String dir : dirs) {if (!dir.isEmpty()) {currentDir += dir + "/";try {channelSftp.stat(currentDir); // 检查目录是否存在} catch (SftpException e) {// 目录不存在,创建目录channelSftp.mkdir(currentDir);}}}}// 递归上传本地文件到远程目录private static void copyLocalDirectory(File localFile, ChannelSftp channelSftp, String remotePath)throws SftpException {if (localFile.isDirectory()) {// 获取本地目录下的所有文件和子目录File[] files = localFile.listFiles();if (files != null) {for (File file : files) {copyLocalDirectory(file, channelSftp, remotePath + "/" + localFile.getName());}}} else if (localFile.isFile()) {// 上传文件,并递归创建远程目录(如果不存在)createRemoteDirectories(channelSftp, remotePath);System.out.println(localFile.getAbsolutePath() + " ==> " + remotePath + "/" + localFile.getName());channelSftp.put(localFile.getAbsolutePath(), remotePath + "/" + localFile.getName());}}
}

4.总结

本文通过分析,使用jsch技术实现本地文件目录整体拷贝至服务器指定目录需求,分析关键步骤以及实现细节,并最终封装工具类。为后续实现,静态资源发布部署,文件目录定时同步功能,提供技术实现支撑。

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

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

相关文章

一文搞懂阻塞赋值和非阻塞赋值

目录 2.非阻塞赋值举例3.阻塞赋值举例4.总结 微信公众号获取更多FPGA相关源码&#xff1a; # 1.阻塞赋值和非阻塞赋值的区别&#xff1a; (1)阻塞赋值""&#xff0c;必须是阻塞赋值完成后&#xff0c;才进行下一条语句的执行&#xff1b;赋值一旦完成&#xff0c;等号…

pytest+requests+allure自动化测试接入Jenkins学习

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 最近在这整理知识&#xff0c;发现在pytest的知识文档缺少系统性&#xff0c;这里整理一下&…

陕西移动联合中兴通讯,赋能5G RedCap智慧工厂建设

前不久&#xff0c;陕西移动联合中兴通讯、高新兴等产业伙伴在中兴通讯西安智能终端生产基地顺利完成5G RedCap在智慧工厂的应用实践。本次实践证明了5G RedCap在智慧工厂场景下的应用可行性&#xff0c;为RedCap在工业智能制造行业的应用打下基础。   5G RedCap技术是5G-A实现…

【cocos creator 3.x】 修改builtin-unlit 加了一个类似流光显示的mask参数

效果见图&#xff1a; shader 代码修改如下&#xff0c; 主要看 USE_MASK_UVY 关键字部分修改&#xff1a; // Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd. CCEffect %{techniques:- name: opaquepasses:- vert: unlit-vs:vertfrag: unlit-fs:fragproperties: &a…

Linux-centos7 nvm使用

NVM下载使用 文件夹创建拉取nvm包在~/.bashrc的末尾&#xff0c;添加如下语句验证nvm是否安装成功 文件夹创建 mkdir /root/home/software/拉取nvm包 cd /root/home/software/ wget https://github.com/nvm-sh/nvm/archive/refs/tags/v0.38.0.tar.gz tar xvzf v0.38.0.tar.g…

MyBatis-Plus整合达梦数据库

文章目录 1. 环境准备2. 创建Spring Boot项目3. 引入依赖4. 配置数据源5. 配置MyBatis-Plus6. 创建实体类7. 创建Mapper接口8. 创建Service类9. 创建Controller类10. 创建Mapper XML文件11. 测试12. 进一步优化12.1 配置分页插件12.2 配置乐观锁插件13. 总结🎉欢迎来到Java学…

【Linux】常见指令的使用

文章目录 which指令stat 指令wc指令echo指令tree 指令whoami指令clear指令alias指令ls指令pwd指令cd 指令touch指令mkdir指令&#xff08;重要&#xff09;rmdir指令 && rm 指令&#xff08;重要&#xff09;man指令&#xff08;重要&#xff09;cp指令&#xff08;重要…

Java课程设计:基于swing的贪吃蛇小游戏

文章目录 一、项目介绍二、核心代码三、项目展示四、源码获取 一、项目介绍 贪吃蛇是一款经典的休闲益智游戏,自问世以来便深受广大用户的喜爱。这个游戏的基本玩法是控制一条不断增长的蛇,目标是吃掉屏幕上出现的食物,同时避免撞到边缘或自身。随着游戏的进行,蛇的身体会越长…

Burp Suite使用及BruteForc_test靶场实战

简介 Burp Suite是用于攻击和测试Web应用程序安全性的集成平台&#xff0c;包含多个协同工作的工具&#xff0c;支持信息共享与复杂攻击。设计有加速攻击流程的接口&#xff0c;所有工具共享强大框架&#xff0c;处理HTTP消息、持久性、认证、代理、日志和警报。主要用于安全性…

grpc代理服务的实现(一)

最近公司需要无感知基于服务代号来实现通信, 并监控和管理通信连接&#xff0c;目前公司使用的是如下的逻辑(当然逻辑简化了&#xff0c;但是思想不变) 目录 简单的原理图代理服务的实现创建 tls tcp 服务, 用于grpc client 和 grpc service 通信保存 与 代理服务建立的 grpc …

Codeforces Round 926 (Div. 2)(A~C题解)

A题是个签到题&#xff0c;BC思维题目&#xff0c;搞出来结论就秒了&#xff0c;D题是个树上DP由于现在水平薄弱还没做出来&#xff0c;以后补上 A. Sasha and the Beautiful Array 思路给数组排序&#xff0c;然后后项减前项&#xff0c;累加值就是最终结果&#xff0c;签到题…

AI 大模型的赛点:通用与垂直之争

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

短视频矩阵源码---矩阵托管1000个账号如何正规开发规则实现

一、短视频矩阵源码开发实现规则&#xff1a; 1.首先是确保各个官方平台api接口的稳定性&#xff0c;一定要是各个平台正规的api 2.其次是保证服务器运行&#xff0c;带宽保证能够并行&#xff0c;目前我们这边用的是源码所需服务器配置&#xff1a;规格:最低8核16G2、硬盘:系…

GIS之arcgis系列10:arcpy实现批量掩膜提取

按掩膜提取 (Spatial Analyst) 提取掩膜所定义区域内的相应栅格像元。 OutRas ExtractByMask(InRas1, InMsk1, "INSIDE") 使用情况 输入栅格中的其他属性&#xff08;若有的话&#xff09;将按照原样添加到输出栅格属性表。 根据所记录的属性&#xff0c;某些属性…

【NLP练习】Transformer中的位置编码

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、什么是位置编码 1. 位置编码定义 Transformer 模型中的位置编码是为了在处理序列数据时引入位置信息&#xff0c;以便模型能够分辨输入序列中不同位置的词…

蓝卓为中小制造企业注入数字化转型活力

随着劳动力成本上升,原材料价格上涨,企业生产成本逐年增加&#xff0c;市场竞争越来越激烈&#xff0c;传统的中小制造企业面临着巨大的压力。 通过数字化转型应对环境的变化已成为行业共识&#xff0c;在数字化的进程中&#xff0c;中小企业首要考虑生存问题&#xff0c;不能…

Kubernetes集群持久化部署实践

WordPress 网站持久化部署 要持久化MariaDB 可以把 Deployment 改成了 StatefulSet&#xff0c;修改 YAML添加“serviceName”“volumeClaimTemplates”这两个字段&#xff0c;定义网络标识和 NFS 动态存储卷&#xff0c;然后在容器部分用“volumeMounts”挂载到容器里的数据目…

八 、VS的调试技巧

--- 24.4.20 目录 1、什么是Bug&#xff1f; 2、什么是调试&#xff08;Debug&#xff09;&#xff1f; 3、Debug和Release 4、VS基础调试快捷键 4.1、环境准备 4.2、调试快捷键 5、监视和内存观察 5.1、监视窗口 5.2、内存窗口 6、调试举例1 7、调试举例2 8、调试…

旅行者1号有什么秘密?飞行240多亿公里,为什么没发生碰撞?

旅行者1号有什么秘密&#xff1f;飞行240多亿公里&#xff0c;为什么没发生碰撞&#xff1f; 自古以来&#xff0c;人类就对浩瀚无垠的宇宙充满了好奇与向往。从最初的仰望星空&#xff0c;到如今的深空探测&#xff0c;人类探测宇宙的历史发展可谓是一部波澜壮阔的史诗。 在…

双指针练习:有效三角形的个数

题目链接&#xff1a;611.有效三角形的个数 题目描述&#xff1a; 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 解法一&#xff08;暴力求解&#xff09;&#xff08;会超时&#xff09;&#xff1a; 算法思路&#xff1a; 三层…