Expect是創建在tcl基礎_上的一個工具,Expect 是用來進行自動化控制和測試的工具。主要解決shell腳本中不可交互的問題。對於大規模的linux運維頗有幫助。
在linux運維和開發中,咱們常常須要遠程登陸服務器進行操做,登陸的過程是一個交互的過程,可能會須要輸入(yes/no)password等信息。爲了模擬這種輸入,可使用Expect腳本。linux
yum install expect -yshell
向進程發送字符串,用於模擬用戶的輸入。該命令不能自動回車換行,通常要加\r (回車)vim
expect的一個內部命令,判斷上次輸出結果裏是否包含指定的字符串,若是有則當即返回,不然就等待超時時間後返回。只能捕捉由spawn啓動的進程的輸出。數組
啓動進程,並跟蹤後續交互信息。bash
執行完成後保持交互狀態,把控制權交給控制檯。服務器
指定超時時間,過時則繼續執行後續指令;
單位是:秒;
timeout -1爲永不超時;
默認狀況下,timeout是10秒。運維
容許expect繼續向下執行指令ssh
回顯命令,至關於echoide
Expect腳本能夠接受從bash傳遞的參數,可使用[lindex $argv n]得到,n從0開始,分別表示第一個第二個,第三個...參數。工具
Expect腳本必須以interact或expect eof結束,執行自動化任務一般expect eof就夠了,expect eof是在等待結束標誌。由spawn啓動的命令在結束時會產生一個eof標記,expect eof即在等待這個標記。
expect "password:" {send "mypassword\r";}
expect "aaa" {send "AAA\r"} expect "aaa" {send "AAA\r"} expect "aaa" {send "AAA\r"}
send命令不具有回車換行功能,通常要加\r或\n。
expect{ "aaa"{send"AAA\r"} "bbb"{send"BBB\r"} "ccc"{send"CCC\r"} }
只要匹配上了任何一個,執行項硬的send語句後退出該expect語句。
expect { "aaa" {send "AAA\r";exp_continue} "bbb" {send "BBB\r";exp_continue} "ccc" {send "CCC\r"} }
exp_continue表示繼續後面的匹配,若是匹配了aaa,執行完send語句後還要繼續向下匹配bbb。
經過執行腳本直接免交互進行ssh登陸
[root@localhost opt]# vim demo01.sh #!/usr/bin/expect //Expect二進制文件的路徑 set timeout 20 //超時時間20,單位:秒 log_file test.log //日誌文件 log_user 1 //日誌用戶個數 set hostname [lindex $argv 0] set password [lindex $argv 1] //定義變量,經過參數將內容傳入,相似於位置變量 spawn ssh root@$hostname //追蹤命令 expect { "Connection refused" exit //捕捉服務被拒絕信息,並執行exit退出免交互 "service not konwn" exit //捕捉未知服務或鏈接地址錯誤的信息,並執行exit退出免交互 "(yes/no)" //捕捉詢問是否鏈接的的信息 {send "yes\r";exp_continue} //輸入"yes",回車,並繼續進行匹配 "*password" //捕捉密碼輸入的信息 {send "$password\r"} //經過變量輸入密碼,回車,不繼續匹配。 } interact //保持交互狀態,把控制權交給控制檯
經過腳本建立用戶,再免交互給用戶設置密碼。
[root@localhost opt]# vim demo02.sh #!/bin/bash user=$1 //定義位置變量$1爲user password=$2 //定義位置變量$2爲password useradd $user //添加用戶 /usr/bin/expect <<-EOF //Expect開始標誌,標準性輸入,等同於stdin spawn passwd $user expect { "新的 密碼:" {send "$password\r";exp_continue} "從新輸入新的 密碼:" {send "$password\r"} } EOF //Expect結束語句,EOF先後不能有空格