Shell編程中Expect免交互的示例分析

本篇文章給大家分享的是有關(guān)Shell編程中Expect免交互的示例分析,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序定制開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了分宜免費(fèi)建站歡迎大家使用!

Expect概述

Expect是建立在tcl基礎(chǔ)上的一個(gè)工具,Expect是用來進(jìn)行自動(dòng)化控制和測試的工具。主要解決shell腳本中不可交互的問題。對于大規(guī)模的Linux運(yùn)維很有幫助
在Linux運(yùn)維和開發(fā)中,我們經(jīng)常需要遠(yuǎn)程登錄服務(wù)器進(jìn)行操作,登錄過程是一個(gè)交互的過程,可能會(huì)需要輸入yes/no,password等信息。為了模擬這種輸入,可以使用Expect腳本。

基本命令

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

  • 該命令不能自動(dòng)回車換行,一般要加\r(回車)

expect

  • expect的一個(gè)內(nèi)部命令,判斷上次輸出結(jié)果里是否包含指定的字符串,如果有則立即返回,否則就等待超時(shí)時(shí)間后返回

  • 只能捕捉由spawn啟動(dòng)的進(jìn)程的輸出

spawn:啟動(dòng)進(jìn)程,并跟蹤后續(xù)交互信息

interact:執(zhí)行完成后保持交互狀態(tài),把控制權(quán)交給控制臺(tái)

Timeout:指定超時(shí)時(shí)間,過期則繼續(xù)執(zhí)行后續(xù)指令

  • 單位是:秒

  • timeout -1 為永不超時(shí)

  • 默認(rèn)情況下,timeout是10秒

exp_continue

  • 允許expect繼續(xù)向下執(zhí)行指令

send_user

  • 回顯命令,相當(dāng)于echo

$argv 參數(shù)數(shù)組

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

Expect腳本必須以interact或expect eof結(jié)束,執(zhí)行自動(dòng)化任務(wù)通常expect eof就夠了

  • expect eof是在等待結(jié)束標(biāo)志。由spawn啟動(dòng)的命令在結(jié)束時(shí)會(huì)產(chǎn)生一個(gè)eof標(biāo)記,expect eof即在等待這個(gè)標(biāo)記

Expect語法

單一分支語法

expect "password:" {send "mypassword\r";}

多分支模式語法

send命令不具備回車換行功能,一般要加\r或\n

expect "aaa" {send "AAA\r"}
expect "aaa" {send "AAA\r"}
expect "aaa" {send "AAA\r"}

只要匹配了aaa或bbb或ccc中的任何一個(gè),執(zhí)行相應(yīng)的send語句后退出該expect語句

expect {
"aaa" {send "AAA\r"}
"bbb" {send "BBB\r"}
"ccc" {send "CCC\r"}
}

exp_continue表示繼續(xù)后面的匹配,如果匹配了aaa,執(zhí)行完send語句后還要繼續(xù)向下匹配bbb

expect {
"aaa" {send "AAA\r";exp_continue}
"bbb" {send "BBB\r";exp_continue}
"ccc" {send "CCC\r"}
}

-re參數(shù)表示匹配正則表達(dá)式

Expect執(zhí)行方式

直接執(zhí)行

SSH登錄
首次登陸
正常登錄
連接被拒絕,可能ssh沒開,或端口號(hào)不對,亦或是防火墻限制
沒有該連接地址

#!/usr/bin/expect             //Expect二進(jìn)制文件的路徑
#超時(shí)時(shí)間
set timeout 20                  //20秒等待時(shí)間
log_file test.log                //日志文件
log_user 1                       //日志用戶
#參數(shù)傳入
set hostname [lindex $argv 0]        //追加參數(shù)0,統(tǒng)計(jì)變量并加載第1位置參數(shù)
set password [lindex $argv 1]        //追加參數(shù)1,統(tǒng)計(jì)變量并加載第2位置參數(shù)
#追蹤命令
spawn ssh root@$hostname          //追蹤命令
#捕捉信息并匹配免交互執(zhí)行
expect {                                             //捕捉提示信息
        "Connection refused" exit         //捕捉到拒接連接信息即退出
        "service not konwn" exit          //捕捉到服務(wù)為開啟信息即退出
        "(yes/no)"                                // 捕捉y(tǒng)es或no參數(shù)
        {send "yes\r";exp_continue}    //輸入yes并繼續(xù)執(zhí)行                
        "*password"                             // 捕捉參數(shù)    
        {send "$password\r"}              //輸入密碼參數(shù)              
}
#控制權(quán)交予控制臺(tái)
interact                                          //控制權(quán)轉(zhuǎn)交控制臺(tái)人為輸入
[root@localhost ~]# ./expect.sh 192.168.109.132 baby520./
spawn ssh root@192.168.109.132
root@192.168.109.132's password: 
Last login: Thu Oct 10 16:52:48 2019 from 192.168.109.10
[root@localhost ~]#

Expect執(zhí)行方式

嵌入執(zhí)行

#!/bin/bash 
user=$1
password=$2
#非交互命令放expect外面
useradd $user
#開始交互
expect <<-EOF                        //Expect開始標(biāo)志,標(biāo)準(zhǔn)性輸入,等同于stdin
spawn passwd $user
expect "新的*"
send "$password\r"
expect "重新*"
send "$password\r"
expect eof;
EOF                                        //Expect結(jié)束語句,EOF前后不能有空格
[root@localhost ~]# ./expect.sh 192.168.109.132 baby520./
spawn ssh root@192.168.109.132
root@192.168.109.132's password: 
Last login: Thu Oct 10 17:38:16 2019 from 192.168.109.133
[root@localhost ~]# exit
登出
Connection to 192.168.109.132 closed.

案例1

創(chuàng)建自定義用戶,密碼自定義

#!/bin/bash
username=$1
password=$2
useradd $username

/usr/bin/expect <<-EOF
spawn passwd $username
expect {
        "新的*"
        {send "$password\r";exp_continue}
        "重新*"
        {send "$password\r"}
}
EOF
[root@localhost ~]# ./tom.sh test2 123123
spawn passwd test2
更改用戶 test2 的密碼 。
新的 密碼:
無效的密碼: 密碼少于 8 個(gè)字符
重新輸入新的 密碼:
passwd:所有的身份驗(yàn)證令牌已經(jīng)成功更新。

案例2

利用expect完成FTP登錄過程

#!/usr/bin/expect -f
set timeout 20
spawn ftp 192.168.109.133
expect "Name*"
send "ftp\r"
expect "Password:*"
send "\r"
expect "ftp>*"
interact
expect eof

以上就是Shell編程中Expect免交互的示例分析,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

新聞名稱:Shell編程中Expect免交互的示例分析
鏈接地址:http://muchs.cn/article38/ijddpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、電子商務(wù)、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)公司網(wǎng)站設(shè)計(jì)公司、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)