Linux 期望+;如何确定预期中断是否因为超时?

Linux 期望+;如何确定预期中断是否因为超时?,linux,shell,tcl,ksh,expect,Linux,Shell,Tcl,Ksh,Expect,以下简单expect脚本的目标是获取远程计算机上的主机名 有时,脚本无法对$IP_地址执行ssh(因为远程计算机未处于活动状态,等等) 因此,在这种情况下,expect脚本将在10秒后中断(超时10),这是可以的,但是 有两种选择 期望脚本成功执行ssh,并在远程计算机上执行命令hostname 预期脚本中断,因为超时时间为10秒 在这两种情况下,expect都将退出 如果ssh成功,expect将在0.5-1秒后中断,但如果ssh错误,则它将在10秒后中断 但我不知道expect脚本是否成

以下简单expect脚本的目标是获取远程计算机上的主机名

有时,脚本无法对$IP_地址执行ssh(因为远程计算机未处于活动状态,等等)

因此,在这种情况下,expect脚本将在10秒后中断(超时10),这是可以的,但是

有两种选择

  • 期望脚本成功执行ssh,并在远程计算机上执行命令hostname
  • 预期脚本中断,因为超时时间为10秒
  • 在这两种情况下,expect都将退出

    • 如果ssh成功,expect将在0.5-1秒后中断,但如果ssh错误,则它将在10秒后中断
    但我不知道expect脚本是否成功执行ssh

    是否可以识别超时进程?或者验证expect是否因为超时而结束

    备注我的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
    

    不是真的回答了最初的问题,但是当您可以传递一个脚本来执行SSH时,为什么您要以交互方式与SSH交谈呢?这毕竟是一个贝壳

    我是说,只要跑:

    ssh user@host '/usr/bin/hostname'
    
    ssh将远程生成
    hostname
    命令,并将其stdout连接到生成
    ssh
    的进程的stdout


    回到要点-看起来像是一个关于如何将操作绑定到超时条件的示例。

    要在超时时执行合理的操作,您需要告诉expect应该发生什么:

    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
    

    注意上面我遇到错误时如何使用退出1。您的shell将能够通过
    $?
    等(没有
    1
    参数,
    exit
    命令将导致脚本“成功”终止;如果您从脚本底部掉下来,也会发生同样的情况。)

    @Eytan,我没有提到提供密码:使用Expect for this是明智的。我只是被以下与ssh的交互对话弄糊涂了。我需要输入密码(我无法设置ssh密钥),每台机器都有不同的密码,所以这个expect脚本的目标是通过ssh连接到每台linux机器并输入相关的密码,任何方式都是thx,但我需要找到解决方案-如何从expect验证超时script@Eytan,我为您提供了一个处理超时条件的工作示例的链接--有什么问题吗?不确定如何根据链接示例设置我的期望值:(@Eytan,这不是一个关于如何期望某个可能超时的对象的完整示例吗?