系列文章目录
前言
expect 是由Don Libes基于Tcl(Tool Command Language )语言开发的,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,可以将交互过程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率。
一、概述
Expect是一种自动化交互式工具,可以模拟用户输入并响应输出。它具有多种应用领域,如自动化测试、系统管理、网络管理等。
1.expect使用原理
(1)原理介绍:
spawn启动指定进程——expect获取指定关键字——send向指定程序发送指定字符——执行完成退出
(2)spawn命令介绍:
spawm命令就是用来启动新的进程的。spawn后的send和expect命令都是和spawn打开的进程进行交互的
(3)send命令介绍:
send命令接收一个字符串参数,并将该参数发送到进程,这个过程类似模拟人类输入密码
(4)interact命令介绍:
结合spawn、expect、send自动化的完成很多任务,interact命令可以在适当的时候进行任务的干预,比如下载完ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令
2.常用指令
指令 | 说明 |
---|---|
set timeout | 设置超时时间,表示该脚本代码需在n秒钟内完成,如果超过,则退出。如果设置为-1表示不会超时 |
spawn | 交互程序开始后面跟命令或者指定程序(在壳内启动这个进程) |
expect | expect 从交互程序进程中指定接收信息, 如果匹配成功, 就执行send的指令交互;否则等待timeout秒后自动退出expect语句 |
send | 如果匹配到expect接受到的信息,就将send中的指令交互传递,执行交互动作。(从壳外向壳内进程发送一条字符串,回车符为确认结束) |
interact | 执行完代码后保持交互状态,将控制权交给用户。没有该命令执行完后自动退出而不是留在远程终端上 |
exit | 退出expect脚本 |
eof | spawn进程结束后会向expect发送eof,接收到eof代表该进程结束 |
exp_continue | 表示循环式匹配,通常匹配之后都会退出语句,但如果有exp_continue则可以不断循环匹配,输入多条命令,简化写法。 |
send_user | 用来打印输出 相当于shell中的echo |
set | 定义变量 |
puts | 输出变量 |
$argv expect | 脚本可以接受bash的外部传参,可以使用[ lindex $argv n ]n为0表示第一个传参,为1表示第二个传参,以此类推 |
二、示例
1.不需要用户交互
#!/usr/bin/expect
set timeout 10
spawn ssh root@192.168.1.200
expect "*password:"
send "123456\r"
expect "#"
send "ls\r"
expect "#"
send "date\r"
expect "#"
send "exit\r"
expect eof
2.需要用户交互
#!/usr/bin/expect
set timeout 10
spawn ssh root@192.168.1.200
expect "*password:"
send "123456\r"
expect "#"
interact
总结
总之,学习Expect需要坚持实践,不断尝试和调试,加深对Expect的理解和掌握。通过不断积累经验,可以在工作中更加高效地利用Expect进行自动化操作。