【问题标题】:expect script + how to ignore strings if not appears期望脚本+如果没有出现如何忽略字符串
【发布时间】:2012-01-11 11:22:15
【问题描述】:

我编写了以下期望脚本以自动 ssh 登录到远程 Linux 机器 并运行命令“cat /etc/APP_VERSION.txt 文件”

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

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

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

而不是继续第二个期望 - “密码:”?

如何解决这个问题? ,

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

那么我们必须到下一个expect "password:",但是怎么做呢?

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)?

【问题讨论】:

    标签: linux bash shell expect tk


    【解决方案1】:

    设置超时

    设置超时 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}
    }
    

    【讨论】:

    • 对不起,我不能使用它,因为有时 ssh 本身有时间连接——有时它是 5 或 10 秒谁知道呢? - 这对我来说不是很好的解决方案再次抱歉,它必须是其他解决方案!
    • 无论如何这不是一个好主意,因为我的应用程序需要快速运行,而不会受到期望脚本的任何延迟
    • 我添加了您在此处显示的 exp_continue 字符串,但它仍然卡住了。
    • 请注意,这两个字符串在同一个 expect{...} 中,而不是像原始脚本中的两个单独的期望。
    • -1 表示超时建议,但 +2 表示 exp_continue(您不希望出现在“密码”块中)
    【解决方案2】:

    当您生成 SSH 时,请执行以下操作:

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

    【讨论】:

      【解决方案3】:

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

      更多详情请见:http://linux.byexamples.com/archives/346/python-how-to-access-ssh-with-pexpect/

      【讨论】:

      • thx felix sun ,但我更喜欢先在期望中解决它,因为我在我的 shell 脚本中分配了期望脚本,所以我不想花时间将它翻译成 pylon 但你的想法很好对于新的刮鳕鱼
      猜你喜欢
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多