Question

J'ai un problème qui ressemble à un comportement très floconneux. Est-ce un problème avec Ruby ou quelque chose que j'ai déjà fait? Aidez-moi s'il vous plaît - mon projet est bloqué jusqu'à ce que je résolve ce problème.

Ce code fonctionnant sous Mac OS Leopard:

require 'uri'
require 'net/ssh'
require 'net/sftp'
include Net

def copy_from_uri( uri, local_path )
    # SFTP copy
    SFTP.start( uri.host, uri.user, :password => 'password' ) do |sftp|
        puts "downloading from #{uri.host}, path #{uri.path}\n"
        sftp.download( uri.path, local_path )
    end
end

remote_uri = URI.parse( "sftp://example.com/test.mp4" )
local_file = "/tmp/remote_copy_test.mp4"
result = copy_from_uri( remote_uri, local_file );

Qu'est-ce qui provoquerait l'erreur suivante?

$ ruby sftp_fail.rb 
/Library/Ruby/Site/1.8/net/sftp.rb:43:in `start': undefined method `shutdown!' 
for nil:NilClass (NoMethodError)
    from sftp_fail.rb:8:in `copy_from_uri'
    from sftp_fail.rb:18

Pour info, j'ai correctement paramétré RUBYOPT pour que les pierres précieuses soient chargées et les dernières mises à jour, en fonction de:

$gem list --local
net-sftp (2.0.2, 1.1.0)
net-ssh (2.0.15, 1.1.2)
Était-ce utile?

La solution

Il vous dit qu’un objet que vous essayez d’appeler à l’arrêt! la méthode est nulle. Ce code ne figure pas dans votre exemple, il est donc difficile de dire pourquoi, mais je doute fort que ce soit un bogue dans la langue.

Cela se passe dans cet appel de méthode, alors vous pouvez peut-être poster ce code?

result = copy_from_uri( remote_uri, local_file );

URI # parse ne devrait jamais renvoyer nil (une exception serait jetée), il serait donc utile de voir le corps de cette méthode si possible.

Autres conseils

Cette erreur est en fait due à un bogue dans net-sftp v2.0.2 :

def self.start(host, user, options={}, &block)
  # ...
rescue Object => anything
  begin
    session.shutdown!
  rescue Exception
    # swallow exceptions that occur while trying to shutdown
  end

  raise anything
end

Lorsqu'une erreur survient dans la méthode #start, elle tente de fermer la session ... mais si la session elle-même est nulle, elle déclenche NoMethodError . La ligne rescue Exception tente d'avaler toutes les exceptions, mais elle est en train de sauver Net :: SFTP :: Exception plutôt que l'exception au niveau racine. Ce problème a été récemment résolu (voir this commit).

Passez à net-sftp 2.0.4 et vous n’obtiendrez plus cette erreur obscure. Vous obtiendrez toujours une erreur, mais cela devrait être plus utile maintenant que l'erreur d'origine n'est pas supprimée par une nouvelle erreur survenant dans un bloc de secours.

Je viens de le rencontrer, mais cela a été causé par une autre raison. Mon hôte de fichier avait changé de clé RSA. La clé ~ / .ssh / known_hosts était donc incorrecte. Cette erreur entraînait la même erreur que celle affichée, filtrée à partir de SSH. La suppression de la clé non valide a résolu le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top