2015-12-21 129 views
0

我希望期望脚本启动ssh会话,如果询问您是否确定,会自动回答“yes”,然后在密码提示处暂时将交互传递给用户,以便他们输入密码,然后在检测到用户点击回车后将​​其取回。噢,如果有3秒的超时,并且在fileServer上的ssh服务器尚未启动的情况下连续重试。期望脚本错误,期望超时,exp_continue或多个期望的可能性

1: expect "root*archiso*# " 
2: puts "\n<<< Make sure sshd is started on fileServer >>>\n" 
3: set readyForPassword 0 
4: while { $readyForPassword == 0 } { 
5: send "scp [email protected]:/public/* /publicCopy\n" 
6: expect -timeout 3 { 
7:  "Are you sure you want to continue connecting (yes/no)? " { 
8:   send "yes\n" 
9:   exp_continue 
10:  } "password: " { 
11:   set readyForPassword 1 
12:  } 
13: } 
14: } 
15: interact "\n" return 
16: send "\n" 

我认为代码将要做的事如下。第6行将在“您确定要继续连接(是/否)?”还是“密码:”中寻找匹配项。如果在3秒后超时,while循环将重新启动,并且scp将再次尝试。如果它匹配前一行,它将发送“是\ n”,并为“密码:”再寻找3秒钟。如果它第一次或者在发送“是”之后匹配“密码:”,它将退出while循环。

第15行会让用户输入密码,当按下Enter时,控件将返回到期望脚本。用户的输入没有发送,所以发送一个输入。

我的理解很明显。 sshd在fileServer上启动,因此它立即进入密码提示。如果我什么都不做,在3秒钟内,它会为我输入。然后它每秒输入一次,直到第三次失败,当scp中止。然后,它再次尝试scp,永远重复这个过程。因此,显然,readyForPassword永远不会设置为1.

这种类型的while/readyForPassword循环在我的代码中的其他位置工作,所以它与timeout,exp_continue或处理期望的多种可能性有关 - 这些是这部分代码中的新东西给我。

如果exp_continue没有重新评估包括“password:”在内的新文本,我想知道是否在发送“是\ n”之后,当触发“password:”时发送。但是,如果是这样的话,我不知道如何解决它。

另外,我认为这不仅仅是为我输入密码,我非常肯定它将发送scp行作为密码。

+0

我没有看到你的'spawn'你的代码中的任何进程。你需要产生一个过程,以期望控制它。 –

回答

1

您应该使用回车符\r来匹配用户的“输入”键输入,而不是换行\n字符。改变它,

interact "\r" return 
send \r 
expect "root*archiso*# " 

此外,建议使用\r始终,而不是\n

+0

我对EOL的预期有点困惑。谢谢,我会改变这些。我不认为这涉及我遇到的问题,但是,应该如何?我将在大约10个小时内再次进入机器,但我不认为执行会进入互动线路。 – user1902689

+0

如果没有,则添加'exp_internal 1'并共享调试日志。 – Dinesh