Linux下Shell 备份脚本集合shell
说到Shell你们都不陌生,Shell是Linux下批处理脚本文件,相似windows下的Vbs脚本等等,能协助咱们完成一些自动化的任务,咱们前面也介绍了一些Shell脚本协助咱们完成了一些计划任务,固然说计划任务也不对,是经过计划任务来调用shell脚原本完成一些自动化任务。废话很少说了,来点实际的,今天呢,咱们主要介绍的是环境仍是工做中遇到的问题,经过远程来完成一些还原任务,windows
1.首先是,咱们须要将本地备份目录下的Weaver.proternt文件定时还原覆盖到指定目录下;bash
将/OAFS/Bkfiles/abc.txt文件还原到本地的/OAFS/WEAVER/ecology/abc.txt服务器
#!/bin/bash BK_PROFEAM=/OAFS/Bkfiles/abc.txt LOCAL_PROFEAM=OAFS/WEAVER/ecology function copy() { `which cp` -rf $BK_PROFEAM $LOCAL_PROFEAM } copy
编写后,咱们须要chmod 770 xxxxssh
2. 咱们须要将本地/OAFS/WEAVER_BACKUP目录下的备份压缩文件定时解压缩及覆盖到远程服务器192.168.6.38下的/OAFS目录下,ide
若是目标存在,咱们就须要解压覆盖操做。函数
#!/bin/bash LOCALBAKDIR=/OAFS/WEAVER_BACKUP RMTRESTDIR=/OAFS RMT_HOST=192.168.6.38 RMT_USER=root RMT_CMD="$(which ssh) $RMT_USER@$RMT_HOST" function is_alive() { `which ping` -c 4 $RMT_HOST >/dev/null 2>&1 if [ "$?" -ne 0 ]; then echo 2 else echo 0 fi } function mktmpdir() { $RMT_CMD mkdir -p /tmp/OAFS } function rmvtmpdir() { $RMT_CMD rm -rf /tmp/OAFS/* } function get_last_targz() { echo $(ls -lt $LOCALBAKDIR | awk {'print $9'} |grep -v ^$ |head -n 1) } function copy() { yum install -y openssh-clients >/dev/null 2>&1 $RMT_CMD yum install -y openssh-clients >/dev/null 2>&1 scp -q $LOCALBAKDIR/$(get_last_targz) $RMT_USER@$RMT_HOST:/tmp/OAFS/ $RMT_CMD tar zxvf /tmp/OAFS/$(get_last_targz) -C $RMTRESTDIR } if [ "$(is_alive)" -eq 0 ]; then mktmpdir copy rmvtmpdir else echo "$RMT_HOST can not be accessed via port 22, please check" fi
须要注意:由于是远程服务器,咱们执行脚本通常是须要使用密码进行验证的,因为是自动化任务,因此咱们不能输入密码,因此咱们须要使用ssh-key进行验证;spa
因此咱们须要在运行脚本的服务器上执行注册秘钥文件:blog
ssh-keygen -t rsa 回车
建立目录,认证目录;而后一路回车crontab
在/root/.ssh 目录下生成了一对密钥文件
id_rsa 私钥
id_rsa.pub 公钥
ssh-copy-id ipaddress
只在脚本执行的机器上;会自动将公钥拷贝到目标服务器上;
这样运行脚本就能够远程拷贝数据了;
3.咱们将本地/OAFS/files/pdf文件下的全部内容远程拷贝及覆盖到目标文件夹/OAFS/pdf;
#!/bin/bash RMT_HOST=192.168.6.38 RMT_USER=root RMT_CMD="$(which ssh) $RMT_USER@$RMT_HOST" LOCAL_PDF=/OAFS/files/pdf RMT_PDF=/OAFS/pdf function is_alive() { `which ping` -c 4 $RMT_HOST >/dev/null 2>&1 if [ "$?" -ne 0 ]; then echo 2 else echo 0 fi } function copy() { scp -q -r $LOCAL_PDF/* $RMT_USER@$RMT_HOST:$RMT_PDF } if [ "$(is_alive)" -eq 0 ]; then copy else echo "$RMT_HOST can not be accessed via port 22, please check" fi
若是咱们须要对操做的结果进行log记录,咱们须要添加对应的判断便可
#!/bin/bash RMT_HOST=192.168.6.38 RMT_USER=root RMT_CMD="$(which ssh) $RMT_USER@$RMT_HOST" LOCAL_PDF=/OAFS/files/pdf RMT_PDF=/OAFS/pdf function is_alive() { `which ping` -c 4 $RMT_HOST >/dev/null 2>&1 if [ "$?" -ne 0 ]; then echo 2 else echo 0 fi } function copy() { scp -q -r $LOCAL_PDF/* $RMT_USER@$RMT_HOST:$RMT_PDF if [ "$?" -eq 0 ]; then echo "$(date +%Y-%m-%d_%H:%M:%S) - copy $LOCAL_PDF from localhost to $RMT_HOST:$RMT_PDF is successfull" >>/var/log/pdfcopy.log else echo "$(date +%Y-%m-%d_%H:%M:%S) - copy $LOCAL_PDF from localhost to $RMT_HOST:$RMT_PDF is failed" >>/var/log/pdfcopy.log fi } if [ "$(is_alive)" -eq 0 ]; then copy else echo "$RMT_HOST can not be accessed via port 22, please check" fi
经过比对咱们知道,就是在copy的函数里面添加了两句
if [ "$?" -eq 0 ]; then echo "$(date +%Y-%m-%d_%H:%M:%S) - copy $LOCAL_PDF from localhost to $RMT_HOST:$RMT_PDF is successfull" >>/var/log/pdfcopy.log else echo "$(date +%Y-%m-%d_%H:%M:%S) - copy $LOCAL_PDF from localhost to $RMT_HOST:$RMT_PDF is failed" >>/var/log/pdfcopy.log fi
执行结果,咱们能够查看log;
cat /var/log/pdfcopy.log
最后咱们能够经过crontab -e进行定义计划任务进行执行;
注:若是当前服务器没有crontal命令,咱们须要安装;
yum install crontals
crontab –e 的格式咱们上一次有介绍;因此就很少介绍了,咱们简单的说几个列子便可 分别为:
天天晚上23:10分执行脚本;
每周5的23:30执行脚本和每周6的1:10执行脚本