liunx之expect简介
导航:
一、expect安装、介绍、使用场景
二、expect使用原理
三、expect使用语法
四、expect使用举例
五、expect相关错误处理
- - - - - - - - - 分割线 - - - - - - - - - - 
一、expect安装介绍
1.expect命令安装:
安装语句:yum install expect
2.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/expect spawn ssh mrswhite@192.168.37.9
expect "*password:"
send "test20221007\r"
expect "*#"
interact
expect expect_demo1.sh 执行查看运行结果:

2.expect脚本实现ssh自动登录远程服务器(通用脚本,手动输入参数)
#!/usr/bin/expect
if {$argc < 3} {
    puts "Usage:cmd <host> <username> <password>"
    exit 1
}
set timeout -1
set host [ lindex $argv 0 ]
set username [ lindex $argv 1 ]
set password [ lindex $argv 2 ]
spawn ssh  $username@$host
expect "*password*" {send "$password\r"}
interact
./expect_demo2.sh 192.168.37.9 mrswhite test20221007 执行查看运行结果:

3.在shell 中嵌套expect
通过expect嵌套shell使用语句在shell内直接执行,任何这样可以实现更多的功能
#!/bin/bash
user="mrswhite"
host="192.168.37.9"
password="test20221007"
/usr/bin/expect << EOF
set time 20
spawn ssh $user@$host
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$password\r" }
}
expect "*#"
send "pwd\r"
expect "*#"
send "df -h\r"
expect "*#"
send "exit\r"
interact
expect eof
EOF

五、相关问题解决
1.invalid command name "/usr/bin/expect"

解决方案:此时是使用bash脚本嵌套了expect代码,所以执行采用以下两种方式都可以
./expect_demo3.sh
sh expect_demo3.sh

2.invalid command name ":" 转义问题

解决方案:send里面的内容中的括号[]有问题,不能使用[],将其去除或者添加转义字符
send "cat 20221007.txt | awk -F : '{print $2}'"
send "cat 20221007.txt | awk -F \[:\] '{print $2}'\r"

liunx之expect简介的更多相关文章
- expect简介和使用例子
		
expect简介和使用例子 expect简介 expect是一款自动化的脚本解释型的工具. expect基于tcl脚本,expect脚本的运行需要tcl的支持. expect对一些需要交互输入的命 ...
 - Linux Expect 简介和使用实例
		
expect简介和使用实例 1 expect 简介 expect 是用来进行自动化控制和测试的工具. 主要是和交互式软件telnet ftp passwd fsck rlogin ssh tip 等进 ...
 - liunx之expect操作详解
		
导航: 一.expect安装.介绍.使用场景二.expect使用原理三.expect使用语法四.expect使用举例五.expect相关错误处理 - - - - - - - - - 分割线 - - - ...
 - Linux批量部署工具Expect
		
既然没有遇到过,做好准备总是好的.这是自己送给自己的话,现在运维做自动话越来越多,自己就学以下,记录笔记.目前主流的有puppet.Expect.pssh等等,今天就用Expect做自动部署和日常管理 ...
 - Linux下的expect
		
expect简介 expect是一款自动化的脚本解释型的工具. expect基于tcl脚本,expect脚本的运行需要tcl的支持. expect对一些需要交互输入的命令很有帮助,比如ssh ftp ...
 - expect自动应答
		
expect脚本 1. expect简介 expect是一个用来处理交互的命令.借助Expect,我们可以将交互过程写在一个脚本上,使之自动化完成. expect(自动应答) 基于TCL(Tool C ...
 - shell脚本  字串截取  正则表达式
		
字串处理 子串截取方法一:使用${}表达式格式:echo ${x:起始位置:长度}(起始位置编号从0开始,可省略) 方法二:使用expr substr格式:expr substr "$x&q ...
 - expect-调试模式的使用
		
1.expect简介 Expect是一种TCL扩展性的语言,主要用于完成系统交互方面的功能,比如SSH.FTP等,这些程序都需要手工与它们进行互动,而使用Expect就可以模拟人手工互动的过程,是一种 ...
 - Linux Expect自动化交互脚本简介
		
相关资料 维基百科:Expect SourceForge:The Expect Home Page TCL脚本言语简介 由于Expect是建立在TCL语言基础上的一个工具,因此首先检查一些TCL常见语 ...
 
随机推荐
- 表单中设置了 `keyup.enter.native` 的按键事件,但是回车后没有执行查询,反而会刷新页面
			
场景 添加属性对话框中,input输入后点击 enter,不会执行绑定的 handleDialogQuery 事件,反而会刷新整个页面: 如果不点击 enter,点击搜索按钮,则是正常的. 又测试:在 ...
 - 20220727-Java中方法重写override
			
目录 代码示例 注意事项 代码示例 public class OverrideExercise { public static void main(String[] args) { Person ja ...
 - JS常用的3种弹出框
			
1.提示框 alert // 没有返回值 alert('你好'); 2.确认框 confirm // 返回 false/true let res = confirm('确定删除?'); if(res ...
 - day21--Java集合04
			
Java集合04 9.Set接口方法 Set接口基本介绍 无序(添加和取出的顺序不一致),没有索引 不允许重复元素,所以最多只有一个null JDK API中接口的实现类有: Set接口的常用方法:和 ...
 - 未关中断情况下的hardlock
			
最近遇到一例crash,3.10内核,hardlock,查看对应的堆栈,中断是使能的. 查看对应的hrtimer_interrupts和hrtimer_interrupt_save的值,发现确实相等. ...
 - 【MySQL】从入门到掌握2-下载安装
			
上期:[MySQL]从入门到掌握1-一些背景知识 第一章:下载 官网下载地址: https://dev.mysql.com/downloads/mysql/ https://dev.mysql.com ...
 - 03_Linux基础-文件类型-主辅提示符-第1提示符-Linux命令-内外部命令-快捷键-改为英文编码-3个时间-stat-其他基础命令
			
03_Linux基础-文件类型-主辅提示符-第1提示符-Linux命令-内外部命令-快捷键-改为英文编码-3个时间-stat-{1..100}-du-cd-cp-file-mv-echo-id-she ...
 - Arrays.asList()你真的知道怎么用吗?
			
发现问题 前几天在看别人的项目的时候,发现一个问题,简单复现一下这个问题 // 注意这是一个Integer对象的数组哦 Integer[] arr = new Integer[]{9999,88,77 ...
 - KingbaseES timestamp 和 timestamptz 差异比较
			
KingbaseES 提供两种存储时间戳的数据类型: 不带时区的 TIMESTAMP 和带时区的 TIMESTAMPTZ. TIMESTAMP 数据类型可以同时存储日期和时间,但它不存储时区.这意味着 ...
 - Oracle PLM,协同研发的产品生命周期管理平台
			
官网:Oracle PLM - 方正璞华 适用企业:电子高科技.机械制造.医疗器械.化工行业等大型企业和中小型企业 咨询热线:4006-160-730 申请试用.预约演示.产品询价 邮箱:jiangc ...