Я пытаюсь загрузить файл на сайт SFTP, используя Net :: SFTP.
Проблема в том, что процесс Ruby никогда не возвращается. Он заморожен, застрял, никогда не кончается ... Мне нужно Ctrl-C, чтобы остановить его.
- Я могу подключиться к серверу ftp в командной строке, используя sftp.
- Я пробовал этот код в Linux (Ubuntu) и Snow Leopard, и он делает то же самое.
- Установлена последняя версия Net :: SSH и Net :: SFTP.
- С
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
Редактировать: 8/22/2011
Похоже, это связано с интерактивностью SFTP-сервера. Я решил это, создав сценарий оболочки, используя ожидаемый и защищенный от Ruby сценарий для запуска файла. Сценарий оболочки создается во время выполнения. Это кажется действительно хакерским, но это единственный способ, которым я смог заставить его работать с использованием Ruby. Если у кого-то есть предложение, я бы хотел найти лучший способ сделать это.