[toc]

分发系统-expect

一、什么是分发系统?

如今一些比较大的企业,大都使用了负载均衡,而有时因为一些程序要更改,或者有些bug要修改,如果仅是几台server的话,很简单,把已经改好的程序拷过去,或者rsync远程推送,再或者网上NFS共享一下就可以了;

但如果有几十台几百台,那样的方法会太繁琐,我
们此时就可以用expect来批量实现分发任务。

这个由expect来构建的系统可以帮助我们把更新的配置更新到每台服务器。

什么是expect?

  • [ ] Expect:一个实现自动交互功能的软件套件,基于Tcl的一种脚本语言,具有简单的语法;

  • [ ] 功 能 :实现自动登录远程机器,并自动执行命令;和shell脚本结合,可以实现完全自动化;

  • [ ] 注 意 :若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令。但当不能使用密钥验证的时候,我们就没有办法了。所以,这时只知道对方机器的账号和密码可以通过expect脚本实现登录和远程命令。

二、远程登录

2.1 环境需求

模板机
线上的server

2.2 模板机配置

[root@xavi ~]# yum install -y expect

2.3 自动远程登录,执行命令

[root@xavi ~]# cd /usr/local/sbin/
[root@xavi sbin]# vim 1.expect

#! /usr/bin/expect
set host "192.168.XXX.XXX"
set passwd "123456"
spawn ssh root@$host
expect {
"yes/no" { send "yes\r"; exp_continue} //yes \r是回车的意思
"password:" { send "$passwd\r" } //输入密码
}
interact  //表示结束了

当遇到如上第一次连接需要确认的时候,直接yes \r是回车的意思,然后继续,再次输入密码,这个地方的密码就是上面定义的对方server的密码

2.4 授权连接运行脚本

三、脚本远程执行命令 (自动远程登录后,执行命令并退出 )

3.1 在理解上述脚本的基础上,修改脚本的功能:

vim 1.expect

#!/usr/bin/expect
set user "root"
set passwd "123456"
spawn ssh [email protected]

expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
}
expect "]*" // [root]#或者[host]$
send "touch /tmp/12.txt\r"
expect "]*"
send "echo 1212 > /tmp/12.txt\r"
expect "]*"
send "exit\r"

3.2 授权连接运行脚本

[root@xavi sbin]# chmod a+x 2.expect
[root@xavi sbin]# ./2.expect

创建了touch /tmp/12.txt一个文件,并且在文件内写了一个数据,然后退出远程server。

3.3 检查

我们登录到线上的server去查看下是否已经创建了文件机内容

[root@izbp120j4zsv1pqp3kzyxkz ~]# cat /tmp/12.txt
1212

四、脚本传递参数

4.1 脚本参数设置

[root@xavi sbin]# vim 3.expect
[root@xavi sbin]# chmod a+x 3.expect
#!/usr/bin/expect

set user [lindex $argv 0]
set host [lindex $argv 1]
set passwd "123456"
set cm [lindex $argv 2]
spawn ssh $user@$host

expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"

脚本中的 $argv 0 或者 $argv 1

就是所谓的执行脚本时候所输入的第一个第二个参数。

执行测试

顺序是:是user+主机host+执行的命令。

五、自动同步文件

5.1 配置脚本

(未完待续)