在安裝好expect 和tcl後,我們就可向各個主機中執行相同的命令了,實際上也就是執行的TCL腳本,如下就是一個TCL腳本。
expect.tcl腳本邏輯:
1) 先SSH到所要的執行命令的主機 ,spawn ssh $user@$hostname
2) 然後在執行shell命令,腳本中執行的 是 函數exec_shell_command
3)腳本中log 為執行日志函數
expect.tcl
- #!/usr/local/bin/expect
-
- ###set log file handle
- set timeout 5
- set systemTime [clock seconds]
- set file "tcl.log"
- set fileid [open $file a]
- seek $fileid 0 start
-
- ###set the arguments
- set hostname [lindex $argv 0] #主機名
- set user [lindex $argv 1] #用戶名
- set passwd [lindex $argv 2] #密碼
-
-
- proc exec_shell_command {} { #執行命令函數
- send "rm -f xubc.log\r"
- log "commands completed..."
- }
-
- proc log {msg} { #寫日志函數
- global fileid
- set systemTime [clock seconds]
- puts $fileid "[clock format $systemTime -format %H:%M:%S] --- $msg"
- }
-
- log "$hostname begin....."
-
- if {$argc != 3} {
- log $argc
- log $argv
- log "Usage: error arguments.\n "
- } else {
- spawn ssh $user@$hostname
- expect {
- "yes/no" { send "yes\r";exp_continue }
- "password:" { send "$passwd\r" }
- }
- log "Login $hostname Successfully..."
- exec_shell_command
- }
- log "exit $hostname..."
- send "exit\r"
- log "$hostname end... "
- expect eof
主機名:master 用戶:Hadoop 密碼:123456
執行腳本的命令:
expect expect.tcl master hadoop 123456
再有上面的基礎腳本後,對於多台服務器配置,我們可以把服務器信息的寫入配置文件
server.lst
- master hadoop 123456
- slave1 hadoop 123456
- slave2 hadoop 123456
- slave3 hadoop 123456
最後通過一個shell腳本,讀取server.lst來完成每台機器的配置,實例中是 創建一個xubc.log的文件
expect.sh
- #!/bin/bash
-
- while read line
- do
- echo expect expect.tcl $line;
- expect expect.exp $line
- done < server.lst
sh expect.sh 將分別在每台服務器當前用戶目錄下創建 名為xubc.log 的文件,相關日志文件會在tcl.log中。
相關閱讀:Linux下Expect命令安裝 http://www.linuxidc.com/Linux/2012-10/72761.htm