6個Expect指令碼示例

2021-06-25 08:44:24 字數 2726 閱讀 4133

本文譯至:

expect 指令碼語言用於自動提交輸入到互動程式。它相比其它指令碼語言簡單易學。使用expect指令碼的系統管理員和開發人員可以輕鬆地自動化冗餘任務。它的工作原理是等待特定字串,並傳送或響應相應的字串。

以下三個expect命令用於任何自動化互動的過程。

請確保在您的系統上安裝expect軟體包,因為它不會被預設安裝。 一旦安裝後,你會看到expect直譯器「/usr/bin/expect」。 一般來說,expect指令碼檔案具有.exp的擴充套件。

下面的expect指令碼等待具體字串「hello」。

當它找到它時(在使用者輸入後),「world」字串將作為應答傳送。

#!/usr/bin/expect

expect "hello"

send "world"

預設情況下,等待的超時時間為10秒。

如果你不為expect命令輸入任何東西,將在20秒內超時。

您也可以更改超時時間,如下所示。

#!/usr/bin/expect

set timeout 10

expect "hello"

send "world"

在expect的幫助下,你可以自動化使用者程序,並得到期望的輸出。

例如,您可以使用expect編寫測試指令碼來簡化專案的​​測試用例。

下面的例子執行了額外的程式自動化。

#!/usr/bin/expect

set timeout 20

spawn "./addition.pl"

expect "enter the number1 :"

expect "enter the number2 :"

interact

執行上面的指令碼,輸出結果如下所示。

$ ./user_proc.exp

spawn ./addition.pl

enter the number1 : 12

enter the number2 : 23

result : 35

如果你寫的**沒有interact命令,在這種情況下,指令碼會在傳送字串「23\r」後立即退出。 interact命令執行控制,處理addtion程序的作業,並生成預期的結果。

在字串匹配成功時expect返回,但在此之前它將匹配的字串儲存在$expect_out(0,string)。

之前所收到的字串加上匹配的字串儲存在$expect_out(buffer)。

下面的例子展示了這兩個變數匹配的值。

#!/usr/bin/expect

set timeout 20

spawn "./hello.pl"

expect "hello"

send "no match : <$expect_out(buffer)> \n"

send "match : <$expect_out(0,string)>\n"

interact

hello.pl程式只是列印兩行,如下圖所示。

#!/usr/bin/perl

print "perl program\n";

print "hello world\n";

如下所示執行。

$ ./match.exp

spawn ./hello.pl

perl program

hello world

no match : match :

expect可以讓你從程式中傳遞密碼給linux登入賬號,而不是在終端輸入密碼。在下面的程式中,su自動登入到需要的賬戶上。 

#!/usr/bin/expect

set timeout 20

set user [lindex $argv 0]

set password [lindex $argv 1]

spawn su $user

expect "password:"

send "$password\r";

interact

如下所示執行上面的expect程式。 

bala@localhost $ ./su.exp guest guest

spawn su guest

password:

guest@localhost $

執行上面的指令碼後,從bala使用者帳戶登入到guest使用者帳戶。 

下面給出的expect程式專案可自動從一台計算機ssh登入到另一台機器。 

#!/usr/bin/expect

set timeout 20

set ip [lindex $argv 0]

set user [lindex $argv 1]

set password [lindex $argv 2]

spawn ssh "$user\@$ip"

expect "password:"

send "$password\r";

interact

執行上面的expect程式如下所示。 

guest@host1 $ ./ssh.exp 192.168.1.2 root password

spawn ssh [email protected]

password:

last login: sat oct 9 04:11:35 2010 from host1.geetkstuff.com

root@host2 #

expect指令碼解釋

使用expect實現自動登入的指令碼,網上有很多,可是都沒有乙個明白的說明,初學者一般都是照抄 收藏。可是為什麼要這麼寫卻不知其然。本文用乙個最短的例子說明指令碼的原理。指令碼 如下 usr bin expect set timeout 30 spawn ssh l username 192.168...

編寫expect指令碼

expect實現自動互動。如,scp,ssh,ftp root等需要輸入密碼的互動需求 例如ssh命令遠端登入其他主機,會要求輸入密碼 ps 有時候有的機器登入也不需要密碼 bin sh echo start expect c expect hello send world n expect eof...

expect指令碼安裝和乙個簡單的指令碼

前不久因為進行異地copy資料,就想到了scp,但是這個東西需要手動去輸入密碼,不能放到後台去執行,於是就考慮有沒有辦法讓他自動輸入密碼呢,最終發現了expect這個東西,很強大的東西,所以我就在本地測試了下,最終實現了不用手動輸入密碼也可以進行copy資料,拿來與大家分享.要使用expect需要預...