目录


 

一、Expect是什么

处理交互的一种脚本语言
 
 

二、交互流程

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

三、主要命令

1、spawn命令

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

expect
  • 01
  • 02
#启动一个telnet进程 spawn telnet 192.168.1.1

 

2、expect命令

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

expect
  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
#匹配Login,匹配成功则输入root\r,同时匹配Timeout,匹配成功则退出 expect { "Login" { send: "root\r" } "Timeout" { exit 1 } }

 

3、send命令

向进程发送字符串

expect
  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
#匹配Login,匹配成功则发送root\r expect { "Login" { send: "root\r" } }

 

4、interact命令

允许人为干预交互

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

 

5、set和puts命令

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

expect
  • 01
  • 02
  • 03
#设置变量user的值为root,输出变量user的值 set user “root” puts $user

 
 

四、常用场景

1、获取脚本传入参数

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

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

 

2、超时处理(timeout)

set timeout 超时时间,然后expect tomeout

expect
  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
#30秒超时,超时后退出程序 spawn -noecho telnet $ipaddress set timeout 30 expect { timeout exit "Login" { send: "root\r" } }

 

3、文件结尾处理(eof)

expect执行结束, 退出

expect
  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
spawn -noecho telnet $ipaddress set timeout 30 expect { timeout exit eof { puts: "finish" } "Login" { send: "root\r" } }

 

4、匹配所有样式

可以对timeout和eof做统一处理

expect
  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
spawn -noecho telnet $ipaddress set timeout 30 expect { "Login" { send: "root\r" } default {exit 1} }

 

五、Example

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

expect
  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
#!/usr/bin/expect spawn -noecho ssh root@192.168.1.1 expect "*password:" send "321321321\r" expect "#" send "ls\n" interact