linux自動化互動指令碼expect

2021-10-24 17:38:27 字數 3263 閱讀 9667

expect指令碼是tcl指令碼語言的拓展。用來實現自動的互動式任務,無需人為干預。在實際開發中,執行shell指令碼有時候會輸入linux密碼或者是mysql密碼等,而expect可以幫我們輸入。

expect在linux系統中沒有自帶,需要我們自行安裝,在ubuntu系統下,安裝命令如下

sudo

apt-get update

sudo

apt-get

install

expect

首先建立expect指令碼

sudo vim hello.exp
在hello.exp下寫如下內容:

#!/usr/bin/expect

settimeout 5

spawn su

expect

#你的linux密碼

}interact

執行hello.exp

expect hello.exp
執行後,你會發現你的使用者就變成root使用者了,我們用過linux的會知道,進入root使用者是需要輸入密碼的,而使用了expect指令碼,他就會自動幫我們輸入密碼。這就是expect的自動化互動。

指定要執行的指令碼,與shell指令碼中的#!/bin/bash一樣意思,若你不知道你的expect安裝在**,可以使用which expect來檢視。我的就安裝在 /usr/bin/expect下

(2)set timeout 5

set:是設定變數,可以設定自定義變數,也可以設定expect指令碼內部變數的值

timeout:timeout是expect指令碼的內部變數,我們自定義名稱的使用不能使用這種內部變數名。timeout意思是超時時間,單位是秒,預設是10s超時,也可以設定-1,永不超時

set timeout 5:意思是在expect語句中,5s後超時,不再作出選擇。

(3)spawn su

開啟乙個新的程序來執行su命令

(4)expect }

expect:從程序中接收資訊, 如果匹配成功, 就執行expect後的動作

send:向程序傳送字串

expect

}

說明:判斷輸出的資訊有沒有包含assword的字串,如果有,則傳送乙個命令123456\r( \r是敲回車),並退出expect語句;如果沒有,則等待timeout的時間後退出expect語句。

(5)interact

執行完spawn內的命令後不退出,剩下的操作由我們人工來執行。如登陸ssh,expect指令碼可以幫我們登入(不用手動輸入密碼),登陸之後需要我們手動互動。

看到這裡,相信你已經知道了expect指令碼本質:提前知道了linux系統的返回資訊,並捕獲這些資訊,來作出應答。

命令說明

set timeout n

設定expect語句超時時間為n秒。-1為永不超時

setnamevalue設定變數名為name,其值為value

setname[lindex $ar** 0]設定變數名為name,其值為傳入expect指令碼的第乙個引數。第乙個引數的索引值為0,第二個為1,依次類推

spawn

啟動新的程序,執行命令或者指定程式

expect

接收程序中返回的資訊, 如果匹配成功(有大小寫區分), 就執行expect後的動作

send

向程序傳送字串

send_user

用來列印資訊,相當於shell中的echo

exp_continue

執行完expect後的動作後,使expect不退出,繼續往下匹配

expect eof

不允許使用者互動,直接退出(這個用的會比interact多)

interact

允許使用者互動

(1)建立乙個shell指令碼,1.sh

#!/bin/bash

echo

"read print"

read -p "please input name in there " name

echo

$read -p "input password in there " password

echo

$

該指令碼的意思就是輸入你的賬號,密碼,並列印出來

(2)建立乙個expect指令碼,1.exp。讓1.exp幫我們輸入資訊

#!/usr/bin/expect

#若要執行shell指令碼,寫shell指令碼的絕對路徑

spawn bash /home/hadoop/test/1.sh

#設定expect語句的超時時間。預設10s

settimeout 3

expect

內匹配語句,只要一找到匹配的語句,就會執行,

#執行完之後就會退出,而加上exp_continue之後不會退出,會繼續往下執行。

#這裡是匹配字串,不需要雙引號,有大小寫區分

name

assword

}expect eof #與interact相反,執行完程式不進入人工互動

(3)執行

正常來說,執行1.sh會讓你手動輸入name與password,但是這裡執行了1.exp後,就能讓1.exp來幫你輸入1.sh的資訊

若你想更深入的研究expect語法,這裡有使用手冊

英語原版:

中文翻譯:

shell指令碼中自動化互動輸入

有的shell指令碼需要互動輸入,如果需要批量或者自動化,可以根據實際情況按照如下方法處理 1.重定向 這個方法很簡單,把需要輸入的內容按每行寫入到文件中,然後執行指令碼 vpncmd content2.使用管道 echo e 3 n vpncmd3.使用expect expect是專門用來互動自動...

python socket自動化互動

socket 的自動化互動 假設服務端執行程式為 coding utf8 python3 import random import socket import sys 建立 socket 物件 serversocket socket.socket socket.af inet,socket.sock...

部署python自動化指令碼 搭建自動化指令碼執行環境

年前把平台的指令碼寫好了,準備在虛擬機器中全部執行一遍。沒想到在虛擬機器中配置了很長時間,才把環境搭好。為了不再犯這配置環境的苦,在這簡單說說環境的搭建吧。因為寫的指令碼是在win7上實現的,所以虛擬機器我安裝的也是win7系統。1 安裝python 2 配置環境變數 python安裝成功後,將安裝...