自动化交互脚本Expect简单介绍及应用实例

本文介绍了如何使用Expect脚本自动化SSH登录服务器的过程,包括脚本的创建、使用和控制权转移,旨在减少手动操作的时间和精力浪费。

一:事出有因
最近在跟踪“40G framer link down“这个问题。这个问题,不是很容易复现,只能是一遍遍的reboot 板卡,进入cli命令行,查看link 状态。
为了分析原因,需要使 “40G framer link down“,查看相应信息。所以只能不停的reboot板卡,直到“link down“为止。这个动作,如果依靠人工来操作,那将会是一个巨大的时间和精力的浪费。
因此,想到了使用自动化处理脚本来完成这个动作—–expect脚本。

二:关于Expect脚本
关于expect脚本,可以百度出很多介绍。Expect的创建者(creator) Don Libes 写了一本介绍Expect的书,书名叫《Exploring Expect》。书里对expect的介绍是:

Expect是一个可以控制 交互式应用(interactive applications) 的程序。
这些交互式应用希望用户 点击键盘 输入信息来回应一些交互式的提示。
使用expect,你可以编写脚本 用以自动的回应这些交互提示。
使用自动交互程序,你将有能力解决之前从未想过的问题。

这大概就expect脚本语言的主要用处,就是为了自动化交互的。
关于expect,书中还写到:

1: Expect 程序没有自己的专用语言,可以用C 或者C++来编写,但是经常使用 Tcl 来写。
2:Tcl 是一种流行的 内置于应用的 语言。Tcl 提供了很多基础的命令,比如:if/then/else ,whileset
3:Expect 整合了Tcl的顶层(on the top of Tcl),并为交互式程序提供了额外的命令,比如:expectinteract

三:使用Expect脚本
【这次先简略介绍,以后有时间,补充更详细的解释】
Expect脚本最重要的三个命令是:

1. send        send strings to a process;
2. expect      wait for strings for a process;
3. spawn       starts a process;

在实际使用中,还有两个常用的命令:

4. interact     turn control frome script over to user
5. log_file     recode the log with script running

使用expect自动登录服务器的简单例子:

vim connect_222.exp
 #!/usr/bin/expect --
 spawn ssh root@10.10.169.222
 expect "password:"
 send "*****"
 interact

简单介绍一下:
#!/usr/bin/expect –
创建shell的时候,必须在首行指定要是使用的shell。其格式如上所写。

在通常的shell脚本里面,#用作注释行;注释行在shell里面是不被执行的。
然而,shell脚本文件的第一行是特例,#后接 告诉shell使用哪个shell来运行。此处使用expect,所以应该指定expect的位置。
如果不加 ‘– ‘话,运行脚本需要 expect connect_222.exp
加上‘–‘,只需要在chmod u+x connect_222.exp后,./connect_222.exp即可运行脚本。

spawn ssh root@10.10.169.222
spawn 用来开启一个进程,方便该语句后面的命令与其交互;

spawn 命令开启了ssh 进程 ,root@10.10.169.222是ssh的参数。
这就像你在命令行上 键入ssh root@10.10.169.222一样,ssh链接了10.10.169.222服务器;
这时,就可以使用expectsend了。

expect “password:”
上条命令打开了ssh进程,该条命令会跟据返回结果搜索特定的字符串,如果匹配,则执行下条语句;若超时未匹配,在会有其他处理结果,后续介绍。

此处的expect是Expect脚本内置的命令,不等同与Expect。
expect命令通常会等待一个进程的回应。expect可以等待一个特定的字符串,但更多的被用来等待 给定的模式 的任一字符串。比如:
expect "yes" {send "yes\r"} "no" {send "no\r"}
实例只匹配特定的字符串“password:“
Note: 该实例中expect的匹配,是只要进程的回应中出现“password:“则进行下一条命令。更多的情况后需补充。

send “*\r”**
将密码发送至进程,注意换行符’\r’.

send命令将一个字符串作为参数并且发送给进程。如果此时Expect正在与一个程序交互,这个字符串将会发送至程序,但是初始状态下,send将会输出至标准输出。
本例将Expect正在与ssh交互,则字符串将会发送至ssh。如果密码验证通过,则此时已经登录了服务器。脚本继续往下执行。

interact
将控制权由脚本交给用户。

上面几行代码已经登录到服务器上了,但此时控制权还在脚本那里,用户是不可以控制服务器的。如果此时结束脚本运行,ssh进程将会一并结束,此时又回到运行脚本的主机目录。
登录到服务器后,使用interact上,将控制权交至用户,用户即可控制服务器。
interact命令运行的时候,脚本停止从脚本里面读取命令,开始从键盘和进程里读取。当我们击键时,数据会立即传送至spawned 进程(本例中即ssh),同时,当进程有输出时,结果立即传送至标准输出,所以我们可以看到结果。
这种现象就好像 Expect并不存在而我们直接与服务器相连 一样
当spawned的进程(本例即ssh)终止运行时,interact命令将控制权交给脚本。如果interact在脚本末行,则脚本会自行结束。

关于interact将控制权从用户交给脚本,最开始一直没理解什么意思,写了几个测试程序,也并没有成功。后来发现是 interact 所在的spawn 出的进程结束之后,才会自动交给脚本。可以这么理解:

一个Expect脚本文件里面可以有好多 spawn命令,每一个spawn 执行时都会分离一个线程,interact在该spawn线程中作用。当该spawn线程执行结束,进入到另一个spawn线程的时候,控制权交给脚本。
在同一个spawn作用的范围内,interact无法将控制权交给用户。
以上是我的理解,有错误的欢迎指出,谢谢!

至此,一个简单的程序,就完成了。也简单的介绍了一下。更多的内容后续补上。等有时间吧。

03-08
### MathPix工具介绍 Mathpix Snipping Tool 是一款强大的数学公式识别工具,从最初的原型发展至今已经历了多次迭代和功能增强[^1]。该工具不仅能处理简单的数学表达式,还可以应对复杂的数学模型以及多行公式,并且支持手写公式的识别。 这款应用程序通过不断的科技创新与用户反馈改进,在学术研究和技术领域赢得了良好声誉,成为许多科研人员不可或缺的工作伙伴之一。除了基本的功能外,Mathpix 还提供了多种高级特性来满足不同用户的特定需求。 ### 使用方法 #### 安装与启动 为了使用 Mathpix Snipping Tool ,首先需要下载安装程序并按照提示完成设置过程。一旦成功安装后即可随时调用此应用来进行截图操作。 #### 截取屏幕上的公式图像 当遇到想要转换成 LaTeX 或 AsciiMath 的图片时,只需打开软件界面按下快捷键(默认为 `Ctrl+Alt+M`),此时鼠标指针会变为十字形状以便于选取目标区域;框选所需部分之后松开按键即刻上传至云端服务器等待进一步分析处理。 #### 获取LaTeX代码片段 经过短暂几秒钟的时间延迟过后,所截获的内容将以纯文本形式显示出来供复制粘贴到其他编辑器当中继续编写文档或是分享给他人查看交流之用。 ```python import pyperclip # 假设已获取到LaTeX字符串 stored_in_variable named latex_code pyperclip.copy(latex_code) print("LaTeX code has been copied to clipboard.") ``` 对于希望深入探索更多可能性的用户来说,可以考虑查阅官方提供的扩展插件——如用于解析Markdown文件内的公式标记语法的库 **mathpix-markdown-it** [^2] ——这将进一步提升工作效率和个人体验感。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值