导航:
一、expect安装、介绍、使用场景二、expect使用原理三、expect使用语法四、expect使用举例五、expect相关错误处理
- - - - - - - - - 分割线 - - - - - - - - - - 一、expect安装介绍1.expect命令安装:安装语句:yum install expect2.expect命令含义:
expect是一种脚本语言,它能够代替人工实现与终端的交互,主要应用于执行命令和程序时 , 系统以交互形式要求输入指定字符串,实现交互通信 。
3.expect使用场景:
(1)并根据预定标准回答其问题,回答“是”、“否”或将控制权交还给您
(2)远程连接设备并执行自动化操作
(3)主要是一些需要人机交互的地方,如果提前知道应该输入什么指令都可以使用expect 工具
二、expect使用原理
1.原理介绍:
spawn
启动指定进程—expect
获取指定关键字—send
向指定程序发送指定字符—执行完成退出
2、spawn命令介绍:
spawm命令就是用来启动新的进程的 。spawn后的send和expect命令都是和spawn打开的进程进行交互的、
3、send命令介绍:
send命令接收一个字符串参数 , 并将该参数发送到进程,这个过程类似模拟人类输入密码
4、interact命令介绍:
结合spawn、expect、send自动化的完成很多任务,interact命令可以在适当的时候进行任务的干预,比如下载完ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令
三、expect使用语法
1. expect 启用选项:
-c 执行脚本前先执行的命令,可多次使用-d debug模式 , 可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似 。-D 启用交换调式器,可设一整数参数 。-f 从文件读取命令,仅用于使用#!时 。如果文件名为"-" , 则从stdin读取(使用"./-"从文件名为-的文件读取) 。-i 交互式输入命令,使用"exit"或"EOF"退出输入状态-- 标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect ---v 显示expect版本信息2.expect命令参数:
spawn 交互程序开始,执行后面的命令或程序 。需要进入到expect环境才可以执行 , 不能直接在shell环境下直接执行set timeout n 设置超时时间,表示该脚本代码需在n秒钟内完成,如果超过,则退出 。用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住 。如果设置为-1表示不会超时set 定义变量$argv expect脚本可以接受bash的外部传参,可以使用[ lindex $argv n ]n为0表示第一个传参,为1表示第二个传参,以此类推expect 从交互程序进程中指定接收信息, 如果匹配成功, 就执行send的指令交互;否则等待timeout秒后自动退出expect语句send 如果匹配到expect接受到的信息,就将send中的指令交互传递,执行交互动作 。结尾处加上\r表示如果出现异常等待的状态可以进行核查exp_continue 表示循环式匹配 , 通常匹配之后都会退出语句,但如果有exp_continue则可以不断循环匹配,输入多条命令 , 简化写法 。exit 退出expect脚本expect eof spawn进程结束后会向expect发送eof,接收到eof代表该进程结束interact 执行完代码后保持交互状态,将控制权交给用户 。没有该命令执行完后自动退出而不是留在远程终端上puts 输出变量
四、expect使用举例
1.expect脚本实现ssh自动登录远程服务器
#!/usr/bin/expectspawn ssh mrswhite@192.168.37.9expect "*password:"send "test20221007\r"expect "*#"interactexpect expect_demo1.sh 执行查看运行结果:
文章插图
2.expect脚本实现ssh自动登录远程服务器(通用脚本,手动输入参数)
#!/usr/bin/expectif {$argc < 3} {puts "Usage:cmd <host> <username> <password>"exit 1}set timeout -1set host [ lindex $argv 0 ]set username [ lindex $argv 1 ]set password [ lindex $argv 2 ]spawn ssh$username@$hostexpect "*password*" {send "$password\r"}interact./expect_demo2.sh 192.168.37.9 mrswhite test20221007 执行查看运行结果:
文章插图
3.在shell 中嵌套expect
通过expect嵌套shell使用语句在shell内直接执行,任何这样可以实现更多的功能
#!/bin/bashuser="mrswhite"host="192.168.37.9"password="test20221007"/usr/bin/expect << EOFset time 20spawn ssh $user@$hostexpect {"*yes/no" { send "yes\r"; exp_continue }"*password:" { send "$password\r" }}expect "*#"send "pwd\r"expect "*#"send "df -h\r"expect "*#"send "exit\r"interactexpect eofEOF
推荐阅读
- liunx之expect操作详解
- 原神寻星之旅第七天怎么通关
- 花亦山心之月阴错阳差第二天怎么通关
- 咸鱼之王大乱斗怎么玩
- 猫之城乐园惊魂夜万圣节活动怎么玩
- 明日之后房子怎么悬空
- 宝石研物语:伊恩之石格蕾蒂怎么养成
- 宝石研物语:伊恩之石芋芋是谁
- 宝石研物语:伊恩之石芋芋技能是什么
- 宝石研物语:伊恩之石阴云密布关卡怎么过