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

一:事出有因
最近在跟踪“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无法将控制权交给用户。
以上是我的理解,有错误的欢迎指出,谢谢!

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值