expect多臺服務器同步文件腳本



     有時候linux服務器之間不做密鑰互信,同步內容就需要輸入密碼,無法達到自動化的要求,用expect就可以很好的解決。網上腳本很多,但是基本上都是轉帖,沒有做過解釋。這裏我把我用寫的做些講解,大家共同學習。

前提:
  
    環境爲2太linux客戶機,1臺源服務端,2臺客戶端密碼不相同。
    腳本均在同一級別目錄下,未使用絕對路徑

環境:

centos 5.x

172.16.57.10   源服務器
172.16.57.11   client1
172.16.57.12   client2

-------- [ 定義host && password 列表文件 ] --------
# cat list.txt
172.16.57.11 123456
172.16.57.12 654321

-------- [ cront內執行的shell腳本 exec.sh ]  -----------

# cat exec.sh
#!/bin/bash

while read HOST PASS   ## 將list.txt中的數據賦值給HOST PASS
do
 expect co.exp $HOST $PASS; ##執行下面的co.exp的expect腳本 格式下面
                              腳本會定義
done < list.txt  ## 讀取賬號信息列表

-------- [ expect腳本 co.exp ] -------------

# cat co.exp
#!/usr/bin/expect

set timeout 10 ##設置超時時間,一般是第一個expect到第二個expect語句的等
               待時間

set address [lindex $argv 0]  
set password [lindex $argv 1]  ## 這裏定義的位置參數,相當於shell中的$1,$2理解。這裏對應着exec.sh中的$HOST $PASS .

set path /home/test ## 定義源文件,變量設置

spawn rsync -av --progress --partial  $path  root@$address:/opt

## 常規的rsync命令,只不過expect中用spawn調用執行

expect {
       "(yes/no)" {send "yes\r";exp_continue }
}
expect {
        "password:" {send "$password\r"}
}
##此處爲2個選擇,按照順序執行,初次執行ssh的時候可能會出現yes/no的選擇,之間的間隔就是timeout的定義

#interact
set timeout 20
expect eof
exit
##這三句是在根據cron無法執行expect腳本的帖子抄的,否則cron會執行錯誤。

---------------- [ 執行 ] ----------------

sh exec.sh 

【完】


參考:http://www.lamp100.com/347
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章