在我的应用程序中,我希望在指定的时间后终止SSH连接的exec!命令。
我找到了Net::SSH.start命令的:timeout,但按照文档说明,这只适用于初始连接。是否有与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})这样的东西。也许有一些内置的函数可以实现这个功能?
发布于 2013-02-06 21:04:26
我不确定这是否真的可以在SSH上下文中工作,但是Ruby本身有一个超时方法:
server = NET::SSH.start ...
timeout 60 do
server.exec! "some command"
end这将在60秒后引发Timeout::Error。查看the docs。
发布于 2013-02-06 21:16:27
我不认为在net/ssh中有一种原生的方法来做这件事。参见the code,该选项没有额外的参数。
一种方法是在您调用的命令中处理超时-参见this answer on Unix & Linux SE。
我认为你的方法更好,因为你不会在你连接的系统中引入外部依赖。
发布于 2013-06-24 20:30:01
另一种解决方案是在OpenSSH配置文件(~/.ssh/config,/etc/ssh,...)中设置ConnectTimeout选项
查看更多信息
https://github.com/net-ssh/net-ssh/blob/master/lib/net/ssh/config.rb
https://stackoverflow.com/questions/14729173
复制相似问题