Question

In my application I want to terminate the exec! command of my SSH connection after a specified amount of time.

I found the :timeout for the Net::SSH.start command but following the documentation this is only for the initial connection. Is there something equivalent for the exec command?

My first guess would be not using exec! as this will wait until the command is finished but using exec and surround the call with a loop that checks the execution status with every iteration and fails after the given amount of time.

Something like this, if I understood the documentation correctly:

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 }

However this seems dirty to me. I expect something like server.exec("some command" { :timeout=>60}). Maybe there is some built in function for achieving this functionality?

Was it helpful?

Solution

I am not sure if this would actually work in a SSH context but Ruby itself has a timeout method:

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

This would raise Timeout::Error after 60 seconds. Check out the docs.

OTHER TIPS

I don't think there's a native way to do it in net/ssh. See the code, there's no additional parameter for that option.

One way would be to handle timeouts in the command you call - see this answer on Unix & Linux SE.

I think your way is better, as you don't introduce external dependencies in the systems you connect to.

Another solution is to set ConnectTimeout option in OpenSSH configuration files (~/.ssh/config, /etc/ssh_config, ...)

Check more info in

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

what I did is have a thread that's doing the event handling. Then I loop for a defined number of seconds until channel closed.If after these seconds pass, the channel is still open, then close it and continue execution.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top