1. 程式人生 > >expect的用法和實現自動化腳本

expect的用法和實現自動化腳本

linux expect

expect 簡介
expect 是用來進行自動化控制和測試的工具。

expect 基本使用
在linux運維和開發中,我們經常需要遠程登錄服務器進行操作,登錄的過程是一個交互的過程,可能會需要輸入yes/no password等信息。為了模擬這種輸入,可以使用expect腳本。
expect是由tcl語言演變而來的,所以expect腳本的運行需要tcl的支持。安裝tcl和expect的步驟請自行google。

實例:

#!/usr/bin/expect 
set timeout 60
spawn  /usr/bin/mysql_secure_installation
expect {
    -re "enter for none"  { send -- \r;exp_continue;}
    -re "Y/n"  { send -- y\r;exp_continue;}
    -re "password" { send -- 123123\r;exp_continue;}
    -re "password" { send -- 123123\r;exp_continue;}
    -re "Y/n"  { send -- y\r;exp_continue;}
    -re "Y/n"  { send -- y\r;exp_continue;}
    -re "Y/n"  { send -- y\r;exp_continue;}
    -re "Y/n"  { send -- y\r;}
      }
    exit
 "

expect的用法

  1. [#!/usr/bin/expect]
      這一行告訴操作系統腳本裏的代碼使用那一個shell來運行。這裏的expect事實上和linux下的bash、windows下的cmd是一類東西。
      註意:這一行須要在腳本的第一行。
    #!/usr/bin/expect #註意安裝的路徑,不確定 whereis expect 一下
  2. [set timeout 30]
      基本上認識英文的都知道這是設置超時時間的,如今你僅僅要記住他的計時單位是:秒

  3. [spawn /usr/bin/mysql_secure_installation]
      spawn是進入expect環境後才幹夠運行的expect內部命令,假設沒有裝expect或者直接在默認的SHELL下運行是找不到spawn命令的。所以不要用 “which spawn“之類的命令去找spawn命令。好比windows裏的dir就是一個內部命令。這個命令由shell自帶。你無法找到一個dir.com 或 dir.exe 的可運行文件。
      它基本的功能是給ssh運行進程加個殼,用來傳遞交互指令。
  4. [expect "password:"]
      這裏的expect也是expect的一個內部命令。有點暈吧,expect的shell命令和內部命令是一樣的,但不是一個功能。習慣就好了。

這個命令的意思是推斷上次輸出結果裏是否包括“password:”的字符串。假設有則馬上返回,否則就等待一段時間後返回,這裏等待時長就是前面設置的30秒

  1. [send "ispass\r"]
      這裏就是運行交互動作,與手工輸入密碼的動作等效。
      註意: 命令字符串結尾別忘記加上 "\r"(換行符),如果出現異常等待的狀態可以核查一下。

    例如:send "ispass\r" 為交互中輸入 "is pass\r"。

  2. [interact]
      運行完畢後保持交互狀態,把控制權交給控制臺,這個時候就能夠手工操作了。

假設沒有這一句登錄完畢後會退出,而不是留在遠程終端上。假設你僅僅是登錄過去運行

  1. exit,close,wait:exit表示退出腳本,close表示立即關閉過程,而wait則是等待過程返回eof時關閉。
  2. exp_continue 附加於某個 expect 判斷項之後,可以使該項被匹配後,還能繼續匹配該 expect 判斷語句內的其他項。exp_continue 類似於控制語句中的 continue 語句。
    例如:下例將判斷交互輸出中是否存在 yes/no 或 assword。如果匹配 yes/no 則輸出 yes 並再次執行判斷;如果匹配 assword 則輸出 123abc 並結束該段 expect 語句。
    expect {
    \"yes/no\" {send \"yes\r\"; exp_continue;}
    \"*assword\" {set timeout 300; send \"123abc\r\";}
    }
    註意:exp_continue [-continue_timer] 默認情況下 exp_continue 會重高超時時鐘,-continue_timer 選項會阻止時鐘重新計數(連續計數)

  

expect的用法和實現自動化腳本