欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Expect脚本学习

程序员文章站 2022-07-14 15:34:39
...

一、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 [email protected]
expect "*password:"
send "321321321\r"
expect "#"
send "ls\n"
interact
相关标签: 杂论 linux