Linux之expect命令免交互實現


expect命令,是基於tcl的一門語言,其內在原理和早期的chat一樣;

是用於實現用戶和程序之間的交互自動化進行的工具。

 

一、expect語法構成:

  expect可單獨寫一個腳本:

    #!/usr/bin/expect -f 

    set timeout 5

    spawn COMAND

    expect PATTERN0 {

      send "STRING0\r"

      exp_continue  

    }

    expect {

      PATTERN1 {

          send "STRING1\r"

          exp_continue

        }

      PATTERN2 {

          send "STRING2\r"

          exp_continue

        }

    }

    expect "PATTERN3"

    exp_send "STRING3\r"

  以上混用了三種不同的expect書寫格式;

  其中,PATTERN默認只支持glob通配規則(*和?等),只需-re PATTERN 即可支持擴展正則表達式匹配了。

  注意:所有{ } 的前面都需要一個空格隔開;

二、子命令解釋:

  set   創建變量,[lindex $argv 0] 表示引用腳本參數中的第一個值;[lindex $argv 0-2] 表示引用腳本參數中第0到2個值。

        set timeout # 設置等待交互執行結束的超時時間並繼續執行下去,為 -1 永不超時;

  send   =exp_send 用於向進程發送字符串,支持換碼符,\r 表示回車;
      選項:
        -i 指定spawn_id,針對不同spawn對象來發送信息;是進行多程序控制的關鍵參數
        -s 表示slowly,控制發送速度,send -s 相當於 send_slow
          send -s {10 .001} 表示每10個字符一傳送,傳送間隔為1毫秒
  expect   從進程中接受字符串,類似觸發器的啟動;
      expect包含的子命令:
        exp_continue:表示繼續執行expect流,並默認重置超時時鍾;
        -continue_timer 不重置超時時鍾,繼續計時,超時則忽略,不推薦;
        exp_send : 是send的別名,完全相同的用法;(所有exp_command都是command的別名,完全等同)
  spawn     啟動新的子進程;每個spawn都有一個spawn_id
  interact    保持交互狀態,默認spawn啟動子進程執行目標命令,並且控制權會在執行命令結束后交還給原來的進程(即用戶可以輸入了!),

      通過interact幫助維持子進程的交互,這個操作在ssh時很重要;又比如ftp交互完成傳輸一個文件后,可以通過interact,使得用戶仍停留在ftp的CLI。

  exec COMMAND    用於支持bash命令。默認expect不支持bash命令。
        close     主動斷開和當前進程的連接(主要取消計時機制,提高效率),而不是默認地從交互窗口中讀取EOF來中斷;
        exit        退出expect腳本的命令,可以通過exit執行一些收尾工作:

        exit -onexit{  

          exec rm /tmp/a

        }

      其中-onexit選項是必須的,是后面的參數執行后,再推出expect命令。

 

三、使用案例:

    A主機免密登錄B主機(B主機IP:192.168.0.2 用戶名:root  密碼:123456):

    選擇直接用expect來寫腳本auto_ssh.exp:

      #!/usr/bin/expect

      set timeout 10      

      # 注意:expect不支持同一行內的注釋信息出現,只能換行注釋

      set password [lindex $argv 0] 

      # 取腳本后的第一個參數作為密碼,因此使用格式為: ./auto_ssh.exp 123456

      spawn ssh root@192.168.0.2

      expect "password:"
      send "$password\r"
      interact

    以上簡單地實現免密登錄主機B。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM