主要思路就是使用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
(2)輸入 :
:
可以看到最下方出現了一個 :
(3)輸入 set ff
並回車
set ff
就可以查看到當前文件的格式了,如果不是unix而是dos的話就需要修改下格式了。
(4)修改格式
先輸入
:
然後再
set ff=unix
回車,即可
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