Files
2021-01-12 22:04:24 +08:00

143 lines
4.6 KiB
Bash

#! /bin/sh
# 用于缴话费回缴款取批扣文件
EX_OK=0
EX_ARGS=3 # sftp_pes.sh 参数错误.
EX_NOTDIR=4 # 指定的不是一个目录.
EX_SFTP_ERROR=5 # SFTP错误.
EX_NOCHK=6 # 没取到.chk文件.
EX_FORMATDIR=7
EX_USAGE=9
#usage(){
# echo "usage: `basename $0` remoteuser remoteip basedir localchkdatadir remotechkdatadir remotedatadir"
# echo " remoteuser: 远程sftp用户名."
# echo " remoteip: 远程机器ip."
# echo " basedir: 本地存放刚获取到的文件和日志的目录."
# echo " localchkdatadir: 本地存放带有chk的dat文件."
# echo " remotechkdatadir: 远程存放文件的bak目录."
# echo " remotedatadir: 远程目录."
# exit $EX_USEAGE
#}
# 统一去掉目录最后面的 "/"
formatdir(){
[ "$#" -ne 1 ] && echo "formatdir: args error" && exit $EX_FORMATDIR
a=`echo "$1"|sed -e 's/\/*$//g'`
echo $a
}
# 删除临时文件.
deletetempfiles(){
rm -rf "$datadir_tmp"
rm -rf "$sftpbatchfile1"
rm -rf "$sftpbatchfile2"
rm -rf "$logfile1"
rm -rf "$logfile2"
}
[ "$#" -ne 6 ] && exit $EX_ARGS
date=`date +%Y%m%d%H%M%S`
# remote user ip
remoteuser=$1
remoteip=$2
if [ -d "$3" ]; then
basedir=`formatdir $3`
else
exit $EX_NOTDIR
fi
# 登记日志目录
logdir=${basedir}/log
# 日志名称
logfile=${logdir}/${date}.log
logfile1=${logdir}/${date}.log1 # 用于 &>.
logfile2=${logdir}/${date}.log2 # 用于 &>.
# 存放取回的所有的文件,是临时的,最后会删掉.
datadir_tmp=${basedir}/${date}
sftpbatchfile1=${basedir}/${date}.file1
sftpbatchfile2=${basedir}/${date}.file2
# local 带chk的dat文件存放目录
if [ -d "$4" ]; then
localchkdatadir=`formatdir $4`
else
exit $EX_NOTDIR
fi
# remote 备份带chk的dat文件目录.
remotechkdatadir=`formatdir $5`
remotedatadir=`formatdir $6`
[ ! -d ${logdir} ] && mkdir ${logdir}
[ ! -d ${datadir_tmp} ] && mkdir $datadir_tmp
[ ! -f ${sftpbatchfile1} ] && touch ${sftpbatchfile1}
[ ! -f ${sftpbatchfile2} ] && touch ${sftpbatchfile2}
sftp -oPasswordAuthentication=no $remoteuser@$remoteip:${remotedatadir}/*.csv ${datadir_tmp} >${logfile} 2>&1 # 15 上不能使用 &>> sh上不能使用&>
sftpreturn=$?
if [ "$sftpreturn" -ne 0 ]; then
echo "sftp return: $sftpreturn" >>$logfile
deletetempfiles
exit $EX_SFTP_ERROR # sftp 报错,查看log
fi
# scp mktdev@127.0.0.1:wy/temp/* .
# 计算chk文件 + dat文件,.chk .CHK都支持.
chkflag1=`find ${datadir_tmp} -name "*.csv"` # bsh 中必须加 "
chkflag2=`find ${datadir_tmp} -name "*.CSV"`
if [ -z "$chkflag1" -a -z "$chkflag2" ];then
echo "no check file." >> ${logfile}
deletetempfiles
exit $EX_NOCHK
fi
if [ -n "$chkflag1" ];then
datawithchk1=`ls ${datadir_tmp}/*.csv|sed -e 's/\/*$//g'`" "`ls ${datadir_tmp}/*.csv`
fi
if [ -n "$chkflag2" ];then
datawithchk2=`ls ${datadir_tmp}/*.CSV|sed -e 's/\/*$//g'`" "`ls ${datadir_tmp}/*.CSV`
fi
datawithchk=$datawithchk1" "$datawithchk2
#for chkfile in `ls ${datadir_tmp}/*.csv 2>/dev/null` `ls ${datadir_tmp}/*.CSV 2>/dev/null`;do
# noimportfilename=`echo $chkfile|sed -e 's/\.csv$/\.noimport/g' -e 's/\.CSV$/\.noimport/g'`
# touch $noimportfilename
# datawithchknoimport1=$datawithchknoimport1" ""$noimportfilename"
#done
#datawithchknoimport=$datawithchk" "$datawithchknoimport1
#echo "datawithchknoimport: ${datawithchknoimport}" >>${logfile}
#echo "noimportfilename:${noimportfilename}" >>${logfile}
# 将chk文件和dat文件转移.
cp $datawithchk ${localchkdatadir} >>${logfile} 2>&1
echo ${datawithchk} |tr ' ' '\n'|sed -e 's/^/-put /g' > ${sftpbatchfile1}
# 将有chk文件的dat文件sftp至remote
sftp -oPasswordAuthentication=no -b ${sftpbatchfile1} $remoteuser@$remoteip:${remotechkdatadir} > ${logfile1} 2>&1 # 可以达到 &< 效果.
sftpreturn=$?
if [ "$sftpreturn" -ne 0 ]; then
cat ${logfile1} >> $logfile
echo "sftp return: $sftpreturn" >>$logfile
deletetempfiles
exit $EX_SFTP_ERROR # sftp 报错,查看log
fi
cat ${logfile1} >> $logfile
# 删除remote的 .chk 和 与.chk前缀相同的.dat文件.
for line in `cat ${sftpbatchfile1}|cut -d ' ' -f 2`; do
sftpbatchfile21=$sftpbatchfile21" "`basename $line`
done
echo ${sftpbatchfile21} |tr ' ' '\n'| sed -e 's/^/-rm /g' > ${sftpbatchfile2}
sftp -oPasswordAuthentication=no -b ${sftpbatchfile2} $remoteuser@$remoteip:${remotedatadir} > ${logfile2} 2>&1
sftpreturn=$?
if [ "$sftpreturn" -ne 0 ]; then
cat ${logfile2} >> $logfile
echo "sftp return: $sftpreturn" >>$logfile
deletetempfiles
exit $EX_SFTP_ERROR # sftp 报错,查看log
fi
cat ${logfile2} >> $logfile
# 删除本地临时文件.
deletetempfiles
times >> ${logfile}
exit $EX_OK