天天看点

lftp上传文件shell脚本

先说下业务需求,我们需要定时上传昨天产生的统计文件给其他服务器。写一个shell脚本 用crontab定时执行。

重点

1 路径问题  因为是crontab定时执行,所以都是绝对路径。我把脚本放在跟需要上传的文件同级目录下,然后获取当前路径,这样就不会存在找不到路径的问题。

2 脚本开头需要引入环境   source ~/.bash_profile  这句话很重要

3 服务器需先安装lftp  命令 yum -y install lftp

#!/bin/bash
source ~/.bash_profile 
#获取当前文件当前路径
positionPath=$(cd "$(dirname "$0")"; pwd)
#获取昨天时间
DATA=`date -d "yesterday" +%Y%m%d`
#需要发送的文件名
#filename="userInfoData.$DATA.*"
filename="*.*.*.gz"
#要发送的主机名 
HOST=  
USERNAME=
PASSWORD=

startTime=`date "+%Y-%m-%d %H:%M:%S"`
startTimeStamp=`date -d "$startTime" +%s`
basedir=$positionPath
file_regex="*.*.*.gz"
logfile=$basedir/sftp.`date "+%Y%m%d"`.iot
echo "####startTime:$startTime start sftp $filename=======" | tee -a ${logfile}
filecnt=`find $basedir -name $file_regex |wc -l`
if [ $filecnt -ge 0 ];then
	echo "here has $filecnt files need to be sftp to bigdata!"|tee -a ${logfile}
	lftp -u $USERNAME,$PASSWORD sftp://$HOST<<EOF
  cd /home/wangr/w2/
  lcd $positionPath
  mput $filename
  bye 
EOF
echo "ok"
else
	echo "here no file need to be sftp to bigdata" |tee -a ${logfile}
fi
endTime=`date "+%Y-%m-%d %H:%M:%S"`
endTimeStamp=`date -d "$endTime" +%s`
echo "== total == time consuming: "$(($endTimeStamp - $startTimeStamp))"s" | tee -a ${logfile}
           

因为之前服务器没安装lftp  所以还写了个python版本备用,可以参考下

#!/usr/bin/python
# coding=utf-8
import os,sys
import paramiko

from datetime import datetime, date, timedelta

yesterday = (date.today() + timedelta(days = -1)).strftime("%Y%m%d")
#print(yesterday)
file="userInfoData."+yesterday
host =''
user = ''
password = ''
def getFileName(path):
    ''' 获取指定目录下的所有指定后缀的文件名 '''

    f_list = os.listdir(path)
    for i in f_list:
        # os.path.splitext():分离文件名与扩展名
        if os.path.splitext(i)[1] =='.txt':
	        if i.startswith(file):
              t = paramiko.Transport(host)
              t.connect(username=user,password=password)
              sftp = paramiko.SFTPClient.from_transport(t)
              sftp.put(i,'/home/dr_dev/W/'+i)
              t.close()
              print('ok')


if __name__ == '__main__':

    path = '/logs/userInfoData/'
    getFileName(path)
           

以及sftp的版本备用

#!/bin/bash
source ~/.bash_profile 
#获取当前文件当前路径
positionPath=$(cd "$(dirname "$0")"; pwd)
#获取昨天时间
DATA=`date -d "yesterday" +%Y%m%d`
#需要发送的文件名
filename="userInfoData.$DATA.*"
targetpath='/home/dev/W'
tfilename="userInfoData.$DATA.0.txt"
echo "开始发送文件$filename"

sftp [email protected] << EOF
put $positionPath/$filename $targetpath/$tfilename
quit
EOF
echo "ok"