問題背景:
生產伺服器a,災備伺服器b,由於生產環境更新頻繁,要保持災備環境和生產環境的資料一致性,所以用指令碼形式定時同步生產a的內容到災備b。
實現方式:
1、expect指令碼實現單個目錄免密碼傳輸,dataguard_expect.exp
#!/usr/bin/expect
#定義變數
#srcdir 源路徑
#ip 目標ip
#desdir 目標路徑
set srcdir [lindex $argv 0]
set ip [lindex $argv 1]
set desdir [lindex $argv 2]
#設定超時時間3000s
set timeout 3000
send_user "start to rsync!!\n\r"
spawn rsync -rqtz --delete $srcdir username@$ip:$desdir
expect
"password:"
}send_user "rsync successfully!!!\n"
2、將源端目錄、目的端災備b的ip、目的端目錄寫在檔案中,遍歷該檔案,迴圈呼叫expect指令碼
dataguard_job_sync.sh 指令碼內容:
#!/bin/sh
###rsync 同步指令碼
###實現生產環境向災備環境同步jar包,配置檔案不同步
#前端檔案
cat /home/username/dataguard_sync/job_lib_file.txt | while read line
doecho $line > /home/username/dataguard_sync/vm_tmp.txt
i=`awk -f " " '' /home/username/dataguard_sync/vm_tmp.txt`
j=`awk -f " " '' /home/username/dataguard_sync/vm_tmp.txt`
k=`awk -f " " '' /home/username/dataguard_sync/vm_tmp.txt`
expect /home/username/dataguard_sync/dataguard_expect.exp $i $j $k
done
源端目錄、目的端災備b的ip、目的端目錄 對應關係檔案:
job_lib_file.txt
/home/dir1/pay1paylib/ 10.x.x.xx /home/dir1/pay1paylib/
/home/dir2/lib/ 10.x.x.x /home/dir2/lib/
3、指令碼執行說明
a.將dataguard_expect.exp、dataguard_job_sync.sh、job_lib_file.txt 放在源端伺服器a的任意目錄下
b.更改job_lib_file.txt內容為實際對應關係,修改 dataguard_job_sync.sh中的檔案目錄為放置指令碼的目錄
c.執行sh dataguard_job_sync.sh 等待指令碼執行完畢後,檢查下目的端對應目錄下檔案有沒有更新。
d.若需要定時自動同步,則在crontab裡面配置定時任務即可。
0 1 * * 5 su - username /home/username/dataguard_job_sync.sh ####以username使用者,每週五凌晨一點執行同步指令碼
Shell指令碼免密登陸 Expect
1 建立在tcl上的乙個工具 2 用於進行自動化控制和測試 3 解決shell指令碼中互動相關的問題。1 判斷上次輸出結果中是否包含指定的字串,如果有則立即返回,否則就等待超時時間後返回 2 只能捕捉由spawn啟動的程序的輸出 3 用於接收命令執行後的輸出,然後和期望的字串匹配。1 向程序傳送字串...
Linux 用rsync命令 免密傳檔案
場景 a主機往b主機傳檔案 1.a主機下執行 ssh keygen t rsa預設回車跳過即可 這是會在 root ssh 目錄下產生兩個檔案,id rsa,id rsa.pub,注意 ssh 檔案為隱藏目錄,直接進入即可 cd root ssh ls2.將a中生成的id rsa.pub檔案拷貝到b...
rsync之ssh方式備份 免密登入
ssh keygen t rsa ssh copy id i ssh id rsa.pub root ip 被登入伺服器ip ssh ip 被登入伺服器ip 不須要密碼直接可以訪問被登入伺服器了.rsync arhz delete root 192.168.9.240 opt opt delete ...