在我的应用程序中,我希望在指定的时间后终止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})
这样的东西。也许有一些内置功能来实现这个功能?
答案 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)
我所做的是有一个执行事件处理的线程。然后循环定义的秒数,直到通道关闭。如果经过这些秒后,通道仍然打开,然后关闭它并继续执行。