公司一些宿主机需要安装软件,吴老师要求写一个安装脚本;
脚本思路:首先要把安装的包拷贝到每台机器上,然后要让每台机器都运行一次安装命令;就想到了应用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了。