2021-05-12 14:32:11
使用expect的自動化互動
Q:利用shell指令碼實現ssh自動登入遠端伺服器?
A:expect命令
shell> expect 指令碼 //執行expect指令碼
1、使用expect -c的巢狀呼叫
如果需要在shell指令碼中巢狀expect程式碼,就要使用expect -c "expect程式碼"
注意:在expect -c裡面的程式碼,雙引號要用跳脫字元。
2、使用here document的巢狀呼叫
是一個工具,是一個用來處理互動的命令。
借助Expect,我們可以將互動過程寫在一個指令碼上,使之自動化完成。
形象的說,ssh登入,ftp登入等都符合互動的定義。可以根據使用者設定的規則和系統進程進行自動化互動,例如遠端登陸的密碼輸入、自動化的執行遠端命令。
expect中最關鍵的四個命令是spawn、expect、send、interact
spawn:啟動新的進程,後面可接shell命令
expect:從進程接收字串
send:用於向進程傳送字串 interact:允許使用者互動
1、spawn命令
spawn命令就是用來啟動新的進程的。
spawn後的send和expect命令都是和spawn開啟的進程進行互動的。
send命令接收一個字串引數,並將該引數傳送到進程。(有點像here document)
3、expect命令
expect通常是用來等待一個進程的反饋,expect可以接收一個字串引數,也可以接收正規表示式引數。
和上文的send命令結合,實現簡單的互動式。
模式-動作:
> 單一分支模式語法:
expect "hi" {send "You said hi"} #匹配到hi後,會輸出"you said hi"給進程,作為標准輸入
> 多分支模式語法:
#匹配到hi,hello,bye任意一個字串時,執行相應的輸出。
expect {
"hi" { send "You said hin"; exp_continue}
"hello" { send "Hello yourselfn"; exp_continue}
"bye" { send "That was unexpectedn"}
}
4、interact
利用spawn、expect、send自動化完成部分操作。
如果想在適當的時候干預這個過程---就用到了interact(互相影響 互相作用)
比如下載完ftp檔案時,仍然可以停留在ftp命令列狀態,以便手動的執行後續命令。interact可以達到這些目的,在自動登入ftp後,允許使用者互動。
> 如果沒有這一句登入完成後會退出,而不是留在遠端終端上。
總結:
expect工具在日常的運維中非常有用,可以用在多機器服務重新啟動、遠端copy、多機器紀錄檔檢視、ftp檔案操作、telnet等多種場景。shell中有些操作會受限於密碼輸入的人工操作,expect工具可以代替人工來完成一些互動性工作。
相關文章