2015-11-20 2 views
2

Поэтому у меня есть некоторый код, который проверяет, есть ли определенный файл на удаленном сервере SFTP:Net :: SFTP :: Session не может работать стат, по-видимому, имеет канал Nil

def size 
    adapter.sftp.stat(path).size 
end 

где sftp является нетто :: объект SFTP :: Session определяется в этом случае, как

@sftp = Net::SFTP.start(host, username, password: password) 

и path это путь к файлу объекта, который я хочу, чтобы позвонить stat() дальше.

К сожалению, когда я пытаюсь этот код Выполнение выражений, я получаю эту ошибку:

NoMethodError: 
    undefined method `send_data' for nil:NilClass 
# /usr/local/lib/ruby/gems/2.2.0/gems/net-sftp-2.1.2/lib/net/sftp/session.rb:814:in `send_packet' 
# /usr/local/lib/ruby/gems/2.2.0/gems/net-sftp-2.1.2/lib/net/sftp/protocol/base.rb:45:in `send_request' 
# /usr/local/lib/ruby/gems/2.2.0/gems/net-sftp-2.1.2/lib/net/sftp/protocol/01/base.rb:90:in `open' 
# /usr/local/lib/ruby/gems/2.2.0/gems/net-sftp-2.1.2/lib/net/sftp/session.rb:830:in `request' 
# /usr/local/lib/ruby/gems/2.2.0/gems/net-sftp-2.1.2/lib/net/sftp/session.rb:182:in `open' 
# /usr/local/lib/ruby/gems/2.2.0/gems/net-sftp-2.1.2/lib/net/sftp/session.rb:191:in `open!' 
# /usr/local/lib/ruby/gems/2.2.0/gems/net-sftp-2.1.2/lib/net/sftp/operations/file_factory.rb:40:in `open' 
# /Users/Ben/remote_filesystem/lib/remote_filesystem/path/sftp.rb:46:in `size' 
# ./sftp_spec.rb:72:in `block (3 levels) in <top (required)>' 

Насколько я могу сказать, глядя на исходный код для Net :: SFTP :: сессии, на линии 814 из session.rb, channel.send_data, но, по-видимому, мой SFTP-сеанс по какой-то причине имеет канал Nil. Может ли кто-нибудь объяснить, как исправить эту проблему?

ответ

0

Если вы используете кеширование sftp, кеш может быть признан недействительным. Я натолкнулся на это исключение, потому что я попытался позвонить ftp.file.open по соединению ftp, которое больше не было открыто.

0

Как упоминалось ранее, это означает, что сеанс SFTP прекращен.

Проверка протоколов TCP (wirehark - ваш друг), сеанс может быть завершен одноранговым узлом.

Случай, когда происходит такая ошибка, - это если вы выполняете операцию записи (данных) с длиной данных, которая превышает размер окна TCP на принимающей стороне. Исправить было бы повторение операций записи с буфером, например

io = StringIO.new(data) 
    sftp_session.file.open(filename, "w") do |file| 
    while buffer = io.read(BUFFER_SIZE) 
     file.write(buffer) 
    end 
    end 
Смежные вопросы