歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> shell腳本通過expect腳本實現自動輸入密碼

shell腳本通過expect腳本實現自動輸入密碼

日期:2017/2/28 13:43:40   编辑:SHELL編程

背景:在遠程文件下載時,需要輸入對方的服務器密碼,shell不支持交互輸入內容,可以用下面兩種方式實現

一.在shell腳本中嵌入expect來實現密碼輸入

expect是一個自動交互功能的工具。expect是開了一個子進程,通過spawn來執行shell腳本,監測到腳本的返回結果,通過expect判斷要進行的交互輸入內容(send)

1.安裝expect

需要先安裝tcl:apt-get install tcl

apt-get install expect

(輸入expect查看是否能夠進入expect解釋器可以判斷是否安裝成功)

注:我是用的utuntu系統。如果是用CentOS可以直接用yum install expect進行安裝

2.expect使用

2.1一個簡單的輸入密碼操作

#!/usr/bin/expect

set timeout 100

set password "123456"

spawn sudo rm -rf zzlogic

expect "root123456"

send "$password\n"

interact

說明:

第一行#!/usr/bin/expect表示使用expect的shell交互模式

set是對變量password賦值

set timeout 100:設置超時時間為100秒,如果要執行的shell命令很長可以設置超時時間長一些。expect超過超時時間沒有監測到要找的字符串,則不執行,默認timeout為10秒

spawn在expect下執行shell腳本

expect對通過spawn執行的shell腳本的返回進行判斷,是否包含“”中的字段

send:如果expect監測到了包含的字符串,將輸入send中的內容,\n相當於回車

interact:留在開的子進程內,可以繼續輸入,否則將退出子進程回到shell中(比如ssh登錄到某台服務器上,只有加了interact才可以留在登錄後的機器上進行操作)

2.2expect的命令行參數

[lindex $argv n]獲得index為n的參數(index從0開始計算)

$argc為命令行參數的個數

[lrange $argv 0 0]表示第一個參數

[lrange $argv 0 3]表示第1到第3個參數

例如scp_service.sh文件,可以./scp_service.sh -rm來執行,這時是賦值了一個參數

set option [lindex $argv 0](獲得第一個參數存到變量option中,參數是的index是從0開始計算的)

2.3if...elif...else...

expect支持if語句,

if { 條件1 } {

條件1執行語句

} elif { 條件2 } {

條件2執行語句

} else {

其他情況執行語句

}

說明:

1.if的條件用{}來包含條件

2.if和後面的{}必須有空格隔開

3.兩個花括號之間必須有空格隔開,比如if {} {},否則會報錯 expect:extra characters after close-brace

3.使用{來銜接下一行,所以if的條件後需要加左花括號{

4.else不能單獨放一行,所以else要跟在}後面

2.4 expect {},多行期望,匹配到哪條執行哪條

背景:有時執行shell後預期結果是不固定的,有可能是詢問是yes/no,有可能是去輸入密碼,所以可以用expect{}(比如sudo命令,第一次使用sudo時需要輸入密碼,但是它有5分鐘的有效時間,5分鐘內是不需要再去輸入的)

花括號內放多行語句,從上至下匹配,匹配到哪個expect執行哪句。(這裡如果匹配到第一行會執行第一行;然後第一行的執行結果如果匹配到第二行也會執行第三行;如果某一行沒有匹配到會向下尋找匹配到的那一行進行執行)

注意:多行的expect的{後不要跟語句,否則讀不到這條。需要換行後去寫具體的期望值和操作。

說明:exp_continue表示繼續執行下面的expect。

3.shell中調用expect來實現登錄

我是通過在shell腳本中執行expect腳本的方式來實現的。當然可以將shell中定義的一些變量傳遞給expect腳本作為參數輸入。可以見我下圖調用的一個例子

說明:經過這次嘗試些expect,給我的感覺是expect對格式的要求比較高,比如花括號之間必須有空格啊之類的,所以如果有報錯,大家可以仔細觀察一下是不是語法格式錯誤了。

二.在遠程服務器上配置ssh信任

這個我暫時沒有試,網上有很多教程,感覺長期的話應該比寫expect方便,但是我覺得寫腳本的話還是最好不要總去操作其他地方,所以這裡我就用expect自己來寫的(當然也是想練習一下寫expect)

Copyright © Linux教程網 All Rights Reserved