2009-10-28 5 views
3

J'ai un problème qui me semble être un comportement très floconneux, est-ce un problème avec Ruby ou quelque chose que j'ai fait? Aidez-moi, mon projet est bloqué jusqu'à ce que je le résolve.Exemple d'erreur de syntaxe SFTP Simple Ruby

Compte tenu de ce code en cours d'exécution sur 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); 

Quelle serait la cause de 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 votre information, j'ai correctement réglé RUBYOPT si les pierres précieuses sont chargées et mes pierres précieuses sont à jour, selon:

$gem list --local 
net-sftp (2.0.2, 1.1.0) 
net-ssh (2.0.15, 1.1.2) 

Répondre

3

Il vous dit que quelque objet que vous essayez de appelez la fermeture! la méthode est nulle. Maintenant, ce code n'est pas dans votre exemple, il est donc difficile de dire pourquoi, mais je doute fortement que ce soit un bogue dans la langue.

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

result = copy_from_uri(remote_uri, local_file); 

URI # parse ne doit jamais revenir nul (il jetterait une exception), il serait utile de voir que le corps de la méthode si possible.

+0

Oui. uri.user était nul, parce que j'ai oublié d'utiliser le format "sftp :: //[email protected]". Il m'a fallu un certain temps pour régler la question RUBYOPT, d'où l'allégation d'un problème interne. – Justicle

+0

Alors ... c'était la réponse alors, non? :) –

+0

Certainement un problème causé par le passage d'une valeur qui était nulle, dans mon cas, je n'avais pas mis à jour mes variables à mon nouveau format @ip aurait dû être @ host.name –

1

Je viens de le rencontrer, mais il était dû à une autre raison. Mon hôte de fichier avait changé leur clé RSA, donc la clé dans ~/.ssh/known_hosts était incorrecte --- ceci a abouti à la même erreur que celle montrée, filtrée depuis SSH. La suppression de la clé non valide a résolu le problème.

2

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 se produit dans la méthode #start, il tente d'arrêter la session ... mais si la session elle-même est nul, ce ll augmentera NoMethodError. La ligne rescue Exception tente d'avaler toutes les exceptions, mais elle récupère en réalité Net::SFTP::Exception plutôt que l'exception au niveau de la racine. Cela a été récemment corrigé (voir this commit). Mettez à niveau vers 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 ignorée par une nouvelle erreur se produisant dans un bloc de secours.