Ruby Net-SFTP не отвечает

Я пытаюсь загрузить файл на сайт SFTP, используя Net::SFTP.

Проблема в том, что процесс Ruby никогда не возвращается. Он заморожен, застрял, бесконечен... Мне нужно нажать Ctrl-C, чтобы остановить его.

  • Я могу подключиться к ftp-серверу в командной строке, используя sftp.
  • Я пробовал этот код в Linux (Ubuntu) и Snow Leopard, и он делает то же самое.
  • Installed the latest version of Net::SSH and Net::SFTP.
    • From gem list net:
      • net-sftp (2.0.5)
      • net-ssh (2.1.4)
  • Различные комбинации хэш-аргументов (см. код ниже)
  • Пытался вызвать Net::SFTP.start вместо того, чтобы сначала создать сеанс SSH.
  • Сервер отвечает «SFTP protocol version 3», когда я вхожу в систему с помощью инструмента командной строки и запрашиваю версию.
  • Я бегу Ruby 1.8.7 (2010-08-16 patchlevel 302) [i686-darwin10.7.0]

Отладочный вывод из :verbose (последняя пара строк):

D, [2011-07-29T17:30:52.692192 #19399] DEBUG -- tcpsocket[80c06478]: read 36 bytes
D, [2011-07-29T17:30:52.692609 #19399] DEBUG -- tcpsocket[80c06478]: received packet nr 7 type 99 len 12
I, [2011-07-29T17:30:52.692751 #19399]  INFO -- net.ssh.connection.session[80bd5da0]: channel_success: 0
D, [2011-07-29T17:30:52.692817 #19399] DEBUG -- net.sftp.session[80bd5c24]: sftp subsystem successfully started
D, [2011-07-29T17:30:52.693625 #19399] DEBUG -- tcpsocket[80c06478]: queueing packet nr 8 type 94 len 28
D, [2011-07-29T17:30:52.693834 #19399] DEBUG -- tcpsocket[80c06478]: sent 52 bytes

Образец кода:

require 'rubygems'
require 'net/sftp'

FTP = "someftpsite"
FTP_USER_NAME = "user"
FTP_PASSWORD = "password"
hash = {:password => FTP_PASSWORD, :verbose => :debug, :keys=>[""],:auth_methods => ["password"], :timeout => 5, :port=>22}
begin
    Net::SSH.start(FTP,FTP_USER_NAME, hash) do |test|
    test.sftp.upload!("localfile","remotefile")
end
rescue Exception => err
    puts "error:#{err.inspect}"
end

Редактировать: 22.08.2011

Похоже, это связано с интерактивностью SFTP-сервера. Я решил эту проблему, создав сценарий оболочки, используя ожидание и выбрав из Ruby для запуска файла. Сценарий оболочки создается во время выполнения. Это кажется действительно хакерским, но это единственный способ заставить его работать с помощью Ruby. Если у кого-то еще есть предложение, я хотел бы найти лучший способ сделать это.


person user498023    schedule 29.07.2011    source источник
comment
возможно, аутентификация сервера настроена на интерактивную, что требует другой обработки входа в вашу программу... Я не эксперт в ruby, поэтому не могу сказать, как это будет сделано в ruby   -  person Yahia    schedule 30.07.2011
comment
Яхья, да, я думаю, ты на правильном пути.   -  person user498023    schedule 01.08.2011


Ответы (1)


Вместо этого вы можете использовать аутентификацию с открытым/закрытым ключом. http://net-ssh.rubyforge.org/ssh/v1/chapter-2.html#s2

person kristianp    schedule 04.01.2013