2015-04-29 7 views
0

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

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 

Любые идеи?

+0

Такие зависания обычно связаны с активным и пассивным режимами передачи, см. [Почему не может подключаться Net :: FTP к серверу?] (Http://stackoverflow.com/questions/15103830/why-cant-netftp- connect-to-server) –

+0

@SteffenUllrich Я использую SFTP - не FTP (http://stackoverflow.com/a/5881966/858418) – Marina

+0

Извините, что вы правы. –

ответ

0

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

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 

и синтаксис блока сделал работу для меня.

1

Что такое 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 Issue

+0

my file_path выглядит так: «/Users/marina/Desktop/test.png» – Marina

+0

Это выглядит хорошо. Вы можете проверить его с помощью 'ls/Users/marina/Desktop/test.png' –

+0

yep, путь к файлу действителен. Я обновил свои вопросы с неблокированной версией, включая опцию verbose:: debug. Я включил вывод. – Marina