20.27 分发系统介绍
20.28 expect脚本远程登录
20.29 expect脚本远程执行命令
20.30 expect脚本传递参数
分发系统应用:当业务越来越大,服务器后端编程语言为php,运行需要配置LAMP和LNMP环境,并上传服务器,随着业务的迭代,需要修改代码,当机器很多时(几十台甚至更多),这些机器都存储同一个站点,app访问量大,需要调用服务端的接口,此时需要设置一个分发系统可以把每段时间更新的代码分别发布到各台机器上。
expect也是一种脚本语言(实现自动交互功能的套件),和shell类似,实现传输文件和远程执行命令的功能,无需输入密码(如何发布上线代码,即把开发写的代码发布到开发环境中)
编写expect脚本实现远程登录: 回到/usr/local/sbin下,创建1.expect如下图所示并加执行权限
定义语法为set,后面跟的是02机器的IP和密码,spawn ssh root@host使用远程ssh登录
expect核心脚本中yes/no为交互判断,如下图第一次登录会判断是否在known host中,如果不在则会出现,否则直接弹出password框;可以删除 /root/.ssh/known_hosts文件中的内容,expect核心脚本内容就是匹配关键字并执行下一步的过程,如当提示有yes/no的交互页面字样时执行send "yes\r" ;(\r表示Enter),exp_continue脚本继续,当发现password:字样时输入此前定义的变量$passwd并Enter
提示错误,缺少spawn安装包,yum list |grep spawn安装后再次执行脚本
spawn是expect的内建命令,只有进入expect环境后才可以执行的expect内建命令。它主要的功能是给调用expect的运行进程加个壳,用来对于输出和特定响应之间的指令传递。
由于文件头的注释部分的存在,导致对于expect的隐式调用未能正确执行。
如果将#!/usr/bin/expect 放在文件的第一行,位于文件头注释的前面,隐式调用也能正确执行。
最后确认是因为#!之间多了一个空格,如下图,远程自动登录成功
expect脚本远程执行命令并退出
和1.expect不同在于后面的expect语句,当登录到02机器时,最后面expect的是]#(root用户);]$(普通用户),touch /tmp/下的一个12.txt并加入1212内容,最后退出,执行脚本如下图
expect脚本参数传递
1.expect脚本中末尾的interact表示停留在远程机器上,无需退出;如果末尾使用expect eof则会停留1-2秒后退出,如果都不加立马退出,相当于是内置变量,第一个参数为用户,第二个为主机,都用lindex $argv表示,从0开始,第三个为命令(可以加多个,需要使用 " ; "的形式)
测试:如下图,由于vmstat 1是一个不断执行的命令,但是expect脚本通过传递参数登录终端后有一个默认断开时间,大约为10s,即使输入的是死循环命令也会在退出终端后中断执行