首页 > 自考资讯 > 自考知识

linux交互进程,linux交互式shell的设计与实现

头条共创 2024-07-05

概述

我使用Linux 的朋友习惯于输入密码来执行诸如使用超级用户运行命令或使用scp 或ssh 连接到远程主机之类的操作。如果您的脚本有scp 操作,您将需要监控脚本执行情况,因为您无法输入一次密码并运行scp。 为了解决这个问题,您需要能够自动填充密码。

Expect是一个基于tcl的工具,可以自动执行多个需要交互的任务。这相当于模拟用户和命令行之间的交互。

具体场景:远程登录服务器并运行命令。

expect是什么?

Expect 是一个免费的编程工具,用于实现自动化和交互式任务,无需人工干预。简而言之,expect是一套用来实现自动交互功能的软件。

在现实生活中,当运行命令、脚本或程序时,需要从终端发出某些指令才能继续运行这些命令、脚本或程序,并且这些输入必须手动进行。 Expect 允许您根据程序的提示模拟提供给程序的标准输入,从而实现自动化和交互式执行。这正如预期的那样!

expect基础

当您使用Expect 时,您基本上会处理四个命令:

命令功能:send 用于向进程发送字符串,expect 从进程接收字符串,spawn 启动新进程,interact 允许用户交互。

9ff0ae1814e0466f85e4c357d3123dd9~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720738252&x-signature=Z6yVeZ%2BneBL8d1AkW873X76JGic%3D 说明:

send 命令采用字符串参数并将该参数发送到进程。 Expect 命令与send 命令相反。 Expect通常用于等待进程的反馈,并根据进程的反馈发送相应的交互命令。 spawn 命令用于启动一个新进程。生成后的发送和期望命令都与使用生成打开的进程进行交互。事实上,interact命令很少被使用。一般情况下可以使用spawn、send、expect命令来完成任务,但特殊情况下主要使用interact命令。退出自动化并进入人机交互。例如,使用spawn、send、expect命令完成ftp登录主机并执行文件下载任务。但是,我希望能够在文件下载完成后保持ftp 命令行状态。此时,您可以手动运行后续命令。使用交互命令成功完成此任务。终结者

Expect eof:等待执行完成。如果没有此语句,脚本可能会在执行任何命令之前退出。

交互式:运行完成后保持交互式,允许您在此时手动输入信息。

注意:您可以在Expect Eof 和Interact 之间进行选择。

实例

下面使用一些常用的expect脚本来演示如何使用expect来完成一些日常任务。

e1d47bddc4214e188f836113affa1150~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720738252&x-signature=MzCyJsGobhFiZKghxdpnndu7swk%3D 这是非常简单的Expect 示例代码,显示了Expect 的基本用法。

#!/usr/bin/expect:使用expect来解释脚本。

设置超时30:设置超时(以秒为单位)。默认值为10 秒。

设置主机“xx.xx.xx.xx”:设置变量。

spawn ssh $username@$host:spawn是一个expect内部命令,进入expect环境后可以执行。如果没有安装expect或者直接在默认的SHELL中运行,会找不到spawn命令。它的主要功能是给ssh运行进程添加一个shell,提供交互指令。

Expect '*password*':Expect 也是expect 的内部命令。该命令判断最后的输出是否包含字符串“password”,如果是则立即返回,或者等待一段时间再返回。这里的等待时间是30秒,这是之前设置的。

send '$password\r':如果对应的输出结果匹配,则将密码发送到open ssh进程,并执行交互动作。

交互:执行完成后保持交互并将控制权转移到控制台。此时可以进行手动操作。如果没有这样的语句,则不会停留在远程终端,登录完成后会退出。

这里面其实包含了expect ——模式一个非常重要的概念——action,即上面代码代表的就是expect '*password*' {send '$password\r'} 。

五、模式-动作

让我们基于代码Expect '*password*' {send '$password\r'} 来讨论“模式操作”。简单来说,当模式匹配时,执行相应的操作,当密码字符串匹配时,输入密码。您可能还会看到类似于以下内容的代码:

2d134bf01b454b7e99e99a03d941f177~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720738252&x-signature=QzJesWJUedzRYI8gVRH%2BP8bzTeE%3D 其中,exp_ continue 表示循环匹配,一般情况下语句在匹配后结束,但使用exp_ continue 可以继续循环匹配,输入多条命令。

六、传参

通常需要将参数传递给脚本。让我们看看如何使用具有预期值的参数。

19ed616abf54458183f42ff468966783~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720738252&x-signature=aiZaxAEziQthfnYPTM%2F%2FnvLTnuw%3D 在Expect中,\$argc代表参数个数,参数值存储在$argv中。例如,第一个参数为[hwb $argv 0]。

总结

一旦您在工作中擅长使用shell 脚本,您就可以通过将它们与expect 结合起来自动执行许多任务。但如果你了解了Python,你的视野就会扩大,然后你的期望就会再次变成“讨厌”。

稍后我将分享更多DevOps 和DBA 内容,如果您感兴趣,请继续关注。

54a20298d03c4602a77341599d74d20b~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720738252&x-signature=%2BTkYgY1a2pA425Kou46o2mKgqbg%3D

版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。

猜你喜欢