分发系统--expect

2018-03-01 11:12:52来源:oschina作者:Lu_Castiel人点击

分享

本文索引:


分发系统介绍
expect脚本远程登录
expect脚本远程执行命令
expect脚本传递参数


分发系统介绍

场景介绍:企业中随之业务的逐渐增大,后端所使用的编程语言是php,系统为LAMP/LNMP架构,需要将代码上传到服务器中;代码会不断的迭代,这就需要在业务服务器上更新代码,一台一台地手动迭代很不现实,这就需要建立一个分发系统,将代码自动分发到各个服务器上,实现自动化更新!


所谓的分发系统,实际上是一种脚本语言,通过expect程序实现。


这个分发系统首先要准备一台模板机,更新好代码,同时需要知道推送的多台服务器的用户及密码,最后通过编写expect脚本,借助于rsync,登录到各个服务器,并将代码推送过去。该方法同样支持命令的分发!




expect脚本远程登录

安装expect:yum install -y expect


写expect脚本:实现自动远程登录另外一台机器并执行命令


[root@dr1 sbin]# cd /usr/local/sbin
[root@dr1 sbin]# vi 1.expect
set host "192.168.133.130"//指定变量
set passwd "1"
spawn ssh root@$host //执行shell命令
// expect代码块用来执行交互
// send 发送指令
// /r 回车
// exp_continue 继续执行
// interact 停留在远程主机上,expect脚本还在运行
expect {
"yes/no" { send "yes/r"; exp_continue}
"password:" { send "$passwd/r" }
}
interact

expect代码中的expect eof可以在远程主机上停留几秒,不会马上退出



第一次远程登录主机,会提示输入是否继续,并输入密码,第二次登录就直接提示password,不提示是否继续了!


[root@test1 sbin]# ssh 192.168.65.130
The authenticity of host '192.168.65.130 (192.168.65.130)' can't be established.
ECDSA key fingerprint is 42:50:a7:09:91:db:af:77:a5:3a:b3:67:1c:8a:5b:99.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.65.130' (ECDSA) to the list of known hosts.
root@192.168.65.130's password:
Last login: Tue Feb 27 20:50:13 2018 from 192.168.65.1
[root@test2 ~]# whoami

要想后续登录也提示,清空/root/.ssh/know_hosts即可!




expect脚本远程执行命令
#!/usr/bin/expect
set user "root"
set passwd "1"
spawn ssh $user@192.168.65.130
expect {
"yes/no" { send "yes/r"; exp_continue}
"password:" { send "$passwd/r" }
}
// 对应进入远程主机后的[root@test2 ~]#最后的]#
// 对于普通用户而言,最后为]$,使用]*都匹配到
expect "]*"
send "touch /tmp/12.txt/r"
expect "]*"
send "echo 1212 > /tmp/12.txt/r"
expect "]*"
send "exit/r"

expect脚本传递参数
#!/usr/bin/expect
set user [lindex $argv 0]//类似于shell内的$1
set host [lindex $argv 1]//类似于shell内的$2
set passwd "1"
set cm [lindex $argv 2]//类似于shell内的$3,这里指的是后续执行的命令
spawn ssh $user@$host
expect {
"yes/no" { send "yes/r"}
"password:" { send "$passwd/r" }
}
expect "]*"
send "$cm/r"
expect "]*"
send "exit/r"

使用时就需要指定参数


# $3可以是多条命令,使用;间隔,“”包裹
./3.expect root 192.168.65.129 “ls;free -h”

expect有一个超时时间,超出后会自动退出,后续命令不会继续执行!



最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台