有時候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