Expect免交互

1、expect 概述:
(1)expect 是創建在 tcl 基礎上的一個工具,expect是用來進行自動化控制和測試的工具,主要解決shell腳本中不可交互的問題。對於大規模的linux運維頗有幫助
(2)在linux 運維和開發中,咱們常常須要遠程登陸服務器進行操做,登陸的過程是一個交互的過程,可能會須要輸入yes/no password等信息。爲了模擬這種輸入,可使用expect腳本。
(3)安裝linux

yum install expect -yshell

2、基本命令:
(1)send:向進程發送字符串,用於模擬用戶的輸入(該命令不能自動回車換行,通常要加 \r (回車))
(2)expect :判斷上次輸出結果裏是否包含指定的字符串,若是有則當即返回,不然就等待超時時間後返回,只能捕捉由 spawn 啓動的進程的輸出。
(3)sapwn :啓動進程,並跟蹤後續交互信息 。
(4)interact :執行完成後保持交互狀態,把控制權交給控制檯。
(5)timeout : 指定超時時間,過時則繼續執行後續指令。數組

單位爲:秒
timeout -1 爲永不超時
默認狀況下,是10秒bash

(6)exp_continue :容許expect 繼續向下執行指令
(7)send _user :至關於echo
(8)$argv 參數數組: expect腳本能夠接受從bash傳遞的參數,可使用 [lindex $argv n ] 得到
(9)expect 腳本必須以interact 或 expect eof 結束,執行自動化任務一般 expect eof 就夠了服務器

expect eof 是在等待結束標誌,由spawn 啓動的命令在結束時會產生一個 eof標記,expect eof 即在等待這個標記。運維

3、expect 執行方式:
(1)直接執行:
例子:ssh 遠程登陸,免交互輸入用戶名和密碼。ssh

1 #!/usr/bin/expect   //expect 二進制文件的路徑
  2 set timeout 20    //超時時間
  3 log_file test.log  
  4 log_user 1
  5 
  6 set hostname [lindex $argv 0]  //0表示第一個參數
  7 set password [lindex $argv 1]  //1 表示第二個參數
  8 spawn ssh root@$hostname  //啓動進程,並跟蹤
  9 
 10 expect {  //捕捉進程
 11         "(yes/no)"
 12         {send "yes\r";exp_continue}
 13         "*password"
 14         {send "$password\r"}
 15 }       
 16 
 17 interact //將控制權交給控制檯

嵌入使用ide

1 #!/bin/bash
  2 ip=$1
  3 password=$2
  4 
  5 /usr/bin/expect<<-EOF
  6 
  7 spawn ssh root@${ip}
  8 expect {
  9         "(yes/no)"
 10         {send "yes\r";exp_continue} //鍵盤輸入yes 並繼續
 11         "*password"
 12         {send "$password\r"}
 13 }
 14 expect "*]#"
 15 send "exit\r"
 16 expect eof
 17 EOF
 18

**
案例一:建立一個用戶zhang,密碼爲123123工具

** 1 #!/bin/bash
  2 yonghu=$1
  3 mima=$2
  4 useradd $yonghu //建立用戶
  5 /usr/bin/expect <<-EOF
  6 spawn passwd $yonghu
  7 expect {
  8         "新的 密碼:"
  9         {send "$mima\r";exp_continue}
 10         "從新輸入新的 密碼"
 11         {send "$mima\r"}                
 12 }
 13 EOF**
相關文章
相關標籤/搜索