【问题标题】:expect + how to identify if expect break because time out?期望+如何确定是否期望因超时而中断?
【发布时间】:2012-03-28 03:54:26
【问题描述】:

以下简单的期望脚本的目标是获取远程机器上的主机名名称

有时期望脚本无法执行 ssh 到 $IP_ADDRESS(因为远程机器不活动等)

所以在这种情况下,expect 脚本将在 10 秒后中断(超时 10),这没关系,但是......

有两种选择

  1. 期望脚本成功执行 ssh,并在远程机器上执行命令主机名
  2. 预计脚本会中断,因为超时为 10 秒

在这两种情况下,expect 都会退出

  • 在 ssh 成功的情况下,预期会在 0.5-1 秒后中断,但在 ssh 错误的情况下,它将在 10 秒后中断

但不知道expect脚本是否成功执行ssh?

是否可以识别超时进程?或验证期望因超时而结束?

备注我的Linux机器版本-red-hat 5.1

期待脚本

 [TestLinux]# get_host_name_on_remote_machine=`cat << EOF
  > set timeout 10
  > spawn  ssh   $IP_ADDRESS
  >            expect {
  >                      ")?"   { send "yes\r"  ; exp_continue  }
  > 
  >                      word:  {send $PASS\r}
  >                   }
  > expect >  {send "hostname\r"}
  > expect >    {send exit\r}
  > expect eof
  > EOF`

我们没有连接到远程主机的示例

 [TestLinux]# expect -c  "$get_host_name_on_remote_machine"
 spawn ssh 10.17.180.23
 [TestLinux]# echo $?
 0

【问题讨论】:

    标签: linux shell tcl ksh expect


    【解决方案1】:

    要在超时时做一些明智的事情,你需要告诉期望应该发生什么:

    set timeout 10
    expect {
        ")?"     { send "yes\r"  ; exp_continue  }
        "word:"  { send "$PASS\r"                }
        timeout  { puts "timed out during login"; exit 1 }
    }
    set timeout -1   ; # Infinite...
    expect ">"   { send "hostname\r"             }
    expect ">"   { send "exit\r"                 }
    expect eof
    exit
    

    请注意上面我遇到错误时如何使用exit 1。您的 shell 将能够通过 $? 等来获取它(如果没有 1 参数,exit 命令将导致脚本“成功”终止;如果您从脚本。)

    【讨论】:

      【解决方案2】:

      并没有真正回答最初的问题,但是当你可以传递一个脚本来执行时,你为什么要以交互方式与 SSH 对话呢?毕竟是壳。

      我的意思是,只要运行:

      ssh user@host '/usr/bin/hostname'
      

      ssh 将远程生成hostname 命令并将其标准输出连接到生成ssh 的进程的标准输出。

      回到正题——this 看起来像是一个关于如何将操作绑定到超时条件的示例。

      【讨论】:

      • @Eytan,我没有谈论提供密码:Expect 的使用是明智的。我只是对以下与 ssh 的交互对话感到困惑。
      • 我需要输入密码(我不能设置 ssh 密钥),每台机器都有不同的密码,所以这个期望脚本的目标是 ssh 到每台 linux 机器并输入相关密码,任何方式 thx ,但我需要找到解决方案 - 如何从期望脚本验证超时
      • @Eytan,我为您提供了一个处理超时条件的工作示例的链接——有什么问题?
      • 不确定如何根据链接示例设置我的期望,-:(
      • @Eytan,this 不是一个完整的示例,说明如何预期可能会超时的事情?
      猜你喜欢
      • 2020-06-26
      • 2017-03-26
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      相关资源
      最近更新 更多