目录


 

一、Expect是什么

处理交互的一种脚本语言
 
 

二、交互流程

spawn启动指定进程 -> expect获取指定关键字 -> send想指定进程发送指定指令 -> 执行完成后退出
 
 

三、主要命令

1、spawn命令

启动新的交互进程, 后面跟命令或者指定程序

#启动一个telnet进程
spawn  telnet  192.168.1.1

 

2、expect命令

从进程中接收信息, 如果匹配成功, 就执行expect后的动作
expect命令也可以匹配正则表达式

#匹配Login,匹配成功则输入root\r,同时匹配Timeout,匹配成功则退出
expect {
	"Login" { 
		send: "root\r"
		}
	"Timeout" {
		exit 1
		}
}

 

3、send命令

向进程发送字符串

#匹配Login,匹配成功则发送root\r
expect {
	"Login" { 
		send: "root\r"
		}
}

 

4、interact命令

允许人为干预交互

#例如cmd为要自动执行的命令,如果命令为空,则停留在该进程中(例如Telnet、SSH)由人工进行交互
if { $cmd == "" } {
    interact 
    exit 0
}

 

5、set和puts命令

set设置变量的值
puts输出变量的值

#设置变量user的值为root,输出变量user的值
set user “root”
puts $user

 
 

四、常用场景

1、获取脚本传入参数

脚本传入的参数存在$argv数组中,下标从0开始

#设置user的值为传入的第一个参数,设置password的值为传入的第二个参数
set user [lindex $argv 0]
set password [lindex $argv 1]

 

2、超时处理(timeout)

set timeout 超时时间,然后expect tomeout

#30秒超时,超时后退出程序
spawn -noecho telnet $ipaddress
set timeout 30
expect {
   timeout exit
   "Login" {
   		send: "root\r"
   }
}

 

3、文件结尾处理(eof)

expect执行结束, 退出

spawn -noecho telnet $ipaddress
set timeout 30
expect {
   timeout exit
   eof {
   		puts: "finish"
   }
   "Login" {
   		send: "root\r"
   }
}

 

4、匹配所有样式

可以对timeout和eof做统一处理

spawn -noecho telnet $ipaddress
set timeout 30
expect {
   "Login" {
   		send: "root\r"
   }
   default {exit 1}
}

 

五、Example

ssh登录到192.168.1.1,执行ls命令后留在该终端

#!/usr/bin/expect
spawn -noecho ssh root@192.168.1.1
expect "*password:"
send "321321321\r"
expect "#"
send "ls\n"
interact