shell实例——获取FTP/SFTP远程文件
使用 以下记录了一个 需求描述深证通会将基金公司的确认数据文件(开户、认申购定投、赎回分红等等)发送给对接过的小站,最终体现就是不同的小站各推到接收方一个独立的文件夹(文件夹以小站号命名)。我作为接收方有一台存储服务器用于接收小站文件,此时另外一台应用服务器需要从存储服务器获取确认数据文件。数据文件按类别不同分别有03、04、06等结尾的,每天会有更新。要求是获取每天的04、06新文件,每天的文件分别放在当天日期命名的文件夹下。 # 远端存储服务器目录结构 |——download |——k0001 | |——YYYYMMdd_xx_xxx_xxxxxxxx_03.TXT | |——YYYYMMdd_xx_xxx_xxxxxxxx_04.TXT | |——YYYYMMdd_xx_xxx_xxxxxxxx_06.TXT | └──... |——k0253 | |——OFD_xx_xxx_YYYYMMdd_03.TXT | |——OFD_xx_xxx_YYYYMMdd_04.TXT | |——OFD_xx_xxx_YYYYMMdd_06.TXT | └──.... |──zdfile | |——YYYYMMdd_xx_xxx_xxxxxxxx_03.TXT | |——YYYYMMdd_xx_xxx_xxxxxxxx_04.TXT | |——YYYYMMdd_xx_xxx_xxxxxxxx_06.TXT | |——OFD_xx_xxx_YYYYMMdd_03.TXT | |——OFD_xx_xxx_YYYYMMdd_04.TXT | |——OFD_xx_xxx_YYYYMMdd_06.TXT | └──.... └──... 环境介绍操作系统
$ oslevel 7.1.0.0 $ echo $SHELL /usr/bin/ksh $ expect -v expect version 5.42.1 代码实现1、定义变量首先定义变量给定参数,包括 # 接收参数 localPath=$1 remotePath=$2 serverIP=$3 sftpUser=$4 sftpPass=$5 # 定义变量 SYSDATE=`date +%Y%m%d` STATION_ARR[0]="k0001" STATION_ARR[1]="k0253" STATION_ARR[2]="zdfile" 2、处理文件夹先判断本地是否存在当日日期文件夹,不存在则创建文件夹,并赋予权限 # [函数]处理日期文件夹 createForlder() { cd $1 if [[ ! -d ${SYSDATE} ]]; then mkdir ${SYSDATE} chmod 755 ${SYSDATE} fi cd ${SYSDATE} } 3、非交互式远程登录要想通过 # FTP非交互式操作 ftp_download() { ftp -n $1 <<! user $2 $3 prom bin cd $4 mget *$sysdate*04.* mget *$sysdate*06.* bye ! } 如果使用的是 # SFTP非交互式操作 sftp_download() { expect <<- EOF set timeout 5 spawn sftp $1@$2 expect { "(yes/no)?" {send "yesr"; expect_continue} "password:" {send "$3r"} } expect "sftp>" send "cd $4r" set timeout -1 expect "sftp>" send "mget *$sysdate*04.*r" expect "sftp>" send "mget *$sysdate*06.*r" expect "sftp>" send "byer" EOF } 4、遍历小站获取文件循环遍历数组 for station in ${STATION_ARR[@]}; do remoteDir=${remotePath}${station} ftp_download ${serverIP} ${sftpUser} ${sftpPass} ${remoteDir} # sftp_download ${sftpUser} ${serverIP} ${sftpPass} ${remoteDir} done 至此,需求功能已全部实现。完整脚本代码如下: #!/usr/bin/ksh ############################################################ ## 功能:从存储服务器获取确认文件 ## By xiaosong 2017-12-31 ############################################################ #------------------------参数说明---------------------------- #--接收 # localPath -本地文件路径 # remotePath -远程文件路径 # serverIP -远程服务器IP # sftpUser -sftp用户名 # sftpPass -sftp密码 #--变量 # SYSDATE -系统日期 # STATION_ARR[] -小站文件夹数组,新增小站增加此数组即可 #----------------------------------------------------------- # 接收参数 localPath=$1 remotePath=$2 serverIP=$3 sftpUser=$4 sftpPass=$5 # 定义变量 SYSDATE=`date +%Y%m%d` STATION_ARR[0]="k0001" STATION_ARR[1]="k0253" STATION_ARR[2]="zdfile" # [函数]处理日期文件夹 createForlder() { cd $1 if [[ ! -d ${SYSDATE} ]]; then mkdir ${SYSDATE} chmod 755 ${SYSDATE} fi cd ${SYSDATE} } # [函数]SFTP非交互式操作 sftp_download() { expect <<- EOF set timeout 5 spawn sftp $1@$2 expect { "(yes/no)?" {send "yesr"; expect_continue} "password:" {send "$3r"} } expect "sftp>" send "cd $4r" set timeout -1 expect "sftp>" send "mget *$sysdate*04.*r" expect "sftp>" send "mget *$sysdate*06.*r" expect "sftp>" send "byer" EOF } # 获取中登文件 createForlder ${localPath} for station in ${STATION_ARR[@]}; do remoteDir=${remotePath}${station} sftp_download ${sftpUser} ${serverIP} ${sftpPass} ${remoteDir} done 完善脚本1、参数校验脚本功能函数执行前,可以校验是否传递了完整的参数。若参数个数不对,则直接退出脚本终止执行。 if [[ $# != 5 ]]; then exit fi 2、日志为脚本增加日志函数,记录脚本运行情况,作为历史记录归档,也方便回查定位问题。 SYSTIME=`date '+%Y-%m-%d %H:%M:%S'` # [函数]脚本运行日志 wLog(){ echo "${SYSTIME} $1" >> ${LOGPATH}/DownloadFile.log } 3、返回值如果不是配置 #----------------------------------------------------------- #--返回值RETURNCODE # 0 -成功 # 1 -参数传递异常 # 2 -处理文件夹异常 # 3 -获取文件异常 #----------------------------------------------------------- # [函数]脚本执行返回值 retrunCode() { if [ ${result} -eq "1" ]; then RETURNCODE=$1 echo ${RETURNCODE} fi } 然后在关键步骤位置调用返回值处理函数。 # 校验参数个数 if [[ $# != 5 ]]; then exit fi result=$? retrunCode "1" # 处理文件夹 createForlder ${localPath} result=$? retrunCode "2" # 循环获取文件 for station in ${STATION_ARR[@]}; do remoteDir=${remotePath}${station} sftp_download ${sftpUser} ${serverIP} ${sftpPass} ${remoteDir} done result=$? retrunCode "3" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 模拟scala ParStream
- angularjs – 使用Controller作为方法访问继承的作用域
- 【数据结构】实现循环链表(c++)
- 如何在Emacs shell缓冲区中获得对“?”等的支持?
- twitter-bootstrap – 一起使用Bootstrap Typeahead和Twitt
- angularjs系列之轻松使用$q进行异步编程
- 在linux的终端退出python命令行的方法
- twitter-bootstrap – Twitter bootstrap模态 – 背景不消失
- typescript – Angular 2.0 – @ViewQuery和@Query之间有什
- 计算Bash中几种文件大小的总和