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