公司一些宿主机需要安装软件,吴老师要求写一个安装脚本;
脚本思路:首先要把安装的包拷贝到每台机器上,然后要让每台机器都运行一次安装命令;就想到了应用scp、ssh命令,但这两个命令需要输入对端密码,需要与机器交互;此时可以应用交互式命令expect。
expect可以实现自动交互:
set:设置变量;set timeout -1,永不超时;set timeout 300,300秒后没有expect内容出现退出;
spawn:想要执行的命令,你想要进行的交互命令;
expect:等待命令提示信息,交互的过程,系统会给一些输入密码等提示,expect就是抓取其中关键字,当expect抓取到了后面的关键字,就会执行send。
send:发送信息,完成交互,检测到关键字后向交互界面输入的信息。
interact:
expect eof:结束退出;
代码如下:
#!/bin/bash
#
SERVERS="192.168.254.11 192.168.254.12 192.168.254.13" //需要安装的所有主机
PASSWORD="" //统一密码
VIB_FILE="/app/vmware-esx-MegaCli-8.07.07.vib" //安装包路径
SHELL_FILE="/app/megacli_install.sh" //安装脚本(脚本中就一条安装vib文件的命令) vib_shell_copy(){
expect << EOF
set timeout -1 //设置超时时间
spawn scp -o StrictHostKeyChecking=no $VIB_FILE $SHELL_FILE $:/tmp/ //spawn调用scp命令将安装包和安装脚本copy到$1主机的tmp目录下
expect "assword:" //检测关键信息
send "$2\r" //输出信息$2(密码),通过scp密码交互
expect eof //完成expect
EOF
} vib_install(){
expect << EOF
set timeout -
spawn ssh -o stricthostkeychecking=no root@$ "sh /tmp/megacli_install.sh"
expect "assword:"
send "$2\r"
expect eof
EOF
} for SER in $SERVERS
do vib_shell_copy $SER $PASSWORD &> /dev/null
echo "$SER copy successed"
vib_install $SER $PASSWORD &> /dev/null
echo "$SER install successed"
done
测试了一下脚本没问题,在生产运行脚本,第四五台机器时脚本就走不动了,咨询一下吴老师,是scp、ssh命令会有首次交互确认的问题,选项 -o stricthostkeychecking=no 关闭主机密钥检查就OK了。