shell自動互動之expect指令碼 轉

2022-06-21 06:30:11 字數 3117 閱讀 2495

**:linux expect詳解(ssh自動登入)

shell指令碼實現ssh自動登入遠端伺服器示例:

#!/usr/bin/expect

spawn ssh root@

192.168.22.194

expect

"*password:

"send

"123\r

"expect "*#

"interact

expect是乙個用來處理互動的命令。借助expect,我們可以將互動過程寫在乙個指令碼上,使之自動化完成。形象的說,ssh登入,ftp登入等都符合互動的定義。下文我們首先提出乙個問題,然後介紹基礎知四個命令,最後提出解決方法。

如何從機器a上ssh到機器b上,然後執行機器b上的命令?如何使之自動化完成?

expect中最關鍵的四個命令是send,expect,spawn,interact。

send:用於向程序傳送字串

expect:從程序接收字串

spawn:啟動新的程序

interact:允許使用者互動

send命令接收乙個字串引數,並將該引數傳送到程序。

expect1.1> send "hello world\n"

hello world

(1)基礎知識

expect命令和send命令正好相反,expect通常是用來等待乙個程序的反饋。expect可以接收乙個字串引數,也可以接收正規表示式引數。和上文的send命令結合,現在我們可以看乙個最簡單的互動式的例子:

expect "hi\n"

send "hello there!\n"

這兩行**的意思是:從標準輸入中等到hi和換行鍵後,向標準輸出輸出hello there。

tips: $expect_out(buffer)儲存了所有對expect的輸入,<$expect_out(0,string)>儲存了匹配到expect引數的輸入。

比如如下程式:

expect "hi\n"

send "you typed <$expect_out(buffer)>"

send "but i only expected <$expect_out(0,string)>"

當在標準輸入中輸入

test

hi

是,執行結果如下

you typed: test

hii only expect: hi

(2)模式-動作

expect最常用的語法是來自tcl語言的模式-動作。這種語法極其靈活,下面我們就各種語法分別說明。

單一分支模式語法:

expect "hi" 

匹配到hi後,會輸出"you said hi"

多分支模式語法:

expect "hi"  \

"hello" \

"bye"

匹配到hi,hello,bye任意乙個字串時,執行相應的輸出。等同於如下寫法:

expect 

"hello"

"bye"

}

上文的所有demo都是和標準輸入輸出進行互動,但是我們跟希望他可以和某乙個程序進行互動。spawm命令就是用來啟動新的程序的。spawn後 的send和expect命令都是和spawn開啟的程序進行互動的。結合上文的send和expect命令我們可以看一下更複雜的程式段了。

set timeout -1

spawn ftp ftp.test.com //開啟新的程序,該程序使用者連線遠端ftp伺服器

expect "name" //程序返回name時

send "user\r" //向程序輸入anonymous\r

expect "password:" //程序返回password:時

send "123456\r" //向程序輸入[email protected]\r

expect "ftp> " //程序返回ftp>時

send "binary\r" //向程序輸入binary\r

expect "ftp> " //程序返回ftp>時

send "get test.tar.gz\r" //向程序輸入get test.tar.gz\r

spawn ftp ftp.test.com

expect "name"

send "user\r"

expect "password:"

send "123456\r"

interact

上文中提到:

如何從機器a上ssh到機器b上,然後執行機器b上的命令?如何使之自動化完成?

下面一段指令碼實現了從機器a登入到機器b,然後執行機器b上的pwd命令,並停留在b機器上,等待使用者互動。具體含義請參考上文。

#!/home/tools/bin/64/expect -f

set timeout -1

spawn ssh $buser@$bhost

expect

"*password:

" expect "$*

" interact

參考:1. linux下expect環境安裝以及簡單指令碼測試

2. 教會你linux shell自動互動的三種方法

shell 自動互動

你了解linux系統麼?你是linux系統的應用者麼?如果你要學習linux,你可能會遇到linux shell自動互動問題,這裡將介紹linux shell自動互動的解決方法,在這裡拿出來和大家分享一下。你了解linux系統麼?你是linux系統的應用者麼?如果你要學習linux,你可能會遇到li...

shell互動程式自動執行

最近遇到乙個問題 需要對單板emmc進行分割槽,執行fdisk,手動分割槽。當批量生產時,會使效率極低,且容易出錯。經過蒐集資料,發現expect可以實現互動程式的自動執行。1.了解expect 首先在ubuntu上apt get install expect,看看是個怎麼回事。執行expect,不...

shell指令碼程式設計 變數初值處理 expect互動

shell指令碼程式設計 變數初值處理 expect互動 變數的初值 字串初值設定 語法結構 如果未定義變數的值,預設輸出word 如果定義了變數的值,輸出定義好的變數值 例項 建立乙個指令碼,實現,互動式的建立使用者和密碼,如果使用者未設定密碼,則預設密碼是123456 bin bash read...