首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >expect +如何识别expect中断是因为超时?

expect +如何识别expect中断是因为超时?
EN

Stack Overflow用户
提问于 2012-03-11 13:34:56
回答 2查看 19.3K关注 0票数 4

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

有时,expect脚本无法对$IP_ADDRESS执行ssh (因为远程计算机不活动,等等)

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

有两种选择

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

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

  • 在ssh成功的情况下,预期将在0.5秒后中断,但如果ssh出现问题,则在10秒后

就会中断。

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

是否有可能识别超时过程?或者因为超时而验证预期结束?

注意我的Linux机器版本-红帽子5.1

Expect脚本

代码语言:javascript
复制
 [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`

示例,以防我们无法连接到远程主机

代码语言:javascript
复制
 [TestLinux]# expect -c  "$get_host_name_on_remote_machine"
 spawn ssh 10.17.180.23
 [TestLinux]# echo $?
 0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-11 20:23:54

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

代码语言:javascript
复制
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命令将导致脚本“成功”终止;如果您从脚本底部掉下,也会发生同样的情况)。

票数 18
EN

Stack Overflow用户

发布于 2012-03-11 14:13:31

没有真正回答原来的问题,但是当您只需要传递一个脚本来执行时,为什么要与SSH进行交互呢?毕竟是个贝壳。

我是说,快跑吧:

代码语言:javascript
复制
ssh user@host '/usr/bin/hostname'

ssh将远程生成hostname命令,并将其stdout连接到生成ssh的进程的stdout。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9655384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档