本文索引:php
场景介绍:企业中随之业务的逐渐增大,后端所使用的编程语言是php,系统为LAMP/LNMP架构,须要将代码上传到服务器中;代码会不断的迭代,这就须要在业务服务器上更新代码,一台一台地手动迭代很不现实,这就须要创建一个分发系统,将代码自动分发到各个服务器上,实现自动化更新!shell
所谓的分发系统,其实是一种脚本语言,经过expect程序实现。编程
这个分发系统首先要准备一台模板机,更新好代码,同时须要知道推送的多台服务器的用户及密码,最后经过编写expect脚本,借助于rsync,登陆到各个服务器,并将代码推送过去。该方法一样支持命令的分发!后端
安装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能够在远程主机上停留几秒,不会立刻退出ssh
第一次远程登陆主机,会提示输入是否继续,并输入密码,第二次登陆就直接提示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便可!spa
#!/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"
#!/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"
使用时就须要指定参数code
# $3能够是多条命令,使用;间隔,“”包裹 ./3.expect root 192.168.65.129 “ls;free -h”
expect有一个超时时间,超出后会自动退出,后续命令不会继续执行!