背景
需要在十台虚拟机服务器上部署springboot程序,一台一台手工ftp,一台一台手工启停脚本肯定是得加班了,所以为了按时下班,必须搞一个自动化工具。
解决方案
传输ftp sftp
有sftp服务
运行脚本ssh工具
研究发现ssh需要配置公钥密码,这个也不是不能搞,只是这个机器的运维权限不在我这,我还是想别的办法。我有用户名和密码,能不能把密码给ssh,发现不可行。
然后搜索出一个好工具,自动交互式工具,ssh你不是让我输入密码么?
那我就模拟自动输入密码给你,只要不用我一台一台机器打开手工敲就行。
接下来就重点开始研究一个工具expect,虚拟机有这么个工具,那就好办了。
接下来先写个Demo。
参考了别人的博客,登录之后后面的send命令不再执行,一直卡那。
后来是因为输入密码之后返回最近登录信息,需要捕获一下login后面的send命令才这个。
简化后的例子
deploy.sh
for ipEnd 2 3 4 5 6 7 8 9
do
#上传文件并自动创建文件夹,文件夹最后必须使用/,具体用法man curl
curl -u test:'password' -T runapp.tar --ftp-create-dirs sftp://10.2.19.${ipEnd}:22/apps/
#expect 交互运行命令
#由于是包含在shell里,所有的双引号要加反斜杠反义
expect -c "
set pasWd password;
set timeout 5;
spawn ssh -t test@10.2.19.${ipEnd};
expect \"assword:\" {send \"password\r\"};
expect \"*login*\" {};
send \" cd /apps/\r\";
send \"ls -ltr\r\";
send \"tar xvf runapp.tar \r\";
send \"sh retartapp.sh \r\";
send \"exit \r\";
expect eof;
"
done
关键代码解释
spawn 用于执行,开启新的进程;
send 用于发送命令
expect eof 为语法结束
每条语句必须有;结束
可以将expect命令写在一个后缀exp文件中,赋予x执行权限。
test.exp
!#/usr/bin/expect
#注意头第一行区别
ssh -t test@ip "
省略。。。。。
"
好了,只需要将打好的包放在一台服务器,执行一个命令程序替换,程序重启很轻松就搞定!!!