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