设为首页 收藏本站
查看: 771|回复: 0

shell自动备份文件或目录到本地和远程主机

[复制链接]

尚未签到

发表于 2018-8-27 09:07:54 | 显示全部楼层 |阅读模式
  #!/bin/bash
  #Function:自动备份给定列表中的目录或文件,并且可以保留N天备份的档案。
  #可备份至远程主机指定的目录下,但需本机能免密码登录到远程主机,用到ssh-keygen
  #该脚本分为两个文件:执行文件backup.sh和备份项目文件bakfile.lst,两个文件必须位于同一目录下
  #Author:JianJie
  #Date:2016/8/26
  #Usage:sudo bash backup.sh &
  #Version:v2
  ###############################################################
  logFile=/backup/local/log/`date +"%Y-%m"`.log #日志文件
  logDir=/backup/local/log
  myDate=`date +"%Y-%m-%d"`
  bakFileLst=bakfile.lst            #需要备份的文件或目录放到该文件中
  bakDir=/backup/local              #备份至此目录
  keepDays=5                       #文件保留天数
  remoteHost="rhel6.8:rhel7"     #需要备份至远程主机的地址,注意本机需免密码登陆到远程主机,多个主机地址或主机名之间用‘:’分割
  remoteHostDir=/backup/$HOSTNAME    #远程主机备份目录
  currentDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"  #当前运行脚本所在的目录
  ###############################################################
  #判断日志目录和日志文件是否存在
  if [ ! -d $logDir ];then
  mkdir -p $logDir
  touch $logFile
  else
  if [ ! -e $logFile ];then
  touch $logFile
  fi
  fi
  #开始记录日志
  echo "Backup start at $(date +"%Y-%m-%d %H:%M:%S")" >> $logFile
  echo "--------------------------------------------------------" >> $logFile
  echo " " >> $logFile
  #判断保存备份文件的文件列表'bakfile.lst'是否存在
  if [ ! -e $currentDir/$bakFileLst ];then
  echo "Error:Important file [$currentDir/$bakFileLst] has been lost,now creating..." >> $logFile
  touch $currentDir/$bakFileLst
  echo "The file [$currentDir/$bakFileLst] has been created,but you still need to write data in it!" >> $logFile
  echo " " >> $logFile
  echo "--------------------------------------------------------" >> $logFile
  echo "Backup end at $(date +"%Y-%m-%d %H:%M:%S")" >> $logFile
  echo " " >> $logFile
  exit 3
  fi
  paths=`cat $currentDir/$bakFileLst`
  for path in $paths
  do
  baseName=`echo "$path" | xargs basename`
  oldFile=$bakDir/$baseName.$(date --date="$keepDays days ago" +"%Y-%m-%d").txz
  #判断路径中备份的是文件还是目录
  #若路径中要备份的是文件,则先进入指定路径中的上一级
  if [ -f "$path" ];then
  #进入指定路径中的上一级目录
  cd `echo "$path" | cut -d "/" -f 1-$(echo "$path"|gawk -F"/" '{print NF-1}')`
  #若要备份的文件已经存在,则不再重复备份
  if [ -f $bakDir/$baseName.$myDate.txz ];then
  echo "Backup file [$bakDir/$baseName.$myDate.txz] already exists!" >> $logFile
  else
  cp -RHpf $baseName $bakDir
  cd  $bakDir
  #备份档案格式为.tar.xz,可根据需要调整,如.tar.gz或者.tar.bz2
  tar -cJf $baseName.$myDate.txz $baseName
  #将备份后的文件通过scp备份到远程主机
  for host in $(echo "$remoteHost" | sed 's/:/ /g')
  do
  scp -o ConnectTimeout=10 $baseName.$myDate.txz $host:$remoteHostDir >>$logFile 2>/dev/null && \
  echo "Successful backup [$path] to the remote host:[$host:$remoteHostDir]" >>$logFile || \
  echo "Backup [$path] to the remote host:[$host:$remoteHostDir] failed,please check it" >>$logFile
  done
  #备份完成,删除拷贝过来的源文件
  rm -rf $baseName
  echo "Backup [$path] done into [$bakDir] successfuly!" >> $logFile
  #若存在N天前旧文件,则删除它
  if [ -f $oldFile ];then
  rm -rf $oldFile
  echo "[$oldFile],delete old file successfuly!" >> $logFile
  fi
  fi
  #路径中备份的是目录
  elif [ -d "$path" ];then
  #先判断要备份的文件是否已经存在,若存在则不再重复备份
  if [ -f $bakDir/$baseName.$myDate.txz ];then
  echo "Backup file [$bakDir/$baseName.$myDate.txz] already exists!" >> $logFile
  else
  cd $path
  cd ..
  cp -RHpf $baseName $bakDir
  cd  $bakDir
  tar -cJf $baseName.$myDate.txz $baseName
  #将备份后的文件通过scp备份到远程主机
  for host in $(echo "$remoteHost" | sed 's/:/ /g')
  do
  scp -o ConnectTimeout=10 $baseName.$myDate.txz $host:$remoteHostDir >>$logFile 2>/dev/null && \
  echo "Successful backup [$path] to the remote host:[$host:$remoteHostDir]" >>$logFile || \
  echo "Backup [$path] to the remote host:[$host:$remoteHostDir] failed,please check it" >>$logFile
  done
  #备份完成,删除拷贝过来的源文件
  rm -rf $baseName
  echo "Backup [$path] done into [$bakDir] successfuly!" >> $logFile
  #若存在N天前旧文件,则删除它
  if [ -f $oldFile ];then
  rm -rf $oldFile
  echo "[$oldFile],delete old file successfuly!" >> $logFile
  fi
  fi
  else
  echo "Wrong path or file:[$path],please check it" >>$logFile
  fi
  done
  echo " " >> $logFile
  echo "--------------------------------------------------------" >> $logFile
  echo "Backup end at $(date +"%Y-%m-%d %H:%M:%S")" >> $logFile
  echo " " >> $logFile
  exit 0



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-557085-1-1.html 上篇帖子: 用shell脚本编写区别两个文件夹内文件的不同 下篇帖子: shell统计指定目录下所有文件类型及数量
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表