Expect是建立在tcl基礎(chǔ)上的一個工具,Expect 是用來進行自動化控制和測試的工具。主要解決shell腳本中不可交互的問題。對于大規(guī)模的linux運維很有幫助。
在linux運維和開發(fā)中,我們經(jīng)常需要遠程登錄服務器進行操作,登錄的過程是一個交互的過程,可能會需要輸入(yes/no)password等信息。為了模擬這種輸入,可以使用Expect腳本。
yum install expect -y
向進程發(fā)送字符串,用于模擬用戶的輸入。該命令不能自動回車換行,一般要加\r (回車)
expect的一個內(nèi)部命令,判斷上次輸出結(jié)果里是否包含指定的字符串,如果有則立即返回,否則就等待超時時間后返回。只能捕捉由spawn啟動的進程的輸出。
啟動進程,并跟蹤后續(xù)交互信息。
執(zhí)行完成后保持交互狀態(tài),把控制權(quán)交給控制臺。
指定超時時間,過期則繼續(xù)執(zhí)行后續(xù)指令;
單位是:秒;
timeout -1為永不超時;
默認情況下,timeout是10秒。
允許expect繼續(xù)向下執(zhí)行指令
回顯命令,相當于echo
Expect腳本可以接受從bash傳遞的參數(shù),可以使用[lindex $argv n]獲得,n從0開始,分別表示第一個第二個,第三個...參數(shù)。
Expect腳本必須以interact或expect eof結(jié)束,執(zhí)行自動化任務通常expect eof就夠了,expect eof是在等待結(jié)束標志。由spawn啟動的命令在結(jié)束時會產(chǎn)生一個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"}
}
只要匹配上了任何一個,執(zhí)行項硬的send語句后退出該expect語句。
expect {
"aaa" {send "AAA\r";exp_continue}
"bbb" {send "BBB\r";exp_continue}
"ccc" {send "CCC\r"}
}
exp_continue表示繼續(xù)后面的匹配,如果匹配了aaa,執(zhí)行完send語句后還要繼續(xù)向下匹配bbb。
通過執(zhí)行腳本直接免交互進行ssh登錄
[root@localhost opt]# vim demo01.sh
#!/usr/bin/expect //Expect二進制文件的路徑
set timeout 20 //超時時間20,單位:秒
log_file test.log //日志文件
log_user 1 //日志用戶個數(shù)
set hostname [lindex $argv 0]
set password [lindex $argv 1] //定義變量,通過參數(shù)將內(nèi)容傳入,類似于位置變量
spawn ssh root@$hostname //追蹤命令
expect {
"Connection refused" exit //捕捉服務被拒絕信息,并執(zhí)行exit退出免交互
"service not konwn" exit //捕捉未知服務或連接地址錯誤的信息,并執(zhí)行exit退出免交互
"(yes/no)" //捕捉詢問是否連接的的信息
{send "yes\r";exp_continue} //輸入"yes",回車,并繼續(xù)進行匹配
"*password" //捕捉密碼輸入的信息
{send "$password\r"} //通過變量輸入密碼,回車,不繼續(xù)匹配。
}
interact //保持交互狀態(tài),把控制權(quán)交給控制臺
通過腳本創(chuàng)建用戶,再免交互給用戶設置密碼。
[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結(jié)束語句,EOF前后不能有空格
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。