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安裝成功後,將安裝...