我有一个远程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
)。
对此有什么解决方法,还是应该创建自己的分叉?
如何使用.open
方法连接到我的 ftp?
如果将 host 参数传递给
Net::FTP.new
或强制传递给 Net::FTP.open
它会立即尝试连接,因此您必须以其他方式传递非标准端口号,例如与主机名一起传递:
FTP.open('url:port', 'username', 'password')
更新:不幸的是,Ruby 网络库不会解析主机字符串,因此您需要单独执行所有连接步骤:
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#method-c-new。
Net::FTP::open
在引擎盖下调用Net::FTP::connect
,它连接到FTP_PORT
常量中设置的端口。这不是一个非常好的解决方案,但您可以将该常量设置为所需的端口。