Ruby Net::Загрузка SFTP зависает

Я использую гем net-sftp для загрузки файла на ftp-сервер. Вот мой код:

require "net/sftp"

Net::SFTP.start(url, username, password: password) do |sftp|
  sftp.upload!(file_path, "/")
end

Он просто зависает на линии загрузки и в итоге заканчивается с ошибкой Net::SSH::Disconnect: connection closed by remote host. Я могу подключиться через SFTP с помощью FileZilla, используя тот же URL-адрес, имя пользователя и пароль.

Я также попытался запустить неблочную версию с verbose: :debug:

sftp = Net::SFTP.start(test.ftphost.com, ftp_username, password: ftp_password, verbose: :debug)

^ этот вывод показывает, что соединение было хорошим:

I, [2015-04-29T10:32:51.381339 #25769]  INFO -- net.ssh.connection.session[3fc8a502c24c]: channel_success: 0 D, [2015-04-29T10:32:51.381429 #25769] DEBUG -- net.sftp.session[3fc8a5025d70]: sftp subsystem successfully started

Затем я ввел следующее:

sftp.upload!("/Users/marina/Desktop/test.png", "/")

Вывод застрял так:

I, [2015-04-29T10:32:55.035471 #25769]  INFO -- net.sftp.session[3fc8a5025d70]: sending open packet (0)
D, [2015-04-29T10:32:55.035740 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: queueing packet nr 12 type 94 len 44
D, [2015-04-29T10:32:55.036149 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: sent 68 bytes
D, [2015-04-29T10:32:55.119070 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: read 52 bytes
D, [2015-04-29T10:32:55.119356 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: received packet nr 11 type 96 len 28
I, [2015-04-29T10:32:55.119470 #25769]  INFO -- net.ssh.connection.session[3fc8a502c24c]: channel_eof: 0
D, [2015-04-29T10:32:55.195747 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: read 120 bytes
D, [2015-04-29T10:32:55.196037 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: received packet nr 12 type 98 len 44
I, [2015-04-29T10:32:55.196176 #25769]  INFO -- net.ssh.connection.session[3fc8a502c24c]: channel_request: 0 exit-status false
D, [2015-04-29T10:32:55.196445 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: received packet nr 13 type 97 len 28
I, [2015-04-29T10:32:55.196527 #25769]  INFO -- net.ssh.connection.session[3fc8a502c24c]: channel_close: 0
D, [2015-04-29T10:32:55.196743 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: queueing packet nr 13 type 97 len 28
D, [2015-04-29T10:32:55.196806 #25769] DEBUG -- net.sftp.session[3fc8a5025d70]: sftp channel closed
D, [2015-04-29T10:32:55.197022 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: sent 52 bytes

Есть идеи?


person Marina    schedule 29.04.2015    source источник
comment
Такие зависания обычно связаны с активным или пассивным режимом передачи, см. Почему Net: :FTP подключиться к серверу?   -  person Steffen Ullrich    schedule 29.04.2015
comment
@SteffenUllrich Я использую SFTP, а не FTP (stackoverflow.com/a/5881966/858418)   -  person Marina    schedule 29.04.2015
comment
Извините, вы правы.   -  person Steffen Ullrich    schedule 29.04.2015


Ответы (2)


Что такое file_path?

Если вы используете относительный путь, он будет относиться к каталогу, в котором запускается приложение.

Может быть полезно следующее:

Dir.pwd
Dir.entries('.')

Возможно, verbose: debug будет полезно.

Также:

У меня также возникают проблемы с использованием Net::SFTP.start с блоком, и мне приходится обходиться встроенным подходом.

sftp = Net::SFTP.start(host, username, ssh_session_options)
sftp.upload!(file.path, remote_path)
sftp.session.shutdown!

проблема с Github

person B Seven    schedule 29.04.2015
comment
мой путь к файлу выглядит так: /Users/marina/Desktop/test.png - person Marina; 29.04.2015
comment
Выглядит хорошо. Вы можете проверить это с помощью ls /Users/marina/Desktop/test.png - person B Seven; 29.04.2015
comment
да, путь к файлу правильный. Я обновил свои вопросы неблокируемой версией, включая параметр verbose: :debug. Я включил вывод. - person Marina; 29.04.2015
comment
@Marina У меня такая же проблема, и я заметил, что она зависает только на файлах png. Я вижу, что у вас также не работает png. Удалось ли вам решить эту проблему? - person Jordan Patterson; 23.07.2015

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

require "net/sftp"

Net::SFTP.start(url, username, password: password) do |sftp|
  sftp.upload!(file_path, "/")
end

Мне нужно было добавить имя файла:

require "net/sftp"

Net::SFTP.start(url, username, password: password) do |sftp|
  sftp.upload!(file_path, "/filename.extension")
end

И блочный синтаксис у меня работал.

person Marina    schedule 29.04.2015