Shell編程之Expect免交互語句詳解

Expect概述

Expect是建立在tcl基礎_上的一個工具,Expect 是用來進行自動化控制和測試的工具。主要解決shell腳本中不可交互的問題。對於大規模的linux運維很有幫助。
在linux運維和開發中,我們經常需要遠程登錄服務器進行操作,登錄的過程是一個交互的過程,可能會需要輸入(yes/no)password等信息。爲了模擬這種輸入,可以使用Expect腳本。

Expect安裝

yum install expect -y

基本命令

send:

向進程發送字符串,用於模擬用戶的輸入。該命令不能自動回車換行,一般要加\r (回車)

expect:

expect的一個內部命令,判斷上次輸出結果裏是否包含指定的字符串,如果有則立即返回,否則就等待超時時間後返回。只能捕捉由spawn啓動的進程的輸出。

spawn:

啓動進程,並跟蹤後續交互信息。

interact:

執行完成後保持交互狀態,把控制權交給控制檯。

Timeout:

指定超時時間,過期則繼續執行後續指令;
單位是:秒;
timeout -1爲永不超時;
默認情況下,timeout是10秒。

exp_ continue:

允許expect繼續向下執行指令

send_ user:

回顯命令,相當於echo

$argv參數數組:

Expect腳本可以接受從bash傳遞的參數,可以使用[lindex $argv n]獲得,n從0開始,分別表示第一個第二個,第三個...參數。

expect eof:

Expect腳本必須以interact或expect eof結束,執行自動化任務通常expect eof就夠了,expect eof是在等待結束標誌。由spawn啓動的命令在結束時會產生一個eof標記,expect eof即在等待這個標記。

Expect語法

單一分支語句

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。

Expect執行方式

直接執行:

通過執行腳本直接免交互進行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前後不能有空格
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章