4

Net::SSHを使用して別のサーバーに接続しています。正常に動作しますが、接続できない状況に対処できるようにしたいです。メソッドのドキュメントには、例外については何も言及されておらず、私が見る限り、例外は発生しません。次の例では、存在せず、キーがないホストとユーザーを渡しても、例外は発生しません。

失敗したかどうかを確認できる唯一の方法は、@session を確認することです。これは nil になりますが、失敗した理由については何もわかりません。

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 に答える