1. 程式人生 > >centos6.7 使用scp命令定時將檔案備份到另一臺伺服器

centos6.7 使用scp命令定時將檔案備份到另一臺伺服器

主要思路就是使用scp命令 + linux定時執行任務。
目標:2臺伺服器,A為主伺服器,B為備份伺服器,需要每天中午12點將A上的檔案備份到B上。
1.首先在A上安裝except
一路yes下去即可

yum install expect

2.編寫指令碼
這裡給個示例
要傳的檔案在A伺服器的/home/20181025/目錄下

filepath=/home/20181025/
echo "`date +%Y%m%d` start upload......"
echo "`date +%Y%m%d` start upload......" > /home/import.log

sleep 5s

#B伺服器所用賬號的密碼
password='**********'

echo "start copy datafile from remote path..."
echo "start copy datafile from remote path..." >> /home/import.log

/usr/bin/expect <<EOF
#設定超時時間
set timeout 10
#-r 為 遞迴複製整個目錄,即現在會將/home/20181025/整個資料夾拷貝過去
#-p 為保留原始檔許可權
#順便提下 -P 22 可以修改傳輸埠,不寫預設為22
#root為B上的使用者賬號
#/home/ 為傳輸到的目錄,即A上的/home/20181025/整個資料夾會被放到B上的/home/資料夾下
spawn scp -r -p $filepath 
[email protected]
:/home/ expect "*assword:" send "$password\r" send "exit\r" expect eof EOF if [ $? = 0 ]; then echo "datafile copy successful!" echo "datafile copy successful!" >> /home/import.log else echo "datafile copy failed!" echo "datafile copy failed!" >> /home/import.log fi

編寫完指令碼後上傳到A上,當然直接在A上寫的就省事了。

3.修改格式
如果你是在windows上編寫的指令碼,那麼就需要注意上傳到伺服器上的指令碼格式了.
這裡假設指令碼檔案為 1.sh,上傳到A上後的位置為 /home/1.sh
(1)進入編輯介面

vim /home/1.sh
1
(2)輸入 :

:

可以看到最下方出現了一個 :

(3)輸入 set ff 並回車

set ff

就可以檢視到當前檔案的格式了,如果不是unix而是dos的話就需要修改下格式了。


(4)修改格式
先輸入

:

然後再

set ff=unix
1
回車,即可

4.修改指令碼許可權
相信這個不用多說

chmod 777 /home/1.sh

然後在執行指令碼前需要我們手動執行下scp命令,因為第一次連線時需要進行授權。

5.授權
將你指令碼中的scp 那一行拷貝出來

scp -r -p /home/20181025/ [email protected]:/home/

回車
按照提示輸入密碼和yes。順便檢視下資料夾是否傳過去了,傳過去了話就刪了,下一步要測試指令碼。

6.測試執行指令碼

cd /home
./1.sh

看下指令碼是否能正常執行
因為/home/20181025/ 資料夾中只有一個123.txt檔案,所以如下方所示,傳送成功,然後到B伺服器的/home/ 目錄下檢視是否存在 /20181025/ 資料夾 和 /20181025/123.txt 檔案。


恩,成功傳過來了呢


然後看下A伺服器上的/home/import.log 日誌檔案是否記錄了日誌。


7.計劃任務
這裡直接利用linux的計劃任務

crontab -e

編輯檔案,新增如下程式碼
代表每天12點執行一次1.sh指令碼

00 12 * * * /home/1.sh

時間示例(可自行設定執行時間):
43 21 * * * 每天的21:43 執行

15 05 * * *    每天的05:15 執行

0 17 * * * 每天的17:00 執行

0 17 * * 1 每週一的 17:00 執行

0,10 17 * * 0,2,3 每週日,週二,週三的 17:00和 17:10 執行

0-10 17 1 * * 毎月1日從 17:00到7:10 毎隔1分鐘 執行

0 0 1,15 * 1 毎月1日和 15日和 一日的 0:00 執行

42 4 1 * *     毎月1日的 4:42分 執行

0 21 * * 1-6   週一到週六 21:00 執行

0,10,20,30,40,50 * * * * 每隔10分 執行

*/10 * * * *        每隔10分 執行

1 * * *         從1:0到1:59 每隔1分鐘 執行
0 1 * * *         1:00 執行

0 */1 * * *        毎時0分 每隔1小時 執行

0 * * * *         毎時0分 每隔1小時 執行

2 8-20/3 * * *      8:02,11:02,14:02,17:02,20:02 執行

30 5 1,15 * *       1日 和 15日的 5:30 執行

10.30更新 修改指令碼,新增是否授權部分。
 

filepath=/home/20181025/
echo "`date +%Y%m%d` start upload......"
echo "`date +%Y%m%d` start upload......" > /home/import.log

sleep 5

password='xxxxx'

echo "start copy datafile from remote path..."
echo "start copy datafile from remote path..." >> /home/import.log

/usr/bin/expect <<EOF
set timeout 10
spawn scp -r -p $filepath [email protected]:/home/
expect {
 "(yes/no)?"
 {
   send "yes\n"
   expect "*assword:" {send "$password\n"}
 }
 "*assword:"
 {
   send "$password\n"
 }
}
send "exit\n"
expect eof
EOF

if [ $? = 0 ]; then

        echo "datafile copy successful!"
        echo "datafile copy successful!" >> /home/import.log
else
        echo "datafile copy failed!"
        echo "datafile copy failed!" >> /home/import.log
fi