❀expect命令运用于bash❀
目录
❀expect命令运用于bash❀
expect使用原理
expet使用场景
常用的expect命令选项
Expect脚本的结尾
常用的expect命令选参数
Expect执行方式
单一分支语法
多分支模式语法第一种
多分支模式语法第二种
在shell 中嵌套expect
Shell Here Document(内嵌文档/嵌入文档)
Here Document 的基本用法
expect变量如何定义和调用?
函数传参数给expect应该如何实现?
用法说明
观点
利
弊
❀expect命令运用于bash❀
功能说明:expect是一款自动化的脚本解释型的工具。
(ps.expect基于tcl脚本,expect脚本的运行需要tcl的支持。expect对一些需要交互输入的命令很有帮助,比如ssh ftp scp telnet。远程登录linux服务器的时候,ssh命令需要手工输入密码,当登录多台机器的时候就会非常繁琐。expect就可以根据设定的规则,自动帮我们输入密码,大大节省了时间。在shell脚本中使用expect命令可以实现自动化交互式操作,例如自动登录远程服务器、自动执行命令等。)
expect使用原理
spawn启动指定进程—expect获取指定关键字—send向指定程序发送指定字符—执行完成退出。
expet使用场景
①并根据预定标准回答其问题,回答“是”、“否”或将控制权交还给您
②远程连接设备并执行自动化操作
③主要是一些需要人机交互的地方,如果提前知道应该输入什么指令都可以使用expect 工具
常用的expect命令选项
spawn:启动一个新的进程,并将其与当前进程进行交互。
expect:等待特定的字符串或正则表达式出现,并执行相应的操作。
send:向进程发送字符串,并将该参数发送到进程,这个过程类似模拟人类输入密码。
interact:允许用户与进程进行交互,interact命令可以在适当的时候进行任务的干预,比如下载完ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令。
exp_continue:允许expect继续向下执行指令,在expect中多次匹配就需要用到。
exit:退出expect脚本。
eof:expect执行结束,退出。
set:设置变量。
puts:输出变量。
Timeout:指定超时时间,set timeout n,过期则继续执行后续指令 ,设置超时时间,表示该脚本代码需在n秒钟内完成,如果超过,则退出。timeout -1为永不超时,用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住。默认情况下,timeout是10秒。
send_user :回显命令,相当于echo。
$argv参数数组:Expect脚本可以接受从bash传递的参数,可以使用[lindex $argc n]获得,n从0开始,分别表示第一个,第二个,第三个…参数。
(arg:参数; v:value。)
Expect脚本的结尾
expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了
expect eof是在等待结束标志。由spawn启动的命令在结束时会产生一个eof标记,expect eof就是在等待这个标记。
常用的expect命令选参数
-c:命令行执行expect脚本
-i:交互地执行expect脚本。使用“-i”选项,可以通过来自于标准输入的读命令来交互地执行expect脚本。
-d:debug模式,可以在运行时输出一些诊断信息,输出调试信息 。 示例:expect -d ssh.exp
-D:启用交换调式器,可设一整数参数
-f 从文件读取命令,仅用于使用#!时。如果文件名为"-",则从stdin读取(使用"./-"从文件名为-的文件读取)
-v 显示expect版本信息
-b:不解释命令行参数
Expect执行方式
单一分支语法
expect "password:" {send "mypassword\r"}
多分支模式语法第一种
expect "aaa" {send "AAA\r"}
expect "bbb" {send "BBB\r"}
expect "ccc" {send "CCC\r"}
ps.send命令不具备回车换行功能,所以需要自己添加\r 或 \n
多分支模式语法第二种
expect {
"aaa" {send "AAA\r"}
"bbb" {send "BBB\r"}
"ccc" {send "CCC\r"}
}
#只要匹配了aaa 或bbb或ccc中的任何一个,执行相应的send语句后就会退出该expect语句
expect {
"aaa" {send "AAA\r";exp_continue}
"bbb" {send "BBB\r";exp_continue}
"ccc" {send "CCC\r"}
}
#exp_continue表示继续后面的匹配,如果匹配了aaa,执行完send语句后还会继续向下匹配bbb
#捕捉内容要用双引号引起来
#send要写在{}中,输出信息也要用双引号引起来,分号“;”要写在}里面。
在shell 中嵌套expect
#!/bin/bashuser=root
ip=192.168.56.103
passwd='123456'expect <<-EOF
set time 30
spawn ssh $user@$ip
expect {"*yes/no" { send "yes\n"; exp_continue }"*password" { send "$passwd\n" }
}
interact
EOF
其中 <<-EOF 和 EOF 包围的内容块,被重定向到左侧命令 expect 的 stdin 中。
Shell Here Document(内嵌文档/嵌入文档)
Shell 还有一种特殊形式的重定向叫做“Here Document”,目前没有统一的翻译,你可以将它理解为“嵌入文档”“内嵌文档”“立即文档”。
所谓文档,就是命令需要处理的数据或者字符串;所谓嵌入,就是把数据和代码放在一起,而不是分开存放(比如将数据放在一个单独的文件中)。有时候命令需要处理的数据量很小,将它放在一个单独的文件中有点“大动干戈”,不如直接放在代码中来得方便。
Here Document 的基本用法
command <<EOF
document
EOF
command是 Shell 命令,<<EOF是开始标志,EOF是结束标志,document是输入的文档(也就是一行一行的字符串)。
这种写法告诉 Shell 把 document 部分作为命令需要处理的数据,直到遇见终止符EOF为止(终止符EOF不会被读取)。
注意,终止符EOF必须独占一行,并且要定顶格写。
分界符(终止符)可以是任意的字符串,由用户自己定义,比如 END、MARKER等,ABC也可以,只要前后一致,分界符可以出现在正常的数据流中,只要它不是顶格写的独立的一行,就不会被作为结束标志。
结尾的标记一定要顶格写,前面不能有任何字符,除了空格, 结尾的标记后面也不能有任何字符(包括空格)
expect变量如何定义和调用?
expect 是一个在交互式命令行环境下自动化输入输出的工具。在使用 expect 时,我们需要定义一个脚本来描述程序的交互过程,然后通过 expect 命令来执行这个脚本。
在 expect 脚本中,我们可以使用 set 命令来定义变量。例如,下面的代码定义了一个名为 password 的变量,并将其值设置为字符串 "mypassword":
set password "mypassword"
在脚本中,我们可以通过 $ 符号来引用变量。例如,下面的代码将会输出变量 password 的值:
puts $password
如果我们想要在 expect 脚本中调用外部命令并获取其输出,可以使用 exec 命令。例如,下面的代码将会调用 ls 命令并将其输出保存到变量 files 中:
set files [exec ls]
在脚本中,我们可以通过 $ 符号来引用变量。例如,下面的代码将会输出变量 files 的值:
puts $files
函数传参数给expect应该如何实现?
在shell脚本中调用expect脚本时,可以使用命令行参数将参数传递给expect脚本。具体实现方法如下:
在shell脚本中定义需要传递的参数,例如:
#!/bin/bashusername="user"password="pass"
# ./expect_script.sh $username $password
在expect脚本中使用$1、$2等变量来获取传递的参数,例如:
#!/usr/bin/expectset username [lindex $argv 0]set password [lindex $argv 1]
这样就可以将shell脚本中定义的参数传递给expect脚本了
#!/bin/bash
ip_choice='10.1.1.1'
passwd='123456'con(){
/usr/bin/expect << EOF | tail -n 1
spawn ssh root@$ip_choice
expect {"*password:" { send "$passwd\r"; exp_continue }"*yes/no" { send "yes\r"; exp_continue }
}
set spawn_id \$spawn_id
puts \$spawn_id
EOF
}comad(){
spawn_id=$(con)
/usr/bin/expect << EOF
set spawn_id $spawn_id
expect -i \$spawn_id "*#"
send -i \$spawn_id "echo 'hellow'\r"
expect -i \$spawn_id "*#"
send -i \$spawn_id "echo 'hellow'\r"
expect -i \$spawn_id eof
EOF
}comad
spawn_id=$(con)这条语句的作用是调用con函数,并将con函数的输出(也就是spawn_id)赋值给spawn_id变量
Expect脚本中,set命令用于设置变量的值,而puts命令用于打印输出。在这个例子中,set spawn_id $spawn_id是将当前spawn的进程ID(也就是SSH连接的ID)赋值给变量spawn_id,而puts $spawn_id则是将这个变量的值打印出来。
expect 命令会开的SSH启动一个连接,expect -i $spawn_id和send -i $spawn_id来指定我们要在哪个连接上执行命令
| tail -n 1:这是一个管道命令,它接收前一个命令的输出作为输入。tail -n 1命令会输出输入的最后一行。在这个例子中,它会输出expect脚本的最后一行的输出,意思是执行expect脚本,并返回脚本输出的最后一行。这个输出被赋值给spawn_id变量,然后在comad函数中被使用。
用法说明
Expect是一种将现有的实用程序组合起来的胶合剂,通常考虑的是如何使Expect利用系统现有的工具解决问题而不是如何在Expect中解决问题。
Expect主要应用涉及商用软件产品。很多这类的产品都会提供某种命令行工具,但这些工具缺乏脚本编程的能力,只是为了帮助用户管理产品,而商家通常不会在如何实现一个稳定性好的脚本语言上耗费很多精力。Expect脚本中可以包含shell,查询环境变量,通过执行某些Unix命令获得更多的信息,然后在产品所带命令行接口中加入必须的信息,来完成用户的目标。在产品命令行接口中查询相关信息,该脚本可以在多种选择中智能地决定当前应该做什么比较合适。
每次Expect操作完成,运行结果将保存在本地环境变量 $expect_out 中。这允许脚本收集这些信息给用户以相应的反馈,同时也允许根据当前情况发送相对应的指令。
Expect通常用来建立一组测试套件,可以用在程序、组件或者嵌入式系统中。DejaGnu就是利用Expect写成的一组测试套件。它被大量地应用于测试 gcc,对于远程目标的测试例如嵌入式开发也是非常合适的。
你可以利用一种叫作”autoexpect”的工具,自动生成expect脚本。这个工具观测你的操作,并利用启发性知识生成expect脚本。尽管生成的代码可能会很长,含义上有点模糊,你可以修改生成的脚本使它成为你需要的代码。
观点
利
Expect可通过cron封装系统管理任务,在规定的时期运行。能够这样做是因为Expect仅仅使用已经安装在主机中的系统管理工具,不需要学习额外的工具。如果程序员学过Tcl,那么转移到Expect是一件非常简单的工作,相同的编程结构和语法,再加上一些内置的额外功能。
业界对室内管理任务使用Expect提供了很大的支持。Expect在很多的公司广泛使用,例如Silicon Graphics, IBM, HP, Sun, Xerox, Amdahl, Tektronix, at&T, ComputerVision和世界银行,利用Expect对开发项目、文件传输、帐号管理、网络测试进行室内自动测试。
Expect已经以多种模块的方式移植到Python和perl语言中。Expect命令的部分子集移植到Java和嵌入到SwichTermJ(基于Java的终端仿真器)之中。这些例行程序通常是原程序的同等功能的另一种解释方式。一旦你理解了其中的概念,如果需要的话,换到其它语言,也就很容易了。
弊
Expect继承了Tcl的语法规范,对于使用其它脚本语言的人来说这是相当陌生的。和其它语言如bash、csh和Perl相比,Expect的语法模式是不同的。就像有时候一个变量的前缀冠以”$”,有时候又不需要。有些版本的Expect和Perl、Python语言的语法倒是很相似的。
另一个缺陷是在不同的平台移植Expect脚本很难。例如,一个Expect脚本使用基于Unix的工具,就不可能适合移植到Windows平台。如果可能的话,程序员必须找到相应的命令行程序,能够提供相同的信息,这就可能需要修改expect脚本的send部分,而这部分恰恰就是整个脚本的核心。如果你使用的是tcl,perl或者python这些独立于平台的工具,使用它们各自的POSIX接口访问文件、对远端交互进行标准的POSIX处理(telnet,ftp等等),就不会出现上述问题。
一个不明显的缺陷是,有时Expect可能并不是解决问题的最好方法。例如,一个系统管理员需要登录到多个服务器,这些自动的操作要使用Expect就得配以保存的密码,而不是更安全的解决方案采用ssh代理密钥。虽然这种自动交互工具很吸引人,但是还是有很多其它的办法可以更安全稳定地解决同样的问题。
Expect自动化控制命令行工具,但是对图形用户界面就失效了。Windows提供了不少有价值的工具,很多是基于图形用户界面的,这就是Expect失效的地方了。Windows下图形界面程序可以通过像Autohotkey或者AutoIt等工具来实现自动化控制。
相关文章:
❀expect命令运用于bash❀
目录 ❀expect命令运用于bash❀ expect使用原理 expet使用场景 常用的expect命令选项 Expect脚本的结尾 常用的expect命令选参数 Expect执行方式 单一分支语法 多分支模式语法第一种 多分支模式语法第二种 在shell 中嵌套expect Shell Here Document(内…...
2023年团体程序设计天梯赛——总决赛题
F-L1-1 最好的文档 有一位软件工程师说过一句很有道理的话:“Good code is its own best documentation.”(好代码本身就是最好的文档)。本题就请你直接在屏幕上输出这句话。 输入格式: 本题没有输入。 输出格式: 在一…...
K8S 工具收集
杂货铺,我不用 K8S,把见过的常用工具放在这里,后面学的时候再来找 名称描述官网Pixie查看 k8s 的工具。集群性能、网络状态、pod 状态、热点图等HomeKubernetes Dashboard基于 Web 的 Kubernetes 集群用户界面。GithubGardenerSAP 开源的 K8…...
自动化测试之读取配置文件
前言: 在日常自动化测试开发工作中,经常要使用配置文件,进行环境配置,或进行数据驱动等。我们常常把这些文件放置在 resources 目录下,然后通过 getResource、ClassLoader.getResource 和 getResourceAsStream() 等方法…...
如何实现分布式调用跟踪?
分布式服务拆分以后,系统变得日趋复杂,业务的调用链也越来越长,如何快速定位线上故障,就需要依赖分布式调用跟踪技术。下面我们一起来看下分布式调用链相关的实现。 为什么需要分布式调用跟踪 随着分布式服务架构的流行…...
接口的性能优化(从前端、后端、数据库三个角度分析)
接口的性能优化(前端、后端、数据库) 主要通过三方面进行优化 前端后端数据库 前端优化 接口拆分 不要搞一个大而全的接口,要区分核心与非核心的接口,不然核心接口就会被非核心接口拖累 或者一个接口中大部分返回都很快&…...
区块链扩容问题研究【06】
1.Plasma:Plasma 是一种基于以太坊区块链的 Layer2 扩容方案,它通过建立一个分层结构的区块链网络,将大量的交易放到子链上进行处理,从而提高了以太坊的吞吐量。Plasma 还可以通过智能合约实现跨链交易,使得不同的区块…...
英语论文写作常用词汇积累
baseline:比较算法好坏中作为“参照物”而存在,在比较中作为基线;目的是比较提出算法的性能或者用以彰显所提出的算法的优势; benchmark:评价算法好坏的一种规则和标准。是目前的模型能做到的比较好的效果;…...
redis集群(cluster)笔记
1. 定义: 由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供在多个Redis节点间共享数据的程序…...
css 元素前后添加图标(::before 和 ::after 的妙用)
<template><div class"container"><div class"label">猜你喜欢</div></div> </template><style lang"scss" scoped> .label {display: flex;&::before,&::after {content: "";widt…...
C++ 设计模式 Forward Declaration Pimpl
放几轮跟 chatgpt 的对话,很精彩的回答 You 我有个问题,我的 main 目标依赖 src/gcp_subscriber.h 的 GCPSubscriber class 这个 class 有个 private 成员 google::cloud::pubsub::Subscriber 也就意味着我得在 gcp_subscriber.h 里面引用 google clou…...
【uniapp】小程序开发8:滚动组件scroll-view
我们经常需要做页面中部分内容可以滚动的功能,例如“猜你喜欢”,内容太多,通常都会超出屏幕,那么此块区域应该可以滚动,但是顶部的自定义导航栏应该不能随着滚动。 这个时候,就可以使用uniapp提供的滚动组件…...
Java王者荣耀火柴人
主要功能 键盘W,A,S,D键:控制玩家上下左右移动。按钮一:控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能,伤害小兵并让小兵停止移动。技能三:攻击多个敌人并让小兵停止移动。普攻:对小兵造成基础伤害。小…...
1.鸿蒙应用程序开发app_hap开发环境搭建
1.下载Node.js, Javascipts的运行环境 node.js版本下载v12.18.3/https://www.cnblogs.com/txwtech/p/17865780.html 2.下载并安装DevEco Studio DevEco Studio 3.1 DevEco Studio 3.1配套支持HarmonyOS 3.1版本及以上的应用及服务开发,提供了代码智能编辑、低代…...
JDK多版本集成 Jacoco 配置指南
JDK多版本集成 Jacoco 配置指南 本篇相关 JDK 版本配置如下: JDK8 JDK11 JDK17 Jacoco 是什么 Jacoco 是一个用于Java程序的代码覆盖率报告工具。它通过动态分析(在代码执行时收集数据)来生成代码覆盖率报告文件。Jacoco 支持多种覆盖率标…...
容器及容器调度(云)
在云计算中,容器是一种轻量级、可执行的软件包,它包含应用程序及其全部依赖项,包括库、二进制文件、配置文件等。容器与虚拟机不同,因为它们不需要包含完整的操作系统;相反,所有容器都共享主机操作系统的内…...
实验七 子网的划分
实验七 子网的划分 实验目的掌握划分子网的方法实验内容划分给定IP地址的子网将划分后的子网应用到网络环境中实验要求每位同学从下表中至少选择一行进行子网划分,并填写所选择行的剩余部分。(注意:子网号全0的不用)标准IP地址 要求划 分子网数 借用的主机位数 子网掩码 第…...
Proteus仿真--射击小游戏仿真设计
本文介绍基于proteus射击小游戏仿真设计(完整仿真源文件及代码见文末链接) 仿真图如下 K1-K4为4个按键,用于上移、下移、确认等,模拟单机游戏 仿真运行视频 Proteus仿真--射击小游戏仿真设计 附完整Proteus仿真资料代码资料 …...
docker的资源控制:
docker的资源控制: 对容器的使用宿主机的资源进行限制 cpu 内存 磁盘i/0 docker使用linux自带的功能cgroup control grouos是linux内核系统提供的一种可以限制,记录,隔离进程所使用的物理资源 control grouos是linux内核系统提供的一种可…...
Leo赠书活动-13期 【以企业架构为中心的SABOE数字化转型五环法】文末送书
Leo赠书活动-13期 【以企业架构为中心的SABOE数字化转型五环法】文末送书 ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
