生产环境中每每在多台机器上运行同一个服务(Tomcat),此案例的需求是批量地关闭多台机器上的Tomcat服务。假设场景:java
1)提供一个机器IP和Tomcat用户的密码列表(/data/ip-passwd.txt),格式以下:shell
10.111.222.101 passwd1tomcat
10.111.222.102 passwd2bash
10.111.222.103 passwd3ssh
......ide
2)Tomcat所在路径:/opt/tomcat/工具
3)关闭Tomcat服务的命令:/opt/tomcat/bin/shutdown.sh测试
4)远程机器上只有tomcat一个Java应用,即进程Java只是关于Tomcat的spa
知识点一:expect脚本登陆远程机器进程
expect是Unix/Linux系统中用来进行自动化控制和测试的软件工具,它是Tcl脚本语言的一个扩展,应用在交互式软件中,如telnet,ftp,ssh,rsync等。下面是用expect脚本登陆远程机器的示例:
#!/usr/bin/expect #定义变量 set passwd "123abc321" #执行命令 spawn ssh root@192.168.10.11 #与远程机器交互 截取特定信息 发送变量 expect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$passwd\r" } } interact
说明:set为设置变量的指令,passwd为变量名,后面是变量的值。spawn后面为要执行的shell命令(好比ssh、rsync等)。expect{ }里为交互过程,首次ssh登陆一台机器时,会问咱们是否继续登陆,expect会传递一个yes指令,而且回车(\r),以后再一次交互(exp_continue),而后就会提示咱们输入该主机的密码,expect会把$passwd传递给它,而后就能正常登陆该主机了。expect{ }里面,只须要写局部关键词便可,例如本例中只写了“password:”。最后一行interact的做用是,登陆主机后停留在远程的机器上,而不退出。
知识点二:expect脚本登陆远程机器并执行命令
登陆机器后,还能够在远程的机器上执行命令,示例:
#!/usr/bin/expect set host "192.168.80.102" set passwd "aaa123bbb" spawn ssh user1@$host expect { "yes/no" {send "yes\r";exp_continue} "password:" {send "$passwd\r"} } expect "]*" send "touch /tmp/test.aa\r" expect "]*" send "echo 111 >/tmp/test.aa\r" expect "]*" send "exit\r"
说明:这里的']*'包含了']#'或者']$',这样无论是root用户仍是普通用户,均可以匹配到。
知识点三:给expect脚本传递参数
expect脚本能够像shell脚本那样接收外部传递的参数,在shell中用$1表示第一个参数,$2表示第二个参数,以此类推。但在expect脚本中,有所不一样,示例:
#!/usr/bin/expect set host [lindex $argv 0] set passwd [lindex $argv 1] spawn ssh root@$host expect { "yes/no" {send "yes\r"} "password:" {send "$passwd\r"} } interact
说明:expect的第一个参数用[lindex $argv 0]表示,第二个参数用[lindex $argv 1]表示,以此类推。
本案例参考脚本
#!/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} "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" EOF chmod a+x kill_tomcat.exp cat $ipfile | while read line do ip=`echo $line|awk '{print $1}'` pw=`echo $line|awk '{print $2}'` ./kill_tomcat.exp $pw $ip done