2009-10-28 4 views
3

Ruby 또는 내가 한 일에 문제가있는 것 같은 매우 비정상적인 행동으로 보이는 문제가 있습니까? 제발 도와주세요 -이 문제를 해결하기 전까지 프로젝트가 지연되었습니다.간단한 Ruby SFTP 예제 구문 오류

맥 OS 레오파드에서 실행되는 코드 감안할 때 :

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); 

은 무엇 다음과 같은 오류가 발생합니다?

$ 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 

은 참고로 나는 보석이로드 올바르게 있도록 RUBYOPT을 설정 한 및 최신에 따라 내 보석은 : 그것은 당신을 말하고있다

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

답변

3

당신이 시도하는 어떤 객체 종업원에게 전화 해! method on은 nil입니다. 자, 그 코드는 당신의 예제가 아니므로, 그 이유는 말할 수 없지만, 나는 그 언어의 버그라고 크게 의심합니다.

이 메서드 호출에서 발생하고 있습니다. 따라서이 코드를 게시 할 수 있습니까?

result = copy_from_uri(remote_uri, local_file); 

URI # parse는 예외가 발생하지 않도록 nil을 반환해서는 안되며 가능한 경우 해당 메소드 본문을 보는 것이 좋습니다.

+0

예. url.user는 nil이었습니다. 왜냐하면 "sftp :: //[email protected]"형식을 사용하는 것을 잊었 기 때문입니다. RUBYOPT 문제, 즉 내부 문제에 대한 주장을 정리하는 데는 시간이 걸렸습니다. – Justicle

+0

그래서 ... 대답은 그때 였나요? :) –

+0

확실히 내 문제는 내 변수를 새로운 형식으로 업데이트하지 않은 경우 nil 인 값을 전달하여 발생합니다. @ip은 @ host.name이어야합니다. –

1

방금이 문제가 발생했지만 다른 이유로 인해 발생했습니다. 내 파일 호스트가 RSA 키를 변경 했으므로 ~/.ssh/known_hosts의 키가 잘못되었습니다. 이는 표시된 것과 같은 오류가 발생하여 SSH에서 필터링되었습니다. 잘못된 키를 삭제하면 문제가 해결되었습니다.

2

이 오류로 인해 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 

오류가 #START 방법에서 발생

, 그것은 종료 세션에 시도 ...하지만 세션 자체가 전무 경우, 그것은 ' NoMethodError을 올리십시오. rescue Exception 행은 모든 예외를 삼키려고 시도하지만 실제로는 루트 수준 예외가 아닌 Net::SFTP::Exception을 구하고 있습니다. 이것은 최근에 수정되었습니다 ( this 커밋 참조).

net-sftp 2.0.4로 업그레이드하면 더 이상이 애매한 오류가 발생하지 않습니다. 여전히 오류가 발생하지만 복구 블록에서 발생한 새로운 오류로 인해 원래 오류가 삭제되지 않으면 더 많은 도움이됩니다.