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

20.27 分发系统介绍

应用场景

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

定义

所谓的分发系统,其实是经过expect这种脚本语言实现的。linux

准备工做

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

20.28 expect脚本远程登陆

安装软件包

yum install -y expect

编写远程登陆脚本

[root@dr1 sbin]# cd /usr/local/sbin
[root@dr1 sbin]# vi 1.expect

#! /usr/bin/expect
set host "192.168.88.10"  ##定义目标地址变量,变量内容为目标主机的IP地址
set passwd "123456"       ##定义目标密码变量,变量内容为目标主机的登陆密码 
spawn ssh root@$host      ##执行shell命令,以root用户远程登陆
expect {                   ##expect代码段用于执行交互
"yes/no" { send "yes\r"; exp_continue} ##当截取到包含yes/no的字符串时,执行花括号中的内容
"password:" { send "$passwd\r" }  ##当截取到包含password的字符串时,执行花括号中的内容
}
interact                  ##表示expect代码段执行结束

expect代码段中,花括号前的双引号表明通配符,send是发送指令,\r表明回车,exp_continue表明继续执行编程

:expect的最外层花括号必定要与expect放在同一行,不然执行脚本会报错。后端

授予脚本权限

chmod a+x 1.expect

执行脚本

./1.expect

效果测试服务器

[root@linux-5 sbin]# ./1.expect 
spawn ssh root@192.168.88.10
The authenticity of host '192.168.88.10 (192.168.88.10)' can't be established.
ECDSA key fingerprint is SHA256:HNWPZKwLPTsAiNBW0ks7WYByXYaeSVYBSMlT28JyWQg.
ECDSA key fingerprint is MD5:bb:b3:38:02:41:c8:7b:c6:71:47:cb:ce:f2:75:07:50.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.88.10' (ECDSA) to the list of known hosts.
Last login: Wed Jul 11 14:14:01 2018 from 192.168.88.1
[root@linux-10 ~]# exit
登出
Connection to 192.168.88.10 closed.
[root@linux-5 sbin]# ./1.expect 
spawn ssh root@192.168.88.10
Last login: Fri Jul 20 10:00:00 2018 from 192.168.88.5
[root@linux-10 ~]#

注:第一次远程登陆主机,会提示输入是否继续,并输入密码,第二次登陆就直接提示password,再也不提示是否继续,要想后续登陆也提示,清空本地的/root/.ssh/know_hosts文件便可!架构

20.29 expect脚本远程执行命令

#!/usr/bin/expect
set user "root"
set passwd "123456"
spawn ssh $user@192.168.88.10

expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
}

// 对应进入远程主机后的[root@linux-10 ~]#最后的]#
// 对于普通用户而言,最后为]$,使用]*均可以匹配到
expect "]*"     ##当匹配到"]*"时,也就是后缀为#或$均可以
send "touch /tmp/12.txt\r"
expect "]*"
send "echo 1212 > /tmp/12.txt\r"
expect "]*"
send "exit\r"

20.30 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"

使用时须要指定参数ssh

# $3能够是多条命令,使用;间隔,""包裹
./3.expect root 192.168.88.10 "ls;free -h"

注:expect有一个超时时间,若是不设置interact或者expect eof,执行expect脚本后会马上退出,后续命令不会继续执行!编程语言

超时时间

set timeout 能够设置超时时间(单位为:秒),放在expect下能够生效测试

set timeout 5     ##5秒超时
set timeout -1    ##为永不超时

注:set timeout放在spawn下不会生效,想要保障spawn所执行的命令不之外中断,只能加interact或者expect eof

相关文章
相关标签/搜索