在Linux下靈活使用expect指令碼的小竅門

2021-05-26 07:23:04 字數 2323 閱讀 6587

對於喜愛自動化的linux系統管理員而言,一定是用過expect這個命令列工具。expect 是由 don libes 基於 tcl 語言開發的,並被廣泛應用於互動式操作和自動化測試的場景之中,它尤其適用於需要對多台伺服器執行相同操作的環境中,可以大幅度提高系統管理人員的工作效率。本文是thegeekstuff.com最近更新的一篇技術分享文章,其中詳細講述了如何通過不同的命令列選項來執行乙個expect指令碼,具體有什麼用,大家可以自由發揮想象力。

本文假設您對expect的基本使用方法已經有一定的了解。

如果你是expect指令碼語言的新手,可以首先從我們的expect的「hello world」樣例(英文)開始。

1.用「-c」選項,從命令列執行expect指令碼

expect可以讓你使用「-c」選項,直接在命令列中執行它,如下所示:

$ expect -c 『expect 「/n」 

pressed enter

$如果你執行了上面的指令碼,它會等待輸入換行符(/n)。按「enter」鍵以後,它會列印出「pressed enter」這個訊息,然後退出。

2.用「-i」選項互動地執行expect指令碼

使用「-i」選項,可以通過來自於標準輸入的讀命令來互動地執行expect指令碼。如下所示:

$ expect -i arg1 arg2 arg3

expect1.1》set argv

arg1 arg2 arg3

expect1.2》

正常情況下,當你執行上面的expect命令的時候(沒有「-i」選項),它會把arg1當成指令碼的檔名,所以「-i」選項可以讓指令碼把多個引數當成乙個連續的列表。

當你執行帶有「-c」選項的expect指令碼的時候,這個選項是十分有用的。因為預設情況下,expect是互動地執行的。

3.執行expect指令碼的時候,輸出除錯資訊

當你用「-d」選項執行**的時候,你可以輸出診斷的資訊。如下所示:

$ cat sample.exp

# !/usr/bin/expect -fexpect 「/n」;send 「pressed enter」;$ expect -d sample.expexpect version 5.43.0argv[0] = expect argv[1] = -d argv[2] = sample.expset argc 0set argv0 「sample.exp」set argv 「」executing commands from command file sample.exp

expect: does 「」 (spawn_id exp0) match glob pattern 「/n」? no

expect: does 「/n」 (spawn_id exp0) match glob pattern 「/n」? yes

expect: set expect_out(0,string) 「/n」

expect: set expect_out(spawn_id) 「exp0」

expect: set expect_out(buffer) 「/n」

send: sending 「pressed enter」 to 

4.用「-d」選項啟動expect偵錯程式

「-d」選項用於啟動偵錯程式,它只接受乙個布林值的引數。這個引數表示提示器必須馬上啟動,還是只是初始化偵錯程式,以後再使用它。

$ expect -d 1 script

「-d」選項左邊的選項會在偵錯程式啟動以前被處理。然後,在偵錯程式啟動以後,剩下的命令才會被執行。

$ expect -c 』set timeout 10『 -d 1 -c 』set a 1『

1: set a 1

dbg1.0》

5.行地執行expect指令碼

通常,expect會在執行指令碼之前,把整個指令碼都讀入到記憶體中。「-b」選項可以讓expect一次只讀取指令碼中的一行。當你沒有寫完整個指令碼的時候,這是十分有用的,expect可以開始執行這個不完整的指令碼,並且,它可以避免把指令碼寫入到臨時檔案中。

$ expect -b

6.expect不解釋命令列引數

你可以使用識別符號讓expect不解釋命令列引數。

你可以像下面這樣的讀入命令列引數:

$ cat print_cmdline_args.exp

#!/usr/bin/expect

puts 』argv0 : [lindex $argv 0]『;

puts 』argv1 : [lindex $argv 1]『;

當執行上面的指令碼的時候,會跳過命令列選項,它們會被當成引數(而不是expect選項),如下所示:

$ expect print_cmdline_args.exp -d -c

argv0 : -d

argv1 : -c

在ABP中靈活使用AutoMapper

該文章是系列文章 基於.netcore和abp框架如何讓windows服務執行quartz定時作業 的其中一篇。最多遇到的場景,應該是介面返回的dto和資料庫entity,出於敏感資訊保護或者減少介面返回資料等等的原因,dto返回的屬性或者字段有所刪減,也就是說需要對映的屬性或者字段屬性名稱一致。d...

在Linux下使用ADSL

文章標題 在linux下使用adsl 程軍傑 張貼者 admin enthusiast 張貼日期 04 06 02 02 12 am 原文章發布於 2001.8.24 by 程軍傑 本站會員 北京電信的adsl使用的是pppoe撥號方式,因此,要在linux下使用adsl,必須安裝pppoe 客戶端...

在Linux下使用ADSL

北京電信的adsl使用的是pppoe撥號方式,因此,要在linux下使用adsl,必須安裝pppoe客戶端軟體。下面說明如何進行安裝 本文以redhat linux 6.2為實驗平台,其它平台的linux安裝辦法可以參照下面從源 進行安裝的步驟。一 安裝的前提條件 1.確保安裝了網絡卡並工作正常 使...