간단한 Ruby SFTP 예제 구문 오류
문제
나는 매우 벗겨진 행동처럼 보이는 문제가 있습니다. 이것은 루비 나 내가 한 일에 문제가 있습니까? 도와주세요 - 제 프로젝트가 해결 될 때까지 정체됩니다.
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에서 필터링 된 것과 동일한 오류가 발생했다. 유효하지 않은 키를 삭제하면 문제가 해결되었습니다.