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
相关文章
相关标签/搜索