当前位置: 首页 > news >正文

Java传输本地目录到远程服务器

在使用Java进行开发时,有时需要将本地目录中的文件复制或传输到远程服务器上。这种场景在部署应用程序或进行数据迁移时尤为常见。JSch库提供了一种简便的方法来实现这一功能。以下是从Codekru网站获取的信息摘要,并结合相关内容,展示如何使用JSch库实现从本地计算机复制整个目录到远程服务器的过程。

准备工作

首先,确保您的项目中已经包含了JSch库的依赖。如果您使用Maven作为构建工具,可以在pom.xml文件中添加如下依赖:

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

连接到远程服务器

在传输文件之前,需要先建立与远程服务器的SSH连接。以下是一个简单的连接示例:

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

public class DirectoryTransferExample {

    public static void main(String[] args) {
        try {
            JSch jsch = new JSch();
            String user = "codekru"; // 您的用户名
            String host = "127.0.0.1"; // 您的远程服务器地址
            int port = 22; // 默认SSH端口
            String key = "/path/to/your/privatekey.pem"; // 您的私钥路径

            jsch.addIdentity(key);
            
            Session session = jsch.getSession(user, host, port);
            session.setConfig("StrictHostKeyChecking", "no");
            session.setTimeout(15000); // 设置超时时间
            session.connect();

            System.out.println("Connected");

            // 打开SFTP通道
            ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
            sftpChannel.connect();

            // 定义本地目录路径和远程目录路径
            String localDirPath = "/local/path/to/directory"; // 本地目录路径
            String remoteDirPath = "/remote/path/to/directory"; // 远程目录路径

            // 创建远程目录(如果不存在)
            createRemoteDirectory(sftpChannel, remoteDirPath);

            // 递归复制本地目录中的所有文件到远程目录
            copyDirectory(sftpChannel, localDirPath, remoteDirPath);

            // 关闭SFTP通道
            sftpChannel.disconnect();

            // 断开SSH连接
            session.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void createRemoteDirectory(ChannelSftp sftpChannel, String remotePath) throws SftpException {
        try {
            sftpChannel.cd(remotePath);
        } catch (SftpException ex) {
            if (ex.id == ChannelSftp.SSH_FX_NO_SUCH_FILE) {
                sftpChannel.mkdir(remotePath);
                sftpChannel.cd(remotePath);
            } else {
                throw ex;
            }
        }
    }

    private static void copyDirectory(ChannelSftp sftpChannel, String localDirPath, String remoteDirPath) throws SftpException {
        java.io.File dir = new java.io.File(localDirPath);
        if (dir.exists() && dir.isDirectory()) {
            java.io.File[] files = dir.listFiles();
            if (files != null) {
                for (java.io.File file : files) {
                    if (file.isDirectory()) {
                        String newRemotePath = remoteDirPath + "/" + file.getName();
                        createRemoteDirectory(sftpChannel, newRemotePath);
                        copyDirectory(sftpChannel, file.getAbsolutePath(), newRemotePath);
                    } else {
                        sftpChannel.put(file.getAbsolutePath(), remoteDirPath + "/" + file.getName());
                    }
                }
            }
        }
    }
}

解释代码

这段代码实现了以下几个功能:

  1. 建立SSH连接:使用JSch库建立SSH连接。
  2. 创建远程目录:如果远程服务器上的目标目录不存在,则创建它。
  3. 递归复制目录:递归遍历本地目录中的所有子目录和文件,并将它们复制到远程服务器上对应的目录中。

主要步骤

  1. 初始化JSch对象:创建一个新的JSch对象,并使用私钥进行身份验证。
  2. 建立Session:使用用户的凭据建立一个Session对象,并设置必要的配置项。
  3. 打开SFTP通道:通过Session对象打开一个ChannelSftp类型的通道。
  4. 创建远程目录:如果远程服务器上的目标目录不存在,则创建它。
  5. 递归复制目录:遍历本地目录中的所有文件和子目录,将它们复制到远程服务器上对应的目录中。
  6. 关闭SFTP通道和Session:完成文件传输后,关闭SFTP通道和Session,释放资源。

注意事项

  • 确保您拥有足够的权限来创建远程目录和上传文件。
  • 如果使用的是密码而不是私钥进行身份验证,可以相应地修改代码中的认证部分。
  • 在实际使用中,建议添加更多的错误处理逻辑来确保程序的健壮性。

通过上述示例,您可以了解如何使用JSch库在远程服务器上执行目录的复制操作。无论是简单的文件上传还是复杂的目录结构迁移,都可以按照上述步骤实现。记得在实际使用中替换示例中的占位符为真实的用户名、IP地址、端口号、私钥路径以及目录路径。

相关文章:

  • WSL 在 Windows 上删除已经安装的 Ubuntu | WSL 再次重装 Ubuntu | cv2.imshow() 弹窗支持
  • Java语言的Netty框架+云快充协议1.5+充电桩系统+新能源汽车充电桩系统源码
  • 基于FreeRTOS的STM32多功能手表
  • Java Spring Boot 项目中的密码加密与验证开发案例手册
  • Redis集群
  • C++11 ---- 右值引用和移动语义
  • SpringBoot依赖之Spring Boot DevTools热部署开发增效工具
  • 【Spring Boot 3】【Web】解析获取HTTP请求参数
  • 2. 卷积神经网络(CNN):图像识别的核心技术
  • MySQL 数据库管理与操作指南
  • k8s集群本地搭建,使用gitlab、harbor、jenkens、cicd来实现devops自动化构建
  • c++中析构函数是否一定要为虚函数
  • 轴承知识大全,详细介绍(附3D图纸免费下载)
  • APP长文本内容编辑器功能实现方案
  • Linux 一个简单的中断信号实现
  • 【网络安全 | 渗透工具】Cencys+Shodan使用教程
  • 【C语言】---- 位操作处理
  • KCP实现原理探析
  • 【python计算机视觉编程——4.照相机模型与增强现实】
  • 【操作系统】线程同步之自旋锁
  • 特朗普声称中方领导人打了电话,外交部:近期中美元首没有通话
  • 淮安四韵·名城新章: 网络名人领略“运河之都”魅力
  • 俄外长与美国务卿通电话,讨论俄美关系及乌克兰问题
  • 中国海警局新闻发言人就菲律宾非法登临铁线礁发表谈话
  • 铁路上海站五一假期预计发送446万人次,同比增长8.4%
  • 2025年全国贸易摩擦应对工作会议在京召开