天天看點

Expect 交換式處理

  1. Expect 可以替系統管理者完成與系統的互動式操作  
  2. [root@localhost ~]# yum -y install expect  # 可以通過 yum 安裝  
  3. [root@localhost ~]# which expect  # 路徑  
  4. /usr/bin/expect  
  5. [root@localhost tmp]# cat login.exp  
  6. #!/usr/bin/expect  
  7. spawn ssh [email protected];  
  8. expect {  
  9.   "(yes/no)?" { send "yes\r"; exp_continue }  
  10.   "password:" { send "123456\r"; exp_continue }  
  11.   "#" { send "uptime\r"; interact }  
  12. }  
  13. ## 使用 /usr/bin/expect 來解釋腳本 , spawn 開啟一個 ssh 程序 , expect 用來接收資訊 , send 用來發送資訊  
  14.    "(yes/no)?" 當第一次登陸遠端主機時會提示 yes/no , 比對到資訊時 send 發送 "yes\r" , \r 為換行 , exp_continue 為繼續比對下一條  
  15.    "#" 由于是 root 使用者登陸 , 那麼比對到正确的密碼後會得到超級使用者的标志 # 号 , 然後就可以 send 發送系統指令了 uptime  
  16.    interact 指令意為:保持互動狀态 , 将控制權交給控制台 , 也就是說剛登陸到遠端主機 , 現在不會退出 , 且管理者可以操作主機  
  17. set timeout -1;  
  18.   "#" { send "uptime\rexit\r"; expect eof }  
  19. ## set timeout -1 : 設定逾時時間 , -1 為無窮大、可以指定例如 20 (機關為秒)  
  20.    expect eof : 等待程序結束 (不保持互動狀态), 當執行指令中沒有明确指定退出登陸(exit\r)時 , expect eof 會等到逾時時間過後自  
  21.    動退出遠端系統(timeout 設為 -1 時 , 不會退出 ) , 如果明确指定 exit\r (即上面例子)時 , 則執行完指令立即退出遠端登陸系統   
  22. [root@localhost tmp]# cat login.sh  
  23. #!/bin/bash  
  24. list=("192.168.1.81 root 123456" "192.168.1.82 root 123456" "192.168.1.83 root 123456")  
  25. length=${#list[@]}  
  26. for ((i=0;i<$length;i++))  
  27.   {  
  28.      host=`echo ${list[$i]} | awk '{print $1}'`  
  29.      user=`echo ${list[$i]} | awk '{print $2}'`  
  30.      passwd=`echo ${list[$i]} | awk '{print $3}'`  
  31.      expect -c "  
  32.      spawn ssh $user@$host;  
  33.      expect {  
  34.        \"(yes/no)?\" { send \"yes\r\"; exp_continue }  
  35.        \"password:\" { send \"$passwd\r\"; exp_continue }  
  36.        \"#\" { send \"uptime\rexit\r\"; expect eof }  
  37.      }  
  38.    "  
  39. ## expect -c 從指令行執行 expect 腳本  現在可以實作循環登陸伺服器執行指令後退出遠端系統  
  40.    将 exit\r 去掉 , 并且 expect eof 改為 interact 可以實作停留在遠端伺服器(隻限一台伺服器 , 如過多台的話第一台停留就不會循環了)  
  41. [root@localhost tmp]# cat login.exp1  
  42. if { $argc != 3 } {  
  43.   puts "usage $argv0 user host passwd"  
  44.   exit 1  
  45. set user [lindex $argv 0]  
  46. set host [lindex $argv 1]  
  47. set passwd [lindex $argv 2]  
  48. spawn ssh $user@$host;  
  49.   "password:" { send "$passwd\r"; exp_continue }  
  50. ## $argc 代表參數個數 , $argv0 代表腳本名 , $argv 0 代表第一個參數 ...  
  51.    如果傳遞參數不足 3 個 , 那麼螢幕顯示 usage 腳本名 user host passwd , 是以執行腳本時應: ./login.exp1 root 192.168.1.81 123456  

繼續閱讀