Linux期望命令将脚本写入完全新的级别。它不是自动化进程,它自动运行和响应其他脚本。换句话说,您可以编写一个讨论脚本,询问您是如何创建的,然后创建既运行它并告诉它您可以的脚本。
下面是bash脚本:
#!/ bin / bash回声“你好吗?”读ans.
这是预计脚本,它为查询提供响应:
#!/usr/bin/expect set timeout -1 spawn ./ask # ask is script to run expect "How are you doing? "\r" send - "ok\r" expect eof
运行脚本时,您应该看到以下内容:
$ ./ask.exp spawn ./ask你好吗?好的
请注意,您只需调用预期脚本(ark.exp)。脚本本身为您回答问题。
上面显示的预计脚本(ark.exp)的第一行禁用可能的超时。第二次启动脚本,这些脚本将要求使用响应产卵。
请注意,预期提示必须匹配精确要求的内容。甚至“你好吗?”和“你怎么样?”(注意问号和引号之间的额外空格)不是匹配。并且,如果您的脚本包含该命令echo -n“你好吗?”, 这预计需要使用的脚本期待“你好吗?”,而不是期待“你好吗?\ n”。
这是一个稍微复杂的例子。如果您使用的脚本要求您识别要备份的目录以压缩的tar文件的形式,它可能如下所示:
#!/ bin / bash echo -n“目录>”读取dir tar -czf $ dir.tar.gz〜/ $ dir
相应的期望脚本运行脚本并提供要备份的目录的名称可能如下所示:
#!/ usr / bin /期望set timeout -1 spawn ./dirbackup期望“目录>”发送 - “pngs \ r”期待eof
显然,这个脚本并不是特别有用,因为它只是一个特定目录备份,你可以通过刚刚运行来更轻松地完成焦油命令。对于更复杂的相互作用,情况就不是这样了。
何时使用expect
一般来说,这是您可能想要使用的唯一时间预计是用脚本问的问题比你想回答的要多,或者当你不在的时候你想运行的要多。例如,用于安装某些特定应用程序的脚本可能会提出6个关键问题,然后要求您在继续安装之前多次回答“y”。有时,您可能需要在32个服务器上安装应用程序,或者只是想要或在没有人使用它们的情况下彻夜安装它。你可以通过询问来自动化这个过程预计运行脚本并为您提供所有答案。
这是一个例子,但在这种情况下脚本并不真正做它收集的答案。
安装脚本:
#!/ bin / bash回声-n“安装文件的位置>”read dir echo-n“您希望安装的组件[全部,核心,enduser]>”读取ans echo -n“是您的许可证文件 -致新日期?[y,n]>“读取ansho-n”应该记录用户响应吗?[y,n]>“读取ans echo -n”输入y,如果准备开始安装[y,n]>“读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命令,它将创建预计脚本。你可以使用类似的命令自动输入./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脚本
设置超时-1 spawn ./ask04 match_max 100000期望 - 表格“安装文件的位置>”send - “/ var /安装\ r”期望 - 表格“/ var /安装\ r您希望安装哪些组件\ [所有,核心,enduser \]>“send - ”全部\ r“期望 - all \ r是您的许可证文件最新?\ [y,n \]>”发送 - “y \ r“期望 - y \ r应该记录用户响应?\ [y,n \]>”send - “y \ r”期望 - 如果准备好开始安装\ [y,n\]>“发送 - ”y \ r“期待eof
这autoexpect工具为非交互式地运行安装准备脚本。然后,您可以在不提供详细信息的情况下进行安装,或者只是安排它们自己运行。
总结
这预计命令对于运行需要一长串答案的脚本非常方便,并且允许您以无人操作的方式运行它们autoexpect让它变得容易创造预计脚本而不强调语法细节。