2013-10-02 7 views
2

У меня есть удаленный ftp-сервер.
Я могу подключиться к нему с помощью CyberDuck или терминала ftp-клиента.Использование метода экземпляра Net :: FTP `open` для FTP с настраиваемым портом

При попытке соединиться с Net::FTP я могу это сделать:

ftp=Net::FTP.new 
ftp.connect('url', 'port') 
ftp.login('username', 'password') 

Однако, делая это:

Net::FTP.open('url', 'username', 'password') 

возвращается Errno::ECONNREFUSED: Connection refused - connect(2).

Похоже, что .open не принимает параметр порта, что приводит к ошибке для меня, поскольку я использую пользовательский порт. Но мне нужно использовать метод .open, потому что он используется во внешнем драгоценном камне, который я использую (carrierwave-webdav).
Любое обходное решение для этого, или я должен создать свою собственную вилку?
Как подключиться к моему ftp, используя метод .open?

ответ

1

Похоже, Net::FTP::open вызывает Net::FTP::connect под капотом, который соединяется с портом set in the FTP_PORT constant. Это не очень хорошее решение, но вы можете установить эту константу в нужный вам порт.

3

Если передать хост аргумент Net::FTP.new или обязательным Net::FTP.open он пытается немедленно подключиться, так что вы должны пройти нестандартный номер порта в другой форме, как проходит вместе с именем хоста:

Net :: FTP.open («URL: порт», «имя пользователя», «пароль»)

UPDATE: Рубин чистая библиотека, к сожалению, не анализирует строку хоста, так что вам нужно выполнить все шаги подключения отдельно: ответ

ftp = Net::FTP.new # don't pass hostname or it will try open on default port 
ftp.connect('url', port) # here you can pass a non-standard port number 
ftp.login('username', 'password') 
ftp.passive = true # optional, if PASV mode is required 
+0

Я всегда получаю 'SocketError: getaddrinfo: nodename или servname, предоставленный или неизвестный', когда я включаю': '. –

+0

@IanVaughan ответ обновлен –

1

В @ jackbot является правильным, и пример кода для установки FTP_PORT очень просто:

Net::FTP.send(:remove_const, 'FTP_PORT') # just to avoid warnings 
Net::FTP.const_set('FTP_PORT', 22222) 

где 22222 является новый FTP-порт.

Полная цепь: open звонки new, которая вызывает connect, в которой используется FTP_PORT. Вы можете посмотреть исходный код здесь: http://docs.ruby-lang.org/en/2.0.0/Net/FTP.html#method-c-new.

Смежные вопросы