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