Expect 交換式處理

  1. Expect 能夠替系統管理員完成與系統的交互式操做  bash

  2.   

  3. [root@localhost ~]# yum -y install expect  # 能夠經過 yum 安裝  服務器

  4.   

  5. [root@localhost ~]# which expect  # 路徑  ssh

  6. /usr/bin/expect  ide

  7.   

  8. [root@localhost tmp]# cat login.exp  spa

  9. #!/usr/bin/expect  命令行

  10. spawn ssh root@192.168.1.81;  orm

  11. expect {  xml

  12.   "(yes/no)?" { send "yes\r"; exp_continue }  進程

  13.   "password:" { send "123456\r"; exp_continue }  it

  14.   "#" { send "uptime\r"; interact }  

  15. }  

  16.   

  17. ## 使用 /usr/bin/expect 來解釋腳本 , spawn 開啓一個 ssh 進程 , expect 用來接收信息 , send 用來發送信息  

  18.    "(yes/no)?" 當第一次登錄遠程主機時會提示 yes/no , 匹配到信息時 send 發送 "yes\r" , \r 爲換行 , exp_continue 爲繼續匹配下一條  

  19.    "#" 因爲是 root 用戶登錄 , 那麼匹配到正確的密碼後會獲得超級用戶的標誌 # 號 , 而後就能夠 send 發送系統命令了 uptime  

  20.    interact 指令意爲:保持交互狀態 , 將控制權交給控制檯 , 也就是說剛登錄到遠程主機 , 如今不會退出 , 且管理員能夠操做主機  

  21.   

  22. [root@localhost tmp]# cat login.exp  

  23. #!/usr/bin/expect  

  24. set timeout -1;  

  25. spawn ssh root@192.168.1.81;  

  26. expect {  

  27.   "(yes/no)?" { send "yes\r"; exp_continue }  

  28.   "password:" { send "123456\r"; exp_continue }  

  29.   "#" { send "uptime\rexit\r"; expect eof }  

  30. }  

  31.   

  32. ## set timeout -1 : 設置超時時間 , -1 爲無窮大、能夠指定例如 20 (單位爲秒)  

  33.    expect eof : 等待進程結束 (不保持交互狀態), 當執行命令中沒有明確指定退出登錄(exit\r)時 , expect eof 會等到超時時間事後自  

  34.    動退出遠程系統(timeout 設爲 -1 時 , 不會退出 ) , 若是明確指定 exit\r (即上面例子)時 , 則執行完命令當即退出遠程登錄系統   

  35.   

  36. [root@localhost tmp]# cat login.sh  

  37. #!/bin/bash  

  38. list=("192.168.1.81 root 123456" "192.168.1.82 root 123456" "192.168.1.83 root 123456")  

  39. length=${#list[@]}  

  40.   

  41. for ((i=0;i<$length;i++))  

  42.   {  

  43.      host=`echo ${list[$i]} | awk '{print $1}'`  

  44.      user=`echo ${list[$i]} | awk '{print $2}'`  

  45.      passwd=`echo ${list[$i]} | awk '{print $3}'`  

  46.   

  47.      expect -c "  

  48.      spawn ssh $user@$host;  

  49.      expect {  

  50.        \"(yes/no)?\" { send \"yes\r\"; exp_continue }  

  51.        \"password:\" { send \"$passwd\r\"; exp_continue }  

  52.        \"#\" { send \"uptime\rexit\r\"; expect eof }  

  53.      }  

  54.    "  

  55. }  

  56.   

  57. ## expect -c 從命令行執行 expect 腳本  如今能夠實現循環登錄服務器執行命令後退出遠程系統  

  58.    將 exit\r 去掉 , 而且 expect eof 改成 interact 能夠實現停留在遠程服務器(只限一臺服務器 , 如過多臺的話第一臺停留就不會循環了)  

  59.   

  60. [root@localhost tmp]# cat login.exp1  

  61. #!/usr/bin/expect  

  62. if { $argc != 3 } {  

  63.   puts "usage $argv0 user host passwd"  

  64.   exit 1  

  65. }  

  66.   

  67. set user [lindex $argv 0]  

  68. set host [lindex $argv 1]  

  69. set passwd [lindex $argv 2]  

  70.   

  71. spawn ssh $user@$host;  

  72. expect {  

  73.   "(yes/no)?" { send "yes\r"; exp_continue }  

  74.   "password:" { send "$passwd\r"; exp_continue }  

  75.   "#" { send "uptime\r"; interact }  

  76. }  

  77.   

  78. ## $argc 表明參數個數 , $argv0 表明腳本名 , $argv 0 表明第一個參數 ...  

  79.    若是傳遞參數不足 3 個 , 那麼屏幕顯示 usage 腳本名 user host passwd , 因此執行腳本時應: ./login.exp1 root 192.168.1.81 123456  

  80.    參數不足 3 個則退出腳本  

  81.    set 將第一個參數賦值給變量 user ...( 變量存儲從 0 開始計算 1 2 3 ... n )  

相關文章
相關標籤/搜索