Java使用sftp定时下载文件的示例代码

sftp简介

sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。

添加依赖

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

增加配置

sftp:
  ip: 192.168.1.60
  port: 22
  timeout: 60000
  retryTime: 3
  admin:
    username: admin
    password: 2k3xrYjbd930.

代码示例

每天凌晨1点在多个用户目录中下载csv文件至本地tmp目录

@Service
public class SftpTask extends Thread {
  private ChannelSftp sftp;
  private Session session;
  @Value("${sftp.admin.username}")
  private String username;
  @Value("${sftp.admin.password}")
  private String password;
  @Value("${sftp.host}")
  private String host;
  @Value("${sftp.port}")
  private Integer port;
  private SftpService sftpService;
  public EtlSftpTask (SftpService sftpService) {
    this.sftpService = sftpService;
  }
  /**
   * 建立sftp连接
   */
  private void connect(){
    try {
      JSch jSch = new JSch();
      session = jSch.getSession(username, host, port);
      session.setPassword(password);
      session.setConfig("StrictHostKeyChecking", "no");
      session.connect();
      Channel channel = session.openChannel("sftp");
      channel.connect();
      sftp = (ChannelSftp) channel;
    }catch (JSchException e) {
      e.printStackTrace();
    }
  }
  /**
   * 关闭sftp连接
   */
  public void close(){
    try {
      if (sftp != null) {
        if (sftp.isConnected()) sftp.disconnect();
      }
      if(session != null){
        if (session.isConnected()) session.disconnect();
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  /**
   * 下载文件到本地
   *
   * @param source          源文件
   * @param target          目标文件
   * @throws SftpException      异常
   * @throws FileNotFoundException  异常
   */
  private void download(String source, String target) throws SftpException, FileNotFoundException {
    sftp.get(source, new FileOutputStream(new File(target)));
  }
  /**
   * 处理用户数据文件
   *
   * @param root   数据文件根目录
   * @param lastTime 上次处理文件的最后的时间
   * @return     本次处理文件的最后的时间
   */
  private Integer handle(String root, Integer lastTime) {
    String directory = root + "/event/";
    Vector files;
    try {
      files = sftp.ls(directory + "event_*.csv");
    } catch (Exception e) {
      e.printStackTrace();
      return 0;
    }
    // 文件名
    String fileName;
    // 临时文件
    String tmpFile;
    // 文件更新时间
    Integer mTime;
    // 文件最后更新时间
    Integer maxTime = lastTime;
    // 处理用户文件
    for(Object o: files) {
      try {
        ChannelSftp.LsEntry f = (ChannelSftp.LsEntry) o;
        // 文件更新时间
        mTime = f.getAttrs().getMTime();
        if (mTime <= lastTime) continue;
        // 文件名
        fileName = f.getFilename();
        // 最后处理事件
        maxTime = Math.max(maxTime, mTime);
        // 下载文件
        tmpFile = "/tmp/" + fileName;
        download(directory + fileName, tmpFile);
      } catch (Exception e) {
        // TODO 错误日志
        e.printStackTrace();
      }
    }
    // 返回文件最后的处理时间
    return maxTime;
  }
  /**
   * 每天凌晨1点开始执行
   */
  @Scheduled(cron = "0 0 1 * * *")
  public void task () {
    // 获取sftp连接
    connect();
    String root;
    Integer lastTime;
    Long cid;
    Integer maxTime = lastTime;
    // 获取用户列表
    for (SftpDTO sftpDTO: sftpService.findAll()) {
      // 用户主目录
      root = sftpDTO.getSftpRoot();
      // 上次处理文件的最后时间
      lastTime = sftpDTO.getLastTime();
      maxTime = Math.max(maxTime, handle(root, lastTime));
      // 更新最后处理时间
      if (!maxTime.equals(lastTime)) {
        sftpDTO.setLastTime(maxTime);
        sftpService.update(sftpDTO);
      }
    }
    // 释放sftp资源
    close();
  }
}

总结

以上所述是小编给大家介绍的Java使用sftp定时下载文件的示例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

时间: 2018-05-16

python定时采集摄像头图像上传ftp服务器功能实现

首先是截图,从摄像头截取一幅图像: 复制代码 代码如下: while 1:   #测试摄像头的存在    try:        cam = Device()    except:        print "no webcam found!"        continue    break 然后是把图像上传到ftp服务器: 复制代码 代码如下: remote = ftplib.FTP('127.0.0.1') #登陆服务器remote.login()file = open('%s.

shell脚本将Oracle服务器中数据定时增量刷新到ftp服务器中

现有需求:将oracle数据库中的数据准实时同步至某ftp服务器中,以便前端应用能定时从ftp服务器目录中取增量数据 方法:将加工脚本写为存储过程,然后利用shell脚本执行该存储过程并将增量数据导出为txt文件并传送到ftp服务器,利用crontab定时每5分钟执行一次shell脚本,从而实现oracle库中数据持续增量刷新到ftp服务器 其中crontab以及ftp和存储过程的编写并没有难度,shell脚本的功能稍稍复杂,现在将脚本记录下以备后查 总结 以上所述是小编给大家介绍的shell脚

windows下定时利用bat脚本实现ftp上传下载

前言: 工作中可能会遇到以下情况,利用windows作为中转,来实现两台linux服务器的文件传输. 实现步骤: 1.FTP上传和下载的bat脚本. 脚本分为两部分:可执行bat脚本和ftp命令文件: 可执行bat脚本: @echo off ftp -s:D:\ftp\ftp.txt ftp命令ftp.txt: open 192.168.1.166 ftp-user passwd prompt off lcd D:\ftp cd /home/myftp mget * close open 10.

使用Linux shell脚本实现FTP定时执行批量下载指定文件

使用FTP定时批量下载指定文件的shell脚本,具体实例介绍如下所示: 1.目标FTP服务器地址 #FTP服务器地址 ip=10.19.15.23 2.FTP账号和密码 u=账号 p=密码 3.使用mget结合正则表达式下载文件 #获取昨天日期,为后面下载使用 T=`date -d yesterday +%Y%m%d` 4.连接FTP服务器,到指定路径下下载文件 ftp -n <<EOF open $ip user $u $p binary cd /hour #远程服务器文件目录 lcd /h

简单的远程FTP定时备份Shell脚本分享

先说问题.公司现在有2台服务器,都是centos系统,一台本地(局域网),一台则在电信机房.因为工作需要,每天备份机房上的数据到本地,以前一直是FTP登录,然后下载到本地机器.现在则希望,利用本地的centos机器,自动备份到本地. 解决方法如下: 1.下载远程电信机房中机器上已打包好的数据.这个不难,一条语句搞定. 复制代码 代码如下: wget ftp://user_name:password@ip_address:port/dir/file_name 2.定时任务,需要写个脚本,并加入定时

CentOS下mysql定时备份Shell脚本分享

1.备份语句 复制代码 代码如下: # /usr/local/mysql/bin/mysqldump -utest -ptest test --socket=/tmp/mysql.3306.sock > /usr/local/mysql_backup/3306/test-`date +%Y%m%d`.sql.gz 语句说明:   /usr/local/mysql/bin/mysqldump:MySql安装目录下 -utest:分为两块,一块为-u一块为test:其中-u表示其为用户名,test表

SQL Server远程定时备份数据库脚本分享

经常会有定时备份SQL Server数据库的需要.定时备份到本机的话,还是挺容易的,计划任务就可以完成,但如果是整机挂了,那备份到本机是没意义的,那么就需要来考虑备份到局域网中,其它电脑里. 下面就分享一份在网上找了之后,自己再简单整理过的代码,配合 SQL Server 代理中的作业功能,已经稳定运行一个星期了,每小时就备份一次. 复制代码 代码如下: -- 创建网络映射(Y是盘符:IP地址后面要带共享文件夹的名称:password是密码,双引号引起:account是远程电脑的登录名) exe

linux下实现ftp自动备份shell脚本

利用here文档 复制代码 代码如下: #!/bin/sh ftp -ivn 210.29.28.124 <<EOF user yun yun2011 lcd /home/veyun cd /home/veyun/yhb get v bye EOF 解释: -i :关闭多文件传输过程中的交互提示,所以不会再有让用户输入用户名和密码的提示 -n:阻止了初始连接时的自动登录 -v:将ftp命令设置为verbose模式,从而可以在会话时看到其中的命令 在本例中使用用户名yun和密码yun2011登录

linux下mysql如何自动备份shell脚本

Linux 服务器上的程序每天都在更新 MySQL 数据库,于是就想起写一个 shell 脚本,结合 crontab,定时备份数据库.其实非常简单,主要就是使用 MySQL 自带的 mysqldump 命令. #!/bin/bash # Shell script to backup MySql database # To backup Nysql databases file to /backup dir and later pick up by your # script. You can s

Windows下简单的Mysql备份BAT脚本分享

前言 本文介绍的是一个简单的在 Windows 下备份 Mysql 的 BAT 脚本,脚本使用 mysqldump 命令来备份一个指定的 Mysql 数据库到一个文件,文件格式为 %dbname%-yyyyMMddHHmmss.sql,只保留最近60天的备份.如果想定时执行,在 Windows 中添加任务计划即可,具体的可以参考这篇文章. 示例代码如下 @echo off set hour=%time:~0,2% if "%time:~0,1%"==" " set

linux中mysql备份shell脚本代码

第一步:在你的linux服务器中定义备份目录: 复制代码 代码如下: mkdir /var/lib/mysqlbackup cd /var/lib/mysqlbackup 第二步:下面是最重要的一步了,就是写定时备份脚本. 复制代码 代码如下: vi dbbackup.sh 代码文件如下 复制代码 代码如下: #!/bin/sh# mysql data backup script## use mysqldump --help,get more detail.#BakDir=/root/back/

Linux crontab定时执行Shell脚本需要执行特定的命令时解决思路

由于一些不可抗拒的原因,项目部署后需要定时检测项目是否正常运行,否则将执行重启命令. 在具体实施过程中发现,定时器执行无误,但是重启命令无法正常启动.多方查找发现Shell脚本中的Java命令需要引入环境变量方可正常执行.因此做了一下修改,脚本如下(仅供参考): 1.crontab执行配置 * * * * * cd /项目目录 && ./auto_start.sh >> /log/auto.out 2.Shell脚本 #!/bin/bash #导入环境变量 export LAN

8个实用的Shell脚本分享

几个Shell脚本的例子,觉得还不错. [例子:001]判断输入为数字,字符或其他 复制代码 代码如下: #!/bin/bash  read -p "Enter a number or string here:" input    case $input in     [0-9]) echo -e "Good job, Your input is a numberic! \n" ;;  [a-zA-Z]) echo -e "Good job, Your i

CentOS 6.x系统升级Python到2.7版本的Shell脚本分享

在CentOS 6.x上,默认自带的Python是2.6.x版本,这个版本的Python有点老了,比如"collections.OrderedDict"就是2.7才有的,而且著名的Python Web框架Django的新版(如:1.7)就不支持Python2.6,最低要求是2.7了.而一些公司或者共有云上的服务器就是使用CentOS6.x,所以也就有了升级Python到2.7的需求. 升级Python之前,需要先安装一些工具和软件库,否则后面安装Python或pip时可能出错. Pyt