期望脚本+如果没有出现,如何忽略字符串

时间:2012-01-11 11:22:16

标签: linux bash shell expect tk

我编写了以下expect脚本,以便自动将ssh登录到远程Linux机器 并运行命令“cat /etc/APP_VERSION.txt file”

有时我没有从ssh命令询问 -

    "Are you sure you want to continue connecting (yes/no)?"

所以在这种情况下,第一个期望仍然等待字符串“(是/否)?” - :(

并没有继续第二个期望 - “密码:”?

如何解决这个问题? ,

我的意思是“如果您确定要继续连接(是/否)?” 是不是从ssh出现

然后我们必须转到下一个期望“密码:”,但是如何做到这一点?

remark1 - 如果问题“您确定要继续连接(是/否)?” ,出现然后期望脚本工作正常没有任何问题

remark2 - 我不能使用超时正值(作为超时10)因为ssh本身有延迟

。 。 。

我的期望脚本:(这个期望是我的ksh脚本的一部分)

  .
  .
  .

  APP_MACHINE=172.12.6.190  


  set timeout -1
  spawn  ssh $APP_MACHINE  
       expect {
                "(Are you sure you want to continue connecting yes/no)?" 
                              { send "yes\r" }
              }
       expect password:        {send PASS123\r}
     expect >  {send "cat /etc/APP_VERSION.txt\r"}
   expect >    {send exit\r}
  expect eof

 .
 .
 .

。 。 。 。

我的linux机器上的ssh示例

  ssh APP_MACHINE
  The authenticity of host 'APP_MACHINE (172.12.6.190 )' can't be established.
  RSA key fingerprint is 1e:8a:3d:b3:e2:8c:f6:d6:1b:16:65:64:23:95:19:7b.
  Are you sure you want to continue connecting (yes/no)?

3 个答案:

答案 0 :(得分:8)

设置超时

  

设置超时10

将等待预期的行10秒,然后如果未在指定的超时时间内收到,则继续执行脚本中的下一行。

参考 http://linuxshellaccount.blogspot.com/2008/01/taking-look-at-expect-on-linux-and-unix.html

更新: 如果超时不是可接受的解决方案,您可以尝试使用备用响应列表来推动脚本向前发展。

expect {
 "(Are you sure you want to continue connecting yes/no)?" { send "yes\r"; exp_continue }
 password:                                                {send PASS123\r; exp_continue}
}

答案 1 :(得分:7)

当你产生SSH时,请执行以下操作:

spawn ssh -o "StrictHostKeyChecking no" "$user\@ip"

答案 2 :(得分:0)

您可能希望使用Python的pexpect模块来执行此操作,因为它可以为您提供类似 case 的内容:)

有关详细信息,请参阅:http://linux.byexamples.com/archives/346/python-how-to-access-ssh-with-pexpect/