作者:王连平
如有转载,请注明文章出处:http://blog.csdn.net/wlp001007/article/details/44657427
在linux下写shell脚本是非常有用的,当然,交互式shell脚本更是受到欢迎。expect的简单易用性,使它受到了大家的关注。今天在写expect脚本时遇到一个问题,下面是我对问题的理解:
先看下面“写法一”:
.........
expect "A" send "AA"
expect "B" send "BB"
....
刚开始,我以为程序会一个个检查,当出现expect的内容时,发送相应内容,当不出现时直接跳到下一个expect。
比如: 1.正常交互顺序
要求输入A内容时,send "AA"
要求输入B内容时,send "BB"
2.不确定的交互,有些交互在某种情况下出现,有些不出现,下面的例子将举例
不用输入A了,直接要求输入B内容时,send“BB”
对于第二种情况,按我以前的理解写法一是可以的,当期望的A交互没出现而交互B出现了,会直接跳过,但事实不是这,它会阻塞,一直等到A交互出现。因此,当有些应用的脚本交互的内容不确定时,写法一将不通用。下面这个例子是我遇到的实例,写一个shell脚本实现远程登录,
写法二:
spawn ssh -l username 192.168.1.1
expect "(yes/no)?" send "yes"
expect "password:" send "AAAA"
interact
这个脚本是不行的,大家知道,第一次ssh一个远程主机时会出现yes/no的交互,当以后ssh时不会出现,而是只出现第二个,按照上述分析的原因,此脚本第一次时使用时没有问题的,以后再使用时会出现阻塞,因为它一直在等待yes/no的交互,不会跳过去。因此,如果想写一个通用的脚本,就要在交互要求不确定时,跳过一些,最终的写法如下:
写法三:
spawn ssh -l username 192.168.1.1
expect{
"(yes/no)?" { send "yes"; exp_continue}
"password:" {send "AAAA"}
}
interact
这里可以理解为expect块,当出现yes/no交互式当然send相应内容,当没有出现,而是出现password时也不会阻塞,而是执行相应的send。理解时可以联想case语句块。
总结:在写一些交互确定的shell脚本时写法二是可以的,当交互不确定时我们可以选择写法三。这是我的一些小小的理解,有不对的地方望大家指教。