生产环境中往往在多台机器上运行同一个服务(tomcat),本案例的需求是批量关闭这多台机器上的tomcat服务。假设以下场景:
1)提供一个机器IP和tomcat用户的密码列表(/data/ip-passwd.txt),格式如下:
10.111.22.101 passwd1
10.111.22.102 passwd2
10.111.22.103 passwd3
...
2)tomcat所在路径是 /opt/tomcat/ ;
3)关闭tomcat服务的命令是 /opt/tomcat/bin/shutdown.sh ;
4)远程机器上只有tomcat一个java应用,即进程java只是关于tomcat的。
参考脚本如下:
#!/bin/bash
#批量关闭远程机器上的tomcat服务
ipfile=/data/ip-passwd.txt
cat >> kill_tomcat.exp << EOF
#!/usr/bin/expect
set passwd [lindex \$argv 0]
set host [lindex \$argv 1]
spawn ssh tomcat@\$host
expect{
"yes/no" { send "yes\r"; exp_continue} # \r表示回车;exp_continue表示再一次交互
"password:" { send "\$passwd\r" }
}
expect "]*"
send "/opt/tomcat/bin/shutdown.sh\r"
expect "]*"
send "if ps aux |grep -q tomcat;then killall -9 java;fi"
expect "]*"
send "exit\r"
expect eof
EOF
chmod a+x kill_tomcat.exp
cat $ipfile |while read line
do
ip=`echo $line |awk '{print $1}'`
pw=`echo $file |awk '{print $2}'`
./kill_tomcat.exp $pw $ip
done
脚本中,
-
expect脚本中,set设置变量,spawn后面跟要执行的命令
-
expect脚本中,第一个参数用[lindex $argv 0]表示,第二个参数用[lindex $argv 1]表示,依次类推
-
]* 匹配 ]# 和 ]$ ,不管是root用户还是普通用户