生產環境中每每在多臺機器上運行同一個服務(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