JSch连接Sftp使用说明

简介: 前言最近在公司需要通过SSH然后对SFTP连接,然后进行操作,所以在这里记录一下,方便自己以后使用,也方便给大家作为参考。正文首先得需要对JSch进行依赖引用,项目由gradle进行搭建。

前言

最近在公司需要通过SSH然后对SFTP连接,然后进行操作,所以在这里记录一下,方便自己以后使用,也方便给大家作为参考。

正文

首先得需要对JSch进行依赖引用,项目由gradle进行搭建。
以下是build.gradle 代码:

// https://mvnrepository.com/artifact/com.jcraft/jsch
compile group: 'com.jcraft', name: 'jsch', version: '0.1.54'

然后需要一个实体类,用来配置我们的JSch的相关参数。
Tips:公司使用的是AWS,参数都是配置在ECS里的。所以我需要从环境变量里取出相应的值,大家可以自行修改成 hard code。
实体类:

public class SftpConfigProperties {

    public static final String environment=System.getenv("PUBLISHER_ENVIRONMENT");

    public static final String sftpUsername=System.getenv("PUBLISHER_SFTP_USERNAME");

    public static final String sftpHost=System.getenv("PUBLISHER_SFTP_HOST");

    public static final int sftpPort=Integer.valueOf(System.getenv("PUBLISHER_SFTP_PORT"));

    public static final String sftpPassword=System.getenv("PUBLISHER_SFTP_PASSWORD");

    public static final String sftpFilePath="/"+environment+"/dir_publisher_sftp";
}

最后,最重要的是jsch的主类:
代码如下:

package com.harry.jsch;

import com.jcraft.jsch.*;
import com.kingland.dst.config.SftpConfigProperties;
import org.apache.log4j.Logger;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Vector;

/**
 * this method is used to connect to sftp with jsch
 */
public class SftpConnectUtil {
    private  static Logger logger=Logger.getLogger(SftpConnectUtil.class);

    /**
     * 这个方法用来连接到sftp
     * @param ip
     * @param user
     * @param password
     * @param port
     * @return session
     */
    public  Session connect(String ip,String user,String password,int port){
        logger.info("start to connect to sftp");
        Session session=null;
        JSch jsch=new JSch();
        try {
            //给出连接需要的用户名,ip地址以及端口号
            session=jsch.getSession(user, ip, port);
            //第一次登陆时候,是否需要提示信息,value可以填写 yes,no或者是ask
            session.setConfig("StrictHostKeyChecking", "no");
           //设置是否超时
             session.setTimeout(10000);
           //设置密码
            session.setPassword(password);
            //创建连接
            session.connect();
            logger.info("sftp session set properties success");
        } catch (JSchException e) {
            e.printStackTrace();
        }
        if(session == null) {
            logger.error("session is null");
        }else if(session.isConnected() == true) {
            logger.info("connet to sftp server is successful");
        }
        return session;
    }

    /**
     * 这个方法用来上传文件
     * @param session
     * @param filePath
     * @param fileName
     */
    public  void uploadFile(Session session,String filePath,String fileName) {
        ChannelSftp channel =null;
        String filePathName=filePath+File.separator+fileName;
        FileInputStream fis =null;
        try {
            fis = new FileInputStream(new File(filePathName));
            // 创建连接的形式,这里是sftp
            channel =(ChannelSftp)session.openChannel("sftp");
            channel.connect();
            channel.cd(SftpConfigProperties.sftpFilePath);
            channel.put(fis, fileName);
            channel.exit();
            fis.close();
        } catch (JSchException e) {
            e.printStackTrace();
        } catch (SftpException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //这个方法用来删除sftp上对应的文件
    //ls方法是用来将制定文件夹下的文件名都给取出来
    //遍历之后,拿到文件名进行删除,可以在删除前,给出判断条件,或者是制定文件名
    public void deleteExpireFile(ChannelSftp channel){
        Vector vector=channel.ls(SftpConfigProperties.sftpFilePath);
        for(Object obj:vector){
            if(obj instanceof ChannelSftp.LsEntry){
                String fileName=((ChannelSftp.LsEntry) obj).getFilename();
                if (".".equals(fileName) || "..".equals(fileName)) {
                    continue;
                }
                channel.rm(fileName);
                logger.info("success delete the file :"+SftpConfigProperties.sftpFilePath+File.separator+fileName);
            }
        }
    }
}

最后

谢谢大家的观看,希望可以帮助到大家

目录
相关文章
|
存储 SQL 监控
关系型数据库. 基本的DELETE语句
`SQL DELETE` 语句用于从表中删除记录,基本格式为 `DELETE FROM 表名 WHERE 条件`。`WHERE` 子句可选,指定删除特定记录。例如,`DELETE FROM students WHERE age > 20;` 将删除年龄大于 20 的学生。执行前注意备份,总是使用 `WHERE` 子句以避免误删,并考虑在事务中执行以保证数据安全。大量删除可能影响性能,需谨慎操作。还要留意可能存在的触发器影响。
503 2
|
消息中间件 传感器 搜索推荐
|
3月前
|
前端开发 Java 数据库连接
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
|
7月前
|
存储 人工智能 NoSQL
通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制
MongoDB Atlas 的向量搜索功能为语义搜索和 RAG 提供了一个高效的数据库管理平台。在这个全新的应用场景下,Atlas 的向量检索能力支持开发者实现高效的知识检索和增强型生成应用,使其在智能客服、知识问答、个性化推荐等场景中大放异彩。结合生成式模型的 RAG 应用,MongoDB Atlas 提供了从数据存储到智能生成的完整解决方案,展现出其在现代应用中的巨大潜力。希望本文能够帮助大家更好地理解 MongoDB Atlas 的语义搜索功能和 RAG 的实际应用。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点
通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制
|
12月前
|
调度
【LVGL快速入门】LVGL开源框架入门教程之框架移植(四)
【LVGL快速入门】LVGL开源框架入门教程之框架移植(四)
688 3
深入解析802.11g标准及其频率范围
【8月更文挑战第24天】
492 0
|
网络安全 数据安全/隐私保护 Windows
freeSSHd工具安装使用
【5月更文挑战第21天】freeSSHd工具安装使用
2840 2
|
Java Nacos Spring
SpringCloud之LoadBalancer负载均衡器的简单使用
RoundRobin: 轮询策略,意思循环往复的的服务进行选取。
1022 0
|
消息中间件 SQL Java
Spring-cloud-stream-binder-rocketmq入门与实践
本场景带您体验如何在 Spring 生态中优雅地使用 Apache RocketMQ,感受最受欢迎业务开发框架与最受欢迎消息平台结合的魅力。
|
消息中间件 安全 IDE
Fastjson官方再次披露高危漏洞,包括rocketmq、jeecg-boot等近15%的github开源项目受影响
Fastjson官方再次披露高危漏洞,包括rocketmq、jeecg-boot等近15%的github开源项目受影响
Fastjson官方再次披露高危漏洞,包括rocketmq、jeecg-boot等近15%的github开源项目受影响