문제

나는 매우 벗겨진 행동처럼 보이는 문제가 있습니다. 이것은 루비 나 내가 한 일에 문제가 있습니까? 도와주세요 - 제 프로젝트가 해결 될 때까지 정체됩니다.

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

다음 오류는 무엇입니까?

$ 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

fyi 나는 rubyopt를 올바르게 설정하여 보석이로드되고 내 보석이 최신입니다.

$gem list --local
net-sftp (2.0.2, 1.1.0)
net-ssh (2.0.15, 1.1.2)
도움이 되었습니까?

해결책

셧다운을 호출하려는 일부 대상이 당신에게 말하고 있습니다! 메소드 켜기는 nil입니다. 이제 그 코드는 당신의 예에 있지 않기 때문에 왜 그것이 될지 말하기는 어렵지만, 그것이 언어의 버그라는 것을 의심합니다.

이 메소드 호출에서 일어나고 있으므로 해당 코드를 게시 할 수 있습니까?

result = copy_from_uri( remote_uri, local_file );

URI#parse는 절대로 NIL을 반환해서는 안됩니다 (예외를 던질 것입니다). 따라서 가능한 경우 해당 방법 본문을 보는 데 도움이됩니다.

다른 팁

이 오류는 실제로 버그로 인한 것입니다 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 메소드에서 오류가 발생하면 세션을 종료하려고 시도하지만 세션 자체가 NIL이면 증가합니다. NoMethodError. 그만큼 rescue Exception 라인은 모든 예외를 삼키려고 시도하지만 실제로 구출 중입니다. Net::SFTP::Exception 루트 수준의 예외보다는. 이것은 최근에 고정되었습니다 (참조 이것 저지르다).

Net-SFTP 2.0.4로 업그레이드하면 더 이상이 모호한 오류가 발생하지 않습니다. 여전히 오류가 발생하지만 구조 블록에서 발생하는 새로운 오류로 인해 원래 오류가 폐기되지 않아서 더 도움이 될 것입니다.

방금 이것을 만났지만 또 다른 이유로 인해 발생했습니다. 내 파일 호스트가 RSA 키를 변경 했으므로 키가 ~/.ssh/known_hosts 틀렸다 --- 이것은 SSH에서 필터링 된 것과 동일한 오류가 발생했다. 유효하지 않은 키를 삭제하면 문제가 해결되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top