码迷,mamicode.com
首页 > 其他好文 > 详细

expect小结

时间:2015-02-05 07:03:57      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:shell   expect   

一直都在想linux下有没有像windows下的QTP那么神奇的工具.直到接触到expect命令以后.

这是一个神奇的工具,它可以让你轻易的实现密码的自动输入.也可以轻易的对需要持续运行的程序完成自动化.

对于expect,我的理解还属于刚刚入门.

expect是一个命令集.一般linux并不自带这个命令,需要进行安装,ubuntu的安装方式是sudo apt-get install expect.默认这个小东西已经在软件源中了.

安装好以后就可以安心使用啦.expect内部包括的命令常用的有:

spawn command   指定要监控的command

set timeout   设置超时,以秒为单位.

set val 声明变量

expect   指定需要等待的字符串.

send    发送字符串.

interact   将控制权交还给程序本身.

下面看一个简单的例子sudo.sh,实现的是sudo的自动填入密码:

#!/usr/bin/expect    #此处需要使用expect的路径

set password w1122    #声明变量password

spawn sudo -s          #监控sudo -s
expect "password"      #检测屏幕上是否出现了password,如果有,执行后面的语句
send "$password\r"      #不要忘记\r,当然\n也可以
set timeout 10          #设置超时10秒.仅仅用一下这个命令而已.再此没有特别的含义
interact                 #将控制权交给程序,否则不能运行,会卡死.因为如果没有这个命令,当前程序还处于expect的控制,而expect已经没有了监控内容

看一下结果是什么:

alai@alai:~/testspace/shell$ ./sudo.sh 
spawn sudo -s
[sudo] password for alai: 
root@alai:~/testspace/shell# ls
2_3  expect.sh  interactive.sh  sudo.sh  test1  test2
可以看到程序执行成功.


如果我们首先给出一个错误的密码,结果如何.其实就是考验我们可能遇到的问题的场景.只要把场景考虑的尽可能清楚就可以了.

同样是sudo.sh,做一下简单的修改,将密码错误的场景考虑进去.代码如下:

#!/usr/bin/expect

set password w1221

spawn sudo -s 
expect  {        #expect的另外一种形式,用这种形式可以将多个expect子句合并成一个
"password"  { send "$password\r" 
                exp_continue}       #可能考虑的不全面,仅仅是为了展示exp_continue的作用.类似于循环.
}

set timeout 10
interact
执行结果如下:

alai@alai:~/testspace/shell$ ./sudo.sh 
spawn sudo -s
[sudo] password for alai: 
Sorry, try again.
[sudo] password for alai: 
Sorry, try again.
[sudo] password for alai: 
Sorry, try again.
sudo: 3 incorrect password attempts

如上,简单的领略了expect的神奇的能力.但这个命令远远不止这么神奇.还有更令人瞠目结舌的功能,借鉴网上的例子时,竟然有人让它模拟出了人工智能.膜拜一下.




expect小结

标签:shell   expect   

原文地址:http://blog.csdn.net/cp3alai/article/details/43521999

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!