2011-04-09 71 views
5

我在bash中写了一些expect命令。我如何知道我已经完成了交互模式?

脚本:

#!/bin/bash 
set timeout -1 

expect -c " 

spawn telnet $IP $PORT1 
sleep 1 
send \"\r\" 
send \"\r\" 
expect Prompt1> 
interact timeout 20 { 
sleep 1 
} 

expect { 
Prompt2> {send \"dir\r\" } 
}  

" 

我对剧本的意图是,先让它远程登录到一台机器,当它看到PROMPT1,让它把控制权交给我,我将执行一个命令来加载特定的图像。然后等到Prompt2出现(表示图像已被加载)。然后让它执行更多的命令集。

运行脚本后,我可以进入交互模式,加载我的图像。问题是在远程机器上退出交互模式,并对其进行控制。

这是我得到的错误:

expect: spawn id exp4 not open 
    while executing 
"expect -nobrace Prompt2 {send "dir\r" }" 
    invoked from within 
"expect {  
Prompt2 {send "dir\r" } 
}" 

我怎样才能做到这一点?

+0

你打算如何退出交互模式?这是通过期待'prompt2'? – 2011-04-09 02:41:13

+0

我认为20的超时值会让我失望。我错了吗?一旦我离开,我希望期待控制回来,期待Prompt2。然后它可以执行另一组命令。 – Pkp 2011-04-09 04:32:32

回答

6

你的问题是双重的...

  1. 你应该有一个明确的return互动,并给它一些方法来知道你已经释放控制......在这种情况下,我用三加上标志并回车。

  2. 在您返回控件后,脚本需要再次获取提示,这意味着您在返回控件后要做的第一件事是发送另一个\r。我编辑了什么,我认为你正在试图做...

示例如下...

#!/bin/bash 
set timeout -1 

expect -c " 

spawn telnet $IP $PORT1 
sleep 1 
send \"\r\" 
send \"\r\" 
expect Prompt1> 
interact +++ return 

send \"\r\" 
expect { 
Prompt2> {send \"dir\r\" } 
} 
" 
0

感谢迈克这一建议。 我调整了一下,并适应了我的问题。

更改代码:

expect Prompt1> 
interact timeout 10 return 
expect { 
timeout {exp_continue} 
Prompt2 {send \"dir\r\" } 
} 

超时10值是不相关的,我们initally设置set timeout -1。因此,我可以在Prompt1上执行任何我想要的命令,并且一旦键盘闲置了10秒钟,脚本便获得控制权。

即使在这之后我还面临一个问题,在Prompt1之后,我想执行命令来加载特定的图像。加载图像大约需要2分钟。即使set timeout -1该脚本正在等待Prompt2。这不是远程登录超时,即使我验证。但是解决方案是在expect语句中超时的情况下添加exp_continue。

要使你的set timeout -1生效,它应该放在spawn telnet命令之前。

相关问题