首页 > 其他分享 >sftp文件上传下载方法

sftp文件上传下载方法

时间:2024-07-29 11:39:08浏览次数:6  
标签:文件 String 上传下载 SFTP host session sftp port

随着信息化、数字化的发展,企业对数据安全及应用安全意识普遍加强,在数据文件传输过程中,一般建议使用sftp协议进行文件传输,sftp文件操作脚本如下:

sftp操作主要有三种方式,分别是sftp客户端操作、sdk操作、操作系统命令操作,针对sdk方式。

一、sdk方式:

<!-- sftp集成jar -->
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>
public class SftpUtils {

    private static final Logger logger = LoggerFactory.getLogger(SftpUtils.class);
    private static final String SESSION_CONFIG_STRICT_HOST_KEY_CHECKING = "StrictHostKeyChecking";


    /**
     * 创建SFTP连接
     * @return
     * @throws Exception
     */
    public static ChannelSftp createSftp(String username,String password,String host,int port) throws Exception {
        JSch jsch = new JSch();
        logger.info(("Try to connect sftp" + username + "@" + host + "], use password[" + password));

        Session session = createSession(jsch,host, username, port);
        session.setPassword(password);
        session.connect(15000);

        logger.info("Session connected to {"+  host);

        Channel channel = session.openChannel("sftp");
        channel.connect();

        logger.info("Channel created to"+  host);

        return (ChannelSftp) channel;
    }
    /**
     * 创建session
     * @param jsch
     * @param host
     * @param username
     * @param port
     * @return
     * @throws Exception
     */
    private static Session createSession(JSch jsch, String host, String username, Integer port) throws Exception {
        Session session = null;

        if (port <= 0) {
            session = jsch.getSession(username, host);
        } else {
            session = jsch.getSession(username, host, port);
        }

        if (session == null) {
            throw new Exception(host + " session is null");
        }
        session.setConfig(SESSION_CONFIG_STRICT_HOST_KEY_CHECKING, "no");
        return session;
    }

    /**
     * 关闭连接
     * @param sftp
     */
    public static void disconnect(ChannelSftp sftp) {
        try {
            if (sftp != null) {
                if (sftp.isConnected()) {
                    sftp.disconnect();
                } else if (sftp.isClosed()) {
                    //log.info("sftp is closed already");
                    System.out.println("sftp is closed already");
                }
                if (null != sftp.getSession()) {
                    sftp.getSession().disconnect();
                }
            }
        } catch (JSchException e) {
            e.printStackTrace();
        }
    }

    public static void download(String sftpUrl, String localFilePath, String sftpUsername, String sftpPassword, String sftpControlEncoding,String host,String port,String fileName) throws Exception {
        String username = StringUtils.isEmpty(sftpUsername) ? ConfigConstants.getSftpUsername() : sftpUsername;
        String password = StringUtils.isEmpty(sftpPassword) ? ConfigConstants.getSftpPassword() : sftpPassword;
        String controlEncoding = StringUtils.isEmpty(sftpControlEncoding) ? ConfigConstants.getSftpControlEncoding() : sftpControlEncoding;

        logger.debug("SFTP connection url:{}, username:{}, password:{}, controlEncoding:{}, localFilePath:{}", sftpUrl, username, password, controlEncoding, localFilePath);
        String remoteFilePath = sftpUrl.split(host + "/")[1].split("\\?")[0];
        String encodefileName = remoteFilePath.substring(remoteFilePath.lastIndexOf("/")+1);
        String dir = remoteFilePath.replace("/" + encodefileName,"");

        ChannelSftp channelSftp = createSftp(username,password,host,Integer.parseInt(port));
        OutputStream outputStream = Files.newOutputStream(Paths.get(localFilePath));
        channelSftp.cd(dir);
        channelSftp.get(fileName,outputStream);
        logger.debug("SFTP download success");
        outputStream.flush();
        outputStream.close();
        disconnect(channelSftp);
    }

    public static void main(String[] args) throws GalimatiasParseException {
        String url = ("sftp://192.168.1.1/upload/test/demo/file.zip?sftp.username=sftpadmin&sftp.password=sftp&sftp.control.encoding=UTF-8");
        String[] arrsy = url.split("192.168.1.1/");
        System.out.println(url.split("192.168.1.1/"));
        System.out.println(arrsy[1].split("\\?")[0]);

        String remoteFilePath = url.split("192.168.1.1" + "/")[1].split("\\?")[0];
    }
}

 

二、客户端方式:

 1 #!/bin/bash
 2 
 3 SFTP_HOST_IP=192.168.1.1
 4 SFTP_HOST_PORT=22
 5 SFTP_HOST_USER=sftpadmin
 6 SFTP_HOST_PASSWD=sftp
 7 SFTP_BASE_DIR=upload
 8 SYSTEM_CODE=$1
 9 UPLOAD_FILE=$2
10 
11 UPLOAD_DIR=${SFTP_BASE_DIR}/${SYSTEM_CODE}
12 sftpPutFiles(){
13   ftpUser=$1
14   ftpPwd=$2
15   host=$3
16   port=$4
17   remoteDir=$5
18   uploadFile=$6
19   lftp -u ${ftpUser},${ftpPwd} sftp://${host}:${port} <<EOF
20   cd ${remoteDir}
21   mput ${uploadFile}
22   bye
23 EOF
24 }
25 echo "上传文件开始:" +`date`
26 sftpPutFiles $SFTP_HOST_USER $SFTP_HOST_PASSWD $SFTP_HOST_IP $SFTP_HOST_PORT $UPLOAD_DIR $UPLOAD_FILE
27 echo "上传文件结束:" +`date`
28 
29 sftpGetFiles(){
30   ftpUser=$1
31   ftpPwd=$2
32   host=$3
33   port=$4
34   remoteDir=$5
35   downFile=$6
36   lftp -u ${ftpUser},${ftpPwd} sftp://${host}:${port} <<EOF
37   cd ${remoteDir}
38   set xfer:clobber on
39   mget ${downFile}
40   bye
41 EOF
42 }
43 echo "下载文件开始:" +`date`
44 sftpGetFiles $SFTP_HOST_USER $SFTP_HOST_PASSWD $SFTP_HOST_IP $SFTP_HOST_PORT $UPLOAD_DIR
45 echo "下载文件结束:" +`date`

三、操作系统命令方式:

1 上传sftp:
2     curl -T app.zip sftp://sftpuser:[email protected]:12024/data/sftp_data/
3 下载sftp:
4     curl sftp://sftpuser:[email protected]:12024/data/sftp_data/file.txt -o file.txt

 

标签:文件,String,上传下载,SFTP,host,session,sftp,port
From: https://www.cnblogs.com/pengteng/p/18329759

相关文章

  • libcurl上传文件崩溃
    参考的官网demo写了上传文件的代码。https://curl.se/libcurl/c/fileupload.html#include<stdio.h>#include<curl/curl.h>#include<sys/stat.h>#include<fcntl.h>intmain(void){CURL*curl;CURLcoderes;structstatfile_info;curl_off_......
  • 文件管理工具“三剑客” #Everything #SpaceSniffer #Clover
    前言:本文收集了我日常使用的三个文件管理工具:文件搜索神器——Everything磁盘文件占用分析工具——SpaceSniffer文件资源管理器——Clover下面我从工具解决的痛点和使用技巧两个方面去介绍每个工具。1、文件搜索神器——Everything痛点:想要快速搜索到文件,只知道一个前......
  • gdb调试core dump文件之二
    1目录2corruptstack?3inforegisters4(gdb)x的使用5X86上崩溃6调试线程1目录1.1目录指定dir在GDB中使用dir命令来添加新的源代码路径。这个命令允许我指定一个或多个目录,GDB会在这些目录中查找源代码文件。gdb./your_executable#启动可执行文件(gdb)dir/p......
  • 如何使用配置文件通过Spring Boot配置特定环境的配置?
    在SpringBoot应用程序中,你可以使用配置文件来为特定环境配置不同的设置。SpringBoot支持多种方式来实现这一点,最常见的方法是使用application.properties或application.yml文件以及配置文件的命名约定。以下是实现这一目标的一些方法:1.使用多个配置文件你可以为不同的......
  • 跨国文件传输方案如何选 才能实现安全快速的跨国传输?
    数据⼊境和出海已经成为⾮常普遍的场景,比如汽⻋制造业、⾦融服务业、物流和供应链、电⼦商务、医疗健康、教育培训等多个⾏业及领域涉均及⼤量的、多种类型的数据出⼊境场景。所以企业需要找到一种适合自己的跨国文件传输方案。跨国文件传输可以采用多种方案,具体选择取决于文件的......
  • C/C++ 头文件注意事项总结
    C/C++头文件在编程中扮演着至关重要的角色,它们用于声明函数、类、宏、常量等,使得这些声明可以在多个源文件中共享。然而,在使用头文件时,需要注意一些关键事项以避免编译错误、提高代码的可维护性和可读性。以下是一些关于C/C++头文件使用的注意事项:1.防止头文件重复包含头文......
  • pygame 文件调用 Pygame 文件时出现 MouduleNotFound 错误
    我遇到的错误如下:ModuleNotFoundError:Nomodulenamed'pygame.rect'我将错误追溯到sprite.py(一个pygame文件),它试图导入文件rect.py。这是我的文件路径:文件路径白色圈出的文件是尝试导入“rect.py”的文件。我能找到的唯一类似文件是用红色圈出的文件“r......
  • mapper文件 和bean
    <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.hspedu.springboot.my......
  • 后端配置文件
    server:port:9090spring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/meetin_scheduling?useSSL=true&useUnicode=true&characterEncoding=UTF-8username:rootpassword:1234mvc:#......
  • 同时运行多个Python文件
    如何同时运行python的多个文件我有三个文件pop.pypop1.pypop2.py我想同时运行这个文件这些文件正在被一一运行python代码运行所有文件可以使用以下几种方法同时运行多个Python文件:1.使用多线程/多进程:多线程(threading):如果的Pytho......