【问题标题】:Net/SSH.start doesn't raise an exception if it fails如果失败,Net/SSH.start 不会引发异常
【发布时间】:2013-01-28 16:17:24
【问题描述】:

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

我可以检查它是否失败的唯一方法是查看@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

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

【问题讨论】:

  • 您使用的是什么版本的 ruby​​?只是在 irb ruby​​-1.9.3p327 中尝试 SSH.start 的第二行,我得到异常“SocketError:initialize:name or service not known”。在 Rails 控制台中也能正常工作。
  • @agmcleod 我在 1.9.3-p194 上,是的,你是对的。在 irb 我得到一个例外,但在应用程序中我没有。
  • 我也有同样的问题。如果我使用了不正确的密码,则会引发异常,但当我的凭据正确时,它会创建一个立即关闭的连接,但我无法找出为什么它会立即关闭。

标签: ruby-on-rails ruby exception ssh net-ssh


【解决方案1】:

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

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

【讨论】:

    【解决方案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 参数指定连接超时。

    【讨论】:

    • 有两种使用 Net::SSH.start 的方法,有或没有或阻止。两者都受支持,正如我在问题中提到的那样,它对我有用。不过,您对超时的看法是正确的,那将是个好主意。
    猜你喜欢
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2023-03-07
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多