歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Expect 小腳本

Expect 小腳本

日期:2017/3/1 9:17:27   编辑:Linux編程

簡介:

Expect 可以替系統管理員完成與系統的交互式操作

shell > yum -y install expect # 可以通過 yum 安裝

shell > which expect # 路徑
/usr/bin/expect

例一:

shell > 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 指令意為:保持交互狀態 , 將控制權交給控制台 , 也就是說剛登陸到遠程主機 , 現在不會退出 , 且管理員可以操作主機

例二:

shell > cat login.exp

#!/usr/bin/expect
set timeout -1;
spawn ssh [email protected];
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 (即上面例子)時 , 則執行完命令立即退出遠程登陸系統

例三:

shell > 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 可以實現停留在遠程服務器(只限一台服務器 , 如過多台的話第一台停留就不會循環了)

例四:

shell > 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 )

Copyright © Linux教程網 All Rights Reserved