Net-ssh超时执行?

时间:2013-02-06 12:31:37

标签: ruby-on-rails ruby ssh net-ssh

在我的应用程序中,我希望在指定的时间后终止SSH连接的exec!命令。

我找到了:timeout命令的Net::SSH.start,但是根据文档,这仅用于初始连接。是否有exec命令的等价物?

我的第一个猜测是不会使用exec!,因为这将等到命令完成但使用exec并用循环来调用执行状态并在每次迭代后失败给定的时间。

如果我理解文档正确的话,那就是这样:

server = NET::SSH.start(...)

server.exec("some command")

start_time = Time.now
terminate_calculation = false

trap("TIME") { terminate_calculation = ((Time.now - start_time) > 60) }
ssh.loop(0.1) { not terminate_calculation }

然而这对我来说似乎很脏。我希望像server.exec("some command" { :timeout=>60})这样的东西。也许有一些内置功能来实现这个功能?

4 个答案:

答案 0 :(得分:7)

我不确定这是否真的可以在SSH上下文中工作,但Ruby本身有一个超时方法:

server = NET::SSH.start ...
timeout 60 do
  server.exec! "some command"
end

这会在60秒后提升Timeout::Error。查看the docs

答案 1 :(得分:1)

我认为在net / ssh中没有本地方法可以做到这一点。请参阅the code,该选项没有其他参数。

一种方法是在您调用的命令中处理超时 - 请参阅this answer on Unix & Linux SE

我认为您的方式更好,因为您不会在连接的系统中引入外部依赖项。

答案 2 :(得分:0)

另一个解决方案是在OpenSSH配置文件中设置ConnectTimeout选项(〜/ .ssh / config,/ etc / ssh_config,...)

查看

中的更多信息

https://github.com/net-ssh/net-ssh/blob/master/lib/net/ssh/config.rb

答案 3 :(得分:0)

我所做的是有一个执行事件处理的线程。然后循环定义的秒数,直到通道关闭。如果经过这些秒后,通道仍然打开,然后关闭它并继续执行。