4

我正在使用Net::SSH连接到另一台服务器。它工作正常,但我希望能够处理无法连接的情况。该方法的文档没有提到异常,据我所知,它没有引发任何异常。在以下示例中,传递不存在且没有键的主机和用户不会引发异常。

我可以检查它是否失败的唯一方法是查看@session,它将为零,但这并不能告诉我它失败的原因。

begin
  @session = Net::SSH.start('no-host', 'no-user', keys: [])
rescue SocketError => e
  connection_failed = true
  logger.error "SOCKET ERROR: "+e.message
rescue Net::SSH::AuthenticationFailed
  connection_failed = true
  logger.error "AUTH ERROR: "+e.message
rescue Exception => e
  logger.error "EXCEPTION: "+e.message
end

[更新] 在 irb 中运行以下命令会引发 SocketError:

> require 'net/ssh'
> Net::SSH.start('no-host', 'no-user', keys: [])
= SocketError: getaddrinfo: nodename nor servname provided, or not known

为什么这不会在我的应用程序中引发异常?

4

2 回答 2

3

我正在处理试图挽救一些异常,这对我有用:

def mydef
  begin
    Net::SSH.start("host", "user", :password => "password", :timeout => 10) do |ssh|
      #stuff
    end 
  rescue Timeout::Error
    @error = "  Timed out"
  rescue Errno::EHOSTUNREACH
    @error = "  Host unreachable"
  rescue Errno::ECONNREFUSED
    @error = "  Connection refused"
  rescue Net::SSH::AuthenticationFailed
    @error = "  Authentication failure"
  end
end

然后可能@error在视图中使用

于 2013-08-16T20:51:56.640 回答
2

start()方法建立连接并将其提供给内部块。当您不传递一个块时,就像在您的示例中一样,它甚至可能无法连接。您应该尝试做一个简单的循环或其他一些活动:

begin
  Net::SSH.start('no-host', 'no-user', keys: []) do |ssh|
    ssh.loop { true }
  end
rescue SocketError => e
  connection_failed = true
  logger.error "SOCKET ERROR: "+e.message
rescue Net::SSH::AuthenticationFailed
  connection_failed = true
  logger.error "AUTH ERROR: "+e.message
rescue Exception => e
  logger.error "EXCEPTION: "+e.message
end

此外,如果您担心错误处理和失败,您应该通过:timeout参数指定连接超时。

于 2013-01-28T17:12:07.467 回答