Использование метода экземпляра 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
постоянный Это не очень хорошее решение, но вы можете установить эту константу для нужного вам порта.