首頁 > 軟體

使用expect的自動化互動

2020-06-16 17:14:37

Q:利用shell指令碼實現ssh自動登入遠端伺服器?

A:expect命令

#!/usr/bin/expect
spawn ssh root@
172.16.11.99
expect
"*password:"
send
"rootzhangr"
expect
"*#"
interact
#!/usr/bin/expect  //告訴作業系統,此指令碼裡的程式碼用expect這個shell來執行(類似與bash)

shell> expect 指令碼  //執行expect指令碼

1、使用expect -c的巢狀呼叫

  如果需要在shell指令碼中巢狀expect程式碼,就要使用expect -c "expect程式碼"

expect -c "
  spawn ssh $user_name@$ip_addr df
-P
  expect {
    
"*(yes/no)?" {send "yesr" ; exp_continue}
    
"*password:" {send "$user_pwdr" ; exp_continue}
    #退出
  }
"
格式:spawn ssh登入遠端主機 在該遠端主機上要執行的命令(只能執行一條)

注意:在expect -c裡面的程式碼,雙引號要用跳脫字元。

2、使用here document的巢狀呼叫

#!/bin/bash
echo
"123"
/usr/bin/expect <<EOF  #利用here document的expect程式碼巢狀

spawn ssh root@
172.16.11.99
expect
"*password:"
send
"rootzhangr"
expect
"*#"
send
"touch zhangjiacair"
expect
"*#"
send
"exitr"

expect eof  
#捕獲結束



EOF
expect詳解-- programmed dialogue with interactive programs

  是一個工具,是一個用來處理互動的命令。

借助Expect,我們可以將互動過程寫在一個指令碼上,使之自動化完成。

形象的說,ssh登入,ftp登入等都符合互動的定義。可以根據使用者設定的規則和系統進程進行自動化互動,例如遠端登陸的密碼輸入、自動化的執行遠端命令。


expect中最關鍵的四個命令spawn、expect、send、interact

spawn:啟動新的進程,後面可接shell命令

expect:從進程接收字串

send:用於向進程傳送字串 interact:允許使用者互動

1、spawn命令

  spawn命令就是用來啟動新的進程的。

  spawn後的send和expect命令都是和spawn開啟的進程進行互動的。

set timeout 30  //設定超時時間,單位是:秒
spawn ftp
172.16.1.1  //開啟新的進程,該進程使用者連線遠端ftp伺服器
expect
"Name"  //進程返回Name時
send
"ftpr"  //向進程輸入ftpr
expect
"Password:"  //進程返回Password:時
send
"123456r"  //向進程輸入123456r
expect
"ftp> "  //進程返回ftp>時
send
"mirror xiangr"  //向進程輸入mirror xiangr #下載xiang資料夾
expect
"ftp> "
send
"exitr"  //向進程輸入exitr #退出
2、send命令

  send命令接收一個字串引數,並將該引數傳送到進程。(有點像here document)

3、expect命令

  expect通常是用來等待一個進程的反饋,expect可以接收一個字串引數,也可以接收正規表示式引數

  和上文的send命令結合,實現簡單的互動式。

模式-動作:

> 單一分支模式語法:

  expect "hi" {send "You said hi"}  #匹配到hi後,會輸出"you said hi"給進程,作為標准輸入

> 多分支模式語法:

  #匹配到hi,hello,bye任意一個字串時,執行相應的輸出。

expect {
  "hi" { send "You said hin"; exp_continue}
  "hello" { send "Hello yourselfn"; exp_continue}
  "bye" { send "That was unexpectedn"}
}

4、interact

  利用spawn、expect、send自動化完成部分操作。

  如果想在適當的時候干預這個過程---就用到了interact(互相影響 互相作用)

比如下載完ftp檔案時,仍然可以停留在ftp命令列狀態,以便手動的執行後續命令。interact可以達到這些目的,在自動登入ftp後,允許使用者互動。

spawn ftp 172.16.1.1
expect
"Name"
send
"ftpr"
expect
"Password:"
send
"123456r" interact  //留在ftp中手動執行後續命令操作
> 執行完成後保持互動狀態,把控制權交給控制台,這個時候就可以手工操作了;

> 如果沒有這一句登入完成後會退出,而不是留在遠端終端上。

總結:

  expect工具在日常的運維中非常有用,可以用在多機器服務重新啟動、遠端copy、多機器紀錄檔檢視、ftp檔案操作、telnet等多種場景。shell中有些操作會受限於密碼輸入的人工操作,expect工具可以代替人工來完成一些互動性工作。

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-05/144013.htm


IT145.com E-mail:sddin#qq.com