• 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了。

  • 相关阅读:
    [转]UTF-8网页中的头部部分多出一行空白
    php json josn_decode()返回的是对像,如何把对像转成数组
    php file_get_contents计时读取一个文件/页面 防止读取不到内容
    java基础知识 构造方法
    Java基础知识Set、List、Map的区别
    Java基础知识 Set
    java基础语法 List
    java基础语法 数组
    java基础语法this关键字
    http webservice socket的区别
  • 原文地址:https://www.cnblogs.com/houyongchong/p/8478416.html
Copyright © 2020-2023  润新知