一直都在想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
原文地址:http://blog.csdn.net/cp3alai/article/details/43521999