5

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

我找到了:timeoutforNet::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

4 回答 4

7

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

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

这将Timeout::Error在 60 秒后升高。查看文档

于 2013-02-06T13:04:25.900 回答
1

我认为在 net/ssh 中没有本地方法可以做到这一点。查看代码,该选项没有附加参数。

一种方法是在您调用的命令中处理超时 - 请参阅Unix & Linux SE 上的此答案

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

于 2013-02-06T13:16:26.533 回答
0

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

查看更多信息

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

于 2013-06-24T12:30:01.207 回答
0

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

于 2015-10-26T20:31:36.793 回答