Использование метода экземпляра Net::FTP `open` для FTP с пользовательским портом

У меня есть удаленный FTP-сервер.
Я могу подключиться к нему с помощью CyberDuck или терминала 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 метод?

3 ответа

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

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

ОБНОВЛЕНИЕ: библиотека Ruby net, к сожалению, не анализирует строку хоста, поэтому вам нужно выполнить все шаги подключения отдельно:

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

Ответ @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.

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

Другие вопросы по тегам