先说下业务需求,我们需要定时上传昨天产生的统计文件给其他服务器。写一个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"