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執行腳本