目录

❀expect命令运用于bash❀

expect使用原理

expet使用场景

常用的expect命令选项

Expect脚本的结尾

常用的expect命令选参数

Expect执行方式

单一分支语法

多分支模式语法第一种

多分支模式语法第二种

在shell 中嵌套expect

Shell Here Document(内嵌文档/嵌入文档) 

Here Document 的基本用法

用法说明

观点


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远程主机网络不可达时卡住及在远程主机执行命令宕住。默认情况下,timeout10秒

send_user :回显命令,相当于echo

$argv参数数组Expect脚本可以接受从bash传递参数可以使用[lindex $argc n]获得,n从0开始,分别表示第一个第二个第三个…参数

arg参数vvalue。)

Expect脚本的结尾

expect脚本必须以interactexpect eof结束,执行自动化任务通常expect eof就够了

expect eof是在等待结束标志。由spawn启动的命令在结束时会产生一个eof标记,expect eof就是等待这个标记。

常用的expect命令选参数

-c命令行执行expect脚本

i交互地执行expect脚本。使用“-i选项,可以通过来自于标准输入的读命令来交互地执行expect脚本。

ddebug模式,可以在运行输出一些诊断信息输出调试信息 示例expect d ssh.exp

-D:启用交换调式器,可设一整数参数

f文件读取命令,仅用于使用#!时。如果文件名为”-“,则从stdin读取(使用”./-“从文件名为-的文件读取)

v 显示expect版本信息

b:不解释命令行参数

Expect执行方式

单一分支语法

expect “password:” {sendmypasswordr“}

分支模式语法第一种

expect “aaa” {send “AAAr“}

expect “bbb” {send “BBBr“}

expect “ccc” {send “CCCr“}

ps.send命令不具备回车换行功能,所以需要自己添加r n

分支模式语法第二种

expect {

aaa” {send “AAAr“}

bbb” {send “BBBr”}

ccc” {send “CCCr”}

}

#只要匹配aaa 或bbb或ccc中的任何一个,执行相应的send语句后就会退出该expect语句

expect {

aaa” {send “AAAr”;exp_continue}

“bbb” {send “BBBr”;exp_continue}

“ccc” {send “CCCr”}

} 

#exp_continue表示继续后面的匹配,如果匹配aaa,执行完send语句还会继续向下匹配bbb

#捕捉内容要用双引号引起来

#send要写在{}中,输出信息也要用双引号引起来,分号“”要写在}里面

shell嵌套expect

#!/bin/bash

user=root
ip=192.168.56.103
passwd='123456'

expect <<-EOF
set time 30
spawn ssh $user@$ip
expect {
	"*yes/no" { send "yesn"; exp_continue }
	"*password" { send "$passwdn" }
}
interact
EOF

其中 <<-EOFEOF 包围的内容块,被重定向到左侧命令 expect 的 stdin 中

Shell Here Document(内嵌文档/嵌入文档 

Shell 还有一种特殊形式的重定向叫做“Here Document”,目前没有统一翻译,你可以将它理解为“嵌入文档”“内嵌文档”“立即文档”。

所谓文档,就是命令需要处理数据或者字符串;所谓嵌入,就是数据代码放在一起,而不是分开存放比如数据放在一个单独的文件中)。有时候命令需要处理的数据量很小,将它放在一个单独的文件中有点“大动干戈”,不如直接放在代码中来得方便。

Here Document 的基本用法

command <<EOF 

document 

EOF 

command是 Shell 命令,<<EOF是开始标志,EOF是结束标志,document输入的文档(也就是一行一行字符串)。

这种写法告诉 Shelldocument 部分作为命令需要处理的数据,直到遇见终止符EOF为止(终止符EOF不会被读取)。

注意,终止符EOF必须独占一行,并且要定顶格写

分界符(终止符)可以是任意字符串,由用户自己定义比如 END、MARKER等,ABC也可以,只要前后一致,分界符可以出现在正常的数据流中,只要它不是顶格写的独立的一行,就不会被作为结束标志。

结尾的标记一定要顶格写,前面不能有任何字符,除了空格, 结尾的标记后面也不能有任何字符(包括空格

用法说明

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, Tektronixat&amp;T, ComputerVision和世界银行利用Expect对开发项目文件传输帐号管理网络测试进行室内自动测试。

Expect已经以多种模块方式移植到Pythonperl语言中。Expect命令的部分子集移植到Java和嵌入到SwichTermJ(基于Java终端仿真器)之中。这些例行程序通常是原程序的同等功能的另一种解释方式。一旦你理解了其中的概念,如果需要的话,换到其它语言,也就很容易了。

Expect继承了Tcl的语法规范,对于使用其它脚本语言的人来说这是相当陌生的。和其它语言bashcsh和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等工具来实现自动化控制

原文地址:https://blog.csdn.net/m0_62022097/article/details/134786511

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_42644.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注