在Linux上使用expect和autoexpect自动响应脚本

齿轮桔大型高效自动化机器学习自动化
思想库

Linux expect命令将脚本编写带到一个全新的水平。它不是自动化流程,而是自动化运行和响应其他脚本。换句话说,您可以编写一个询问您的情况的脚本,然后创建一个期望脚本,运行它并告诉它您很好。

下面是bash脚本:

#!/bin/bash echo "How are you doing?

以下是提供查询响应的expect脚本:

#!/usr/bin/expect set timeout -1 spawn ./ask # ask is script to run expect "How are you doing? "\r" send - "ok\r" expect eof

当你运行这个脚本时,你应该看到:

美元。/问。How are you doing?(你好吗?)好吧

注意,您将只调用expect脚本(ask.exp)。脚本本身为您解答了这个问题。

上面显示的expect脚本(ask.exp)的第一行禁用了可能的超时。第二个脚本将请求使用产卵

注意,所期望的提示必须与所要求的精确匹配。甚至“你怎么样?”“你怎么样?”(注意问号和引号之间的额外空格)不是匹配。并且,如果您的脚本包含该命令echo -n“你好吗?”,预计需要使用的脚本期待“你好吗?”,而不是expect“How are you doing?”\ n”

这里有一个稍微复杂一点的例子。如果您使用的脚本要求您以压缩tar文件的形式标识您想要备份的目录,它可能看起来像这样:

#!/bin/bash echo -n "Directory> " read dir tar -czf $dir.tar.gz ~/$dir .gz

运行该脚本并提供要备份的目录名的相应的expect脚本可能如下所示:

#!/usr/bin/expect set timeout -1 spawn ./dirbackup expect "Directory> " send——" png \r" expect eof ./ usr/bin/expect

显然,这个脚本并不是特别有用,因为它只备份一个特定的目录,您可以通过运行焦油命令。对于更复杂的相互作用,情况就不是这样了。

何时使用expect

一般来说,这是您可能想要使用的唯一时间预计是用脚本问的问题比你想回答的要多,或者当你不在的时候你想运行的要多。例如,用于安装某些特定应用程序的脚本可能会提出6个关键问题,然后要求您在继续安装之前多次回答“y”。有时,您可能需要在32个服务器上安装应用程序,或者只是想要或在没有人使用它们的情况下彻夜安装它。你可以通过询问来自动化这个过程预计运行脚本并为您提供所有的答案。

下面是一个示例,不过本例中的脚本并没有真正处理它收集的答案。

安装脚本:

#!/bin/bash echo -n "安装文件>的位置" read dir echo -n "你希望安装哪个组件[all,core,enduser]> " read ans echo -n "你的许可证文件是最新的吗?[Y,n]> " read ans echo -n "是否应该记录用户响应?[Y,n]> " read ans echo -n "输入Y如果准备开始安装[Y,n]> " read ans

运行此脚本的期望脚本看起来类似:

#!/usr/bin/expect set timeout -1 spawn ./installapp expect "安装文件>的位置" send "/var/ installing \r" expect "你希望安装哪个组件> " send "all\r" expect "许可证文件是最新的吗?用户响应应该被记录下来吗?\\[Y,n\\]> " send "Y\r" expect " if ready to begin install \\[Y,n\\]> " send "Y\r" expect eof

当然,安装脚本需要使用收集到的答案并运行适当的命令来安装所需的软件。这里的诀窍是捕捉将被问到的问题,并给每个问题发送正确的答案。

注意这里使用的\\序列预计脚本需要转义方括号。

Autoexpect

有一种方法可以做准备预计编写脚本更容易。也就是说,您可以将脚本作为参数提供给autoexpect命令,它将创建预计脚本。你可以使用类似的命令autoexpect。/ installapp它会建立一个预计用你提供的答案编写脚本:

$ autoexpect ./installapp autoexpect启动,文件是脚本。你希望安装哪个组件[all,core,enduser]> all你的许可证文件是最新的?[Y,n]> Y是否应该记录用户响应?[Y,n]> Y输入Y如果准备开始安装[Y,n]> Y autoexpect done, file is script.exp

结果script.exp然后,文件将包含一个用于创建它的说明autoexpect还会包括你提供的回复。下面是我们在上面的交互之后在文件中看到的内容:

$ tail -18脚本
set timeout -1 spawn ./ask04 match_max 100000 expect -exact "安装文件>的位置" send——"/var/ installing \r" expect -exact "/var/ installing \r你希望安装的组件\[all,core,enduser\]> " send——"all\r" expect -exact "all\r你的许可文件是最新的吗?[Y,n]> " send——"Y\r" expect -exact "Y\r应该记录用户响应吗?[Y,n]> " send——"Y\r" expect -exact "Y\r输入Y if ready to begin install \[Y,n\]> " send——"Y\r" expect eof

autoexpect工具为非交互式地运行安装准备脚本。然后,您可以在不提供详细信息的情况下进行安装,或者只是安排它们自己运行。

总结

预计命令对于运行需要一长串答案的脚本非常方便,并且允许您以无人操作的方式运行它们autoexpect使其易于创建预计没有强调语法细节的脚本。

加入网络世界社区有个足球雷竞技app脸谱网LinkedIn对自己最关心的话题发表评论。
相关:

版权©2021Raybet2

2021年IT薪资调查:结果已经出来了