溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Shell腳本基礎(chǔ)篇——Expect免交互工具

發(fā)布時(shí)間:2020-08-06 14:43:12 來源:網(wǎng)絡(luò) 閱讀:328 作者:qq5d47f509174fe 欄目:系統(tǒng)運(yùn)維

本次博客結(jié)構(gòu)

  1. Expect概述
  2. Expect安裝方法
  3. Expect基本命令
  4. Expect執(zhí)行方式
  5. Demo實(shí)例

Expect概述

expect是一款自動(dòng)化的腳本解釋型的工具。它基于tcl腳本,其運(yùn)行需要tcl的支持。expect對(duì)一些需要交互輸入的命令很有幫助,比如ssh ftp scp telnet。

在遠(yuǎn)程登錄linux服務(wù)器的時(shí)候,ssh命令需要手工輸入密碼,當(dāng)?shù)卿浂嗯_(tái)機(jī)器的時(shí)候就會(huì)非常繁瑣。expect就可以根據(jù)設(shè)定的規(guī)則,自動(dòng)幫我們輸入密碼,大大節(jié)省了時(shí)間。

Expect安裝方法

通常系統(tǒng)中不會(huì)安裝expect,需要手動(dòng)進(jìn)行安裝

系統(tǒng)為Centos時(shí):

yum install expect -y

Expect基本命令

Timeout:指定超時(shí)時(shí)間,默認(rèn)為10s

? 當(dāng)timeout -1時(shí)代表永不超時(shí)

Send:向進(jìn)程發(fā)送字符串,模擬用戶輸入

? 通常后面會(huì)跟“\r”代表回車換行

Spawn:啟動(dòng)進(jìn)程,并追蹤后續(xù)命令

Expect:對(duì)進(jìn)程進(jìn)行捕捉(只能捕捉spawn啟動(dòng)的進(jìn)程)

? 判斷上次輸出結(jié)果里是否包含指定的字符串

Interact:將控制權(quán)交回控制臺(tái)

$argv參數(shù)數(shù)組:接受從bash傳遞的參數(shù)

? 參數(shù)從0開始,代表第一個(gè)參數(shù)

Expect執(zhí)行方式

分為兩種主要執(zhí)行方式:直接在expect解釋器中進(jìn)行執(zhí)行、結(jié)合“<<”下一位的分界符進(jìn)行嵌入執(zhí)行。

直接執(zhí)行
[root@localhost~]#more a.sh
#!/usr/bin/expect       //導(dǎo)入expect解釋器
    set timeout 20      //20秒超時(shí)時(shí)間
    set hostname [lindex $argv 0]       //追加參數(shù)0,加載第1位置
    set password [lindex $argv 1]       //追加參數(shù)1,加載第2位置
    spawn ssh root@$hostname
    expect {       
            "(yes/no)"                      //捕獲關(guān)鍵字
            {send"yes/r";exp_continue}      //輸入yes,繼續(xù)下一步
            "*password"     //參數(shù)2
            {send"$password\r"}     //模擬人工輸入
    }
interact                               //交回控制權(quán)回終端
嵌入執(zhí)行

這里解釋一下“<<”的用法:

? 當(dāng)shell看到“<<”的時(shí)候,它就會(huì)知道下一個(gè)詞是一個(gè)分界符。在該分界符以后的內(nèi)容都被當(dāng)作輸入,直到shell又看到該分界符(位于單獨(dú)的一行)。這個(gè)分界符可以是你所定義的任何字符串。

“EOF”與“-EOF”兩種分界符的不同:

? “EOF”沒有容錯(cuò)率,一旦結(jié)尾的分界符存在空格或者制表符,就會(huì)導(dǎo)致腳本報(bào)錯(cuò)。

? “-EOF”有一定的容錯(cuò)率,結(jié)尾的分界符可以允許存在制表符。

[root@localhost~]#more b.sh
#!/bin/bash                                       //導(dǎo)入bash解釋器
    hostname=$1
    password=$2
    /usr/bin/expect<<-EOF                        //將EOF作為分界符,下面所有操作均停留在當(dāng)前終端
    spawn ssh root@${hostname}                   //啟動(dòng)進(jìn)程,開始追蹤ssh命令
    expect {
        "(yes/no)"
        {send "yes\r";exp_continue}
        "*password"
        {send"$password\r"}
    }
    expect "*]#"
    send "exit\r"
    expect eof                                 //等待分界符結(jié)束
EOF                                            //另一位分界符,代表操作結(jié)束
Demo實(shí)例

直接執(zhí)行Demo

#!/usr/bin/expect 

#超時(shí)時(shí)間  
set timeout 20
log_file test.log 
log_user 1
#參數(shù)傳入
set hostname [lindex $argv 0]
set password [lindex $argv 1]
#追蹤命令
spawn ssh root@$hostname
#捕捉信息并且匹配,免交互執(zhí)行
expect {
        "Connection refused" exit
        "service not known" exit
        "(yes/no)"
        {send "yes\r";exp_continue}
        "*password" 
        {send "$password\r"}
}
#控制權(quán)交給控制臺(tái)執(zhí)行
interact
exit

效果如下

Shell腳本基礎(chǔ)篇——Expect免交互工具

嵌入執(zhí)行Demo

#!/bin/bash
user=$1
password=$2
#非交互命令放在expect外
useradd $user
#開始進(jìn)行交互
expect <<-EOF
spawn passwd $user
expect "新的*"
send "${password}\r"
expect "重新*"
send "${password}\r"
expect eof;
EOF
#以上為腳本實(shí)際內(nèi)容

效果如下:

Shell腳本基礎(chǔ)篇——Expect免交互工具

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI