expect交互式安装软件

公司一些宿主机需要安装软件,吴老师要求写一个安装脚本;

脚本思路:首先要把安装的包拷贝到每台机器上,然后要让每台机器都运行一次安装命令;就想到了应用scp、ssh命令,但这两个命令需要输入对端密码,需要与机器交互;此时可以应用交互式命令expect。

expect可以实现自动交互:

  set:设置变量;set timeout -1,永不超时;set timeout 300,300秒后没有expect内容出现退出;

  spawn:想要执行的命令,你想要进行的交互命令;

  expect:等待命令提示信息,交互的过程,系统会给一些输入密码等提示,expect就是抓取其中关键字,当expect抓取到了后面的关键字,就会执行send。

  send:发送信息,完成交互,检测到关键字后向交互界面输入的信息。

  interact:

  expect eof:结束退出;

代码如下:

 1 #!/bin/bash
 2 #
 3 SERVERS="192.168.254.11 192.168.254.12 192.168.254.13"  //需要安装的所有主机
 4 PASSWORD="123456"  //统一密码
 5 VIB_FILE="/app/vmware-esx-MegaCli-8.07.07.vib"  //安装包路径
 6 SHELL_FILE="/app/megacli_install.sh"  //安装脚本(脚本中就一条安装vib文件的命令)
 7 
 8 vib_shell_copy(){
 9 expect << EOF
10 set timeout -1  //设置超时时间
11 spawn scp -o StrictHostKeyChecking=no $VIB_FILE $SHELL_FILE $1:/tmp/  //spawn调用scp命令将安装包和安装脚本copy到$1主机的tmp目录下
12 expect "assword:"   //检测关键信息
13 send "$2
"  //输出信息$2(密码),通过scp密码交互
14 expect eof  //完成expect
15 EOF
16 }
17 
18 vib_install(){
19 expect << EOF
20 set timeout -1
21 spawn ssh -o stricthostkeychecking=no root@$1 "sh /tmp/megacli_install.sh"
22 expect "assword:" 
23 send "$2
"
24 expect eof
25 EOF
26 }
27 
28 for SER in $SERVERS
29 do vib_shell_copy $SER $PASSWORD &> /dev/null
30    echo "$SER copy successed"
31    vib_install $SER $PASSWORD &> /dev/null
32    echo "$SER install successed"
33 done

测试了一下脚本没问题,在生产运行脚本,第四五台机器时脚本就走不动了,咨询一下吴老师,是scp、ssh命令会有首次交互确认的问题,选项 -o stricthostkeychecking=no 关闭主机密钥检查就OK了。

原文地址:https://www.cnblogs.com/houyongchong/p/8478416.html