Expect 能夠替系統管理員完成與系統的交互式操做 bash
[root@localhost ~]# yum -y install expect # 能夠經過 yum 安裝 服務器
[root@localhost ~]# which expect # 路徑 ssh
/usr/bin/expect ide
[root@localhost tmp]# cat login.exp spa
#!/usr/bin/expect 命令行
spawn ssh root@192.168.1.81; orm
expect { xml
"(yes/no)?" { send "yes\r"; exp_continue } 進程
"password:" { send "123456\r"; exp_continue } it
"#" { 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 指令意爲:保持交互狀態 , 將控制權交給控制檯 , 也就是說剛登錄到遠程主機 , 如今不會退出 , 且管理員能夠操做主機
[root@localhost tmp]# cat login.exp
#!/usr/bin/expect
set timeout -1;
spawn ssh root@192.168.1.81;
expect {
"(yes/no)?" { send "yes\r"; exp_continue }
"password:" { send "123456\r"; exp_continue }
"#" { 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
#!/usr/bin/expect
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;
expect {
"(yes/no)?" { send "yes\r"; exp_continue }
"password:" { send "$passwd\r"; exp_continue }
"#" { send "uptime\r"; interact }
}
## $argc 表明參數個數 , $argv0 表明腳本名 , $argv 0 表明第一個參數 ...
若是傳遞參數不足 3 個 , 那麼屏幕顯示 usage 腳本名 user host passwd , 因此執行腳本時應: ./login.exp1 root 192.168.1.81 123456
參數不足 3 個則退出腳本
set 將第一個參數賦值給變量 user ...( 變量存儲從 0 開始計算 1 2 3 ... n )