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**