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

Expect概述

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

Expect安裝

yum install expect -yshell

基本命令

send:

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

expect:

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

spawn:

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

interact:

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

Timeout:

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

exp_ continue:

容許expect繼續向下執行指令ssh

send_ user:

回顯命令,至關於echoide

$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先後不能有空格
相關文章
相關標籤/搜索