1. 程式人生 > >linux expect的send,expect,spawn,interact

linux expect的send,expect,spawn,interact

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

問題

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

四個命令

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

send:用於向程序傳送字串
expect:從程序接收字串
spawn:啟動新的程序
interact:允許使用者互動

1. send命令

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

expect1.1> send "hello world\n"
hello world

2. expect命令

(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
hi
I only expect: hi

(2)模式-動作

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

單一分支模式語法:

expect "hi" {send "You said hi"}

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

多分支模式語法:

expect "hi" { send "You said hi\n" } \
"hello" { send "Hello yourself\n" } \
"bye" { send "That was unexpected\n" }

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

expect {
"hi" { send "You said hi\n"}
"hello" { send "Hello yourself\n"}
"bye" { send "That was unexpected\n"}
}

3. spawn命令

上文的所有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

這段程式碼的作用是登入到ftp伺服器ftp ftp.uu.net上,並以二進位制的方式下載伺服器上的檔案test.tar.gz。程式中有詳細的註釋。

4.interact

到現在為止,我們已經可以結合spawn、expect、send自動化的完成很多工了。但是,如何讓人在適當的時候干預這個過程了。比如下載完ftp檔案時,仍然可以停留在ftp命令列狀態,以便手動的執行後續命令。interact可以達到這些目的。下面的demo在自動登入ftp後,允許使用者互動。

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 [email protected]$BHost
 expect  "*password:" { send "$password\r" }
 expect  "$*" { send "pwd\r" }
 interact

相關推薦

linux expect的send,expect,spawn,interact

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

【轉】shell expect spawnlinux expect 用法小記 看著舒服點

ssh username 英文 認識 exe 無法找到 usr 過去 操作 使用expect實現自動登錄的腳本,網上有很多,可是都沒有一個明白的說明,初學者一般都是照抄、收藏。可是為什麽要這麽寫卻不知其然。本文用一個最短的例子說明腳本的原理。 腳本代碼如下:  #####

[轉載] linux expect spawn的用法

linux expect spawn的用法 https://www.cnblogs.com/jason2013/articles/4356352.html 首先,要安裝expect,linux expect的安裝 1.安裝相應的包     yum ins

expect(spawn) 自動化git提交和scp拷貝---centos(linux)

在進行SCP檔案拷貝中,往往需要進行使用者密碼的輸入,即使用者互動。若採用自動化指令碼的方式進行,則可用以下方式 #!/usr/bin/expect # 設定引數 set src [lindex $argv 0] set dest [lindex $argv 1] set passwor

linux expect, spawn用法小記

使用expect實現自動登入的指令碼,網上有很多,可是都沒有一個明白的說明,初學者一般都是照抄、收藏。可是為什麼要這麼寫卻不知其然。本文用一個最短的例子說明指令碼的原理。   指令碼程式碼如下:   #####################################

shell expect spawnlinux expect 用法小記 看著舒服點

 使用expect實現自動登入的指令碼,網上有很多,可是都沒有一個明白的說明,初學者一般都是照抄、收藏。可是為什麼要這麼寫卻不知其然。本文用一個最短的例子說明指令碼的原理。  指令碼程式碼如下:   #####################################

linux expect spawn的用法

命令在功能:我們通過Shell可以實現簡單的控制流功能,如:迴圈、判斷等。但是對於需要互動的場合則必須通過人工來干預,有時候我們可能會需要實現和互動程式如telnet伺服器等進行互動的功能。而Expect就使用來實現這種功能的工具。 首先,要安裝expect,linux

linuxexpect命令詳解

linux運維expect介紹expect 是由Don Libes基於Tcl(Tool Command Language )語言開發的,主要應用於自動化交互式操作的場景,借助Expect處理交互的命令,可以將交互過程如:ssh登錄,ftp登錄等寫在一個腳本上,使之自動化完成。尤其適用於需要對多臺服務器執行相同

linuxexpect命令實現批量ssh免密

輸入 left 防止 輸出 one 時間 line jdb eof 有時候我們需要批量發送ssh命令給服務器,但是有可能有些服務器是新加入的,還沒有配置ssh免密,這個時候就會提示我們輸入yes/no 或者password等,expect腳本命令就是用於在提示這些的時候

Linuxexpect非交互式功能

class ack scrip then eof inet6 queue cast with 我在上一篇博文linux之SSH密鑰認證 提過ssh之間的相互認證,但是每次使用ssh登錄到其它服務器還是要輸入密碼的。 expect是用於提供自動交互的工具,自動連接被管理的服務

Linuxexpect 非交換式命令

expect 非交換式 命令 expect 非交換式命令 測試實例:非交換式登陸某一臺服務器,通常第一次登陸一臺服務器的時候,需要按一下yes,然後再輸入密碼,我們目的是通過expect模擬輸入 [root@localhost ~]# ssh 10.3.151.31 The authenticit

Linuxexpect 指令碼語言中互動處理常用命令

Linux 下 expect 指令碼語言中互動處理常用命令 Linux 下 expect 指令碼語言中互動處理常用命令 1. #!/usr/bin/expect 告訴作業系統腳本里的程式碼使用那一個 shell 來執行。這裡的 expect 其實和 Linux 下的 bash、win

Linux安裝expect

一、TCL安裝 tar xfvz tcl8.4.11-src.tar.gz cd tcl8.4.11/unix ./configure --prefix=/usr/tcl --enable-shared && make && make

expect spawn scp * shell路徑名展開

一直通過 scp 同步多臺伺服器上配置檔案,雖然已經寫了 shell 指令碼,但是密碼還需要手動輸入,終於忍不了啦,經查可以使用 expect 改變這種現狀(當然不只這一種解決方案) #!/usr/bi

expect spawn id exp4 not open

                spawn rsync -avH --delete /home/dwetl/bin [email protected]:/home/dwetl/binsending incremental file listbin/bin/ftpgj.logbin/ftpjx.log

UNIX/LINUX使用expect實現人機自動互動功能

expect用法 [#!/usr/bin/expect] 這一行告訴作業系統腳本里的程式碼使用那一個shell來執行。這裡的expect其實和linux下的bash、windows下的cmd是一類東西。 注意:這一行需要在指令碼的第一行。 [

linux使用expect實現自動登入(自動輸入密碼)

小蝙個人比較懶,每次都要登入多臺伺服器上工作,都要檢視note,什麼ip啦,埠啦,使用者名稱啦,密碼啦如果只有一個,那還是挺好記的,但是如果有10個,甚至更多,而且為了安全,每個伺服器的密碼都不一樣,ip和埠也不一樣,這樣就非常痛苦了,顧小蝙利用了一下expect軟體,用指令

expect spawn not found

安裝expect 執行以下命令 sudo apt-get install tcl tk expect 在使用expect 寫自動互動功能時 遇到問題 automate_expect.sh #! /usr/bin/expect spawn ./interactive.sh e

Linux - 通過expect工具實現指令碼的自動互動

目錄 1 安裝expect工具 2 expect的常用命令 3 作用原理簡介 3.1 示例指令碼 3.2 指令碼功能解讀 4 其他指令碼使用示例

Linux工作筆記-解決spawn: not found與expect: not found問題(安裝expect

首先要下載安裝2個程式: 1.tcl:下載連結如下: 8.4.11版本:https://download.csdn.net/download/qq78442761/10783733 8.4.19版本(新版本的Linux要安裝新版本的):https://download.csdn.ne