用expect写交互式shell脚本之expect 执行顺序

作者:王连平

如有转载,请注明文章出处: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脚本时写法二是可以的,当交互不确定时我们可以选择写法三。这是我的一些小小的理解,有不对的地方望大家指教。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值