有时候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
转载于:https://blog.51cto.com/bensonzy/786914