一、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