一直都在想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的神奇的能力.但这个命令远远不止这么神奇.还有更令人瞠目结舌的功能,借鉴网上的例子时,竟然有人让它模拟出了人工智能.膜拜一下.