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


<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.0modelVersion>

    <groupId>com.yuangroupId>
    <artifactId>yuan-connect-linuxartifactId>
    <version>1.0.0version>

    <properties>
        <maven.compiler.source>8maven.compiler.source>
        <maven.compiler.target>8maven.compiler.target>
    properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <version>1.18.24version>
        dependency>
        <dependency>
            <groupId>org.apache.commonsgroupId>
            <artifactId>commons-lang3artifactId>
            <version>3.12.0version>
        dependency>
        <dependency>
            <groupId>com.jcraftgroupId>
            <artifactId>jschartifactId>
            <version>0.1.55version>
        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();
            }
        }
    }
}

你可能感兴趣的:(Java17,Linux,java,linux,JSch)