【问题标题】:Using Net::FTP instance method `open` for FTP with custom port对带有自定义端口的 FTP 使用 Net::FTP 实例方法 `open`
【发布时间】:2013-10-02 09:47:46
【问题描述】:

我有一个远程 ftp 服务器。
我可以使用 Cyber​​Duck 或终端 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 方法,因为它用于我使用的外部gem (carrierwave-webdav)。
这个有什么解决方法,还是我应该创建自己的分叉?
如何使用.open 方法连接到我的 ftp?

【问题讨论】:

    标签: ruby net-ftp


    【解决方案1】:

    如果您将 host 参数传递给Net::FTP.new 或强制传递给Net::FTP.open,它会尝试立即连接,因此您必须以其他方式传递非标准端口号,例如与主机名:

    Net::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
    

    【讨论】:

    • 当我包含: 时,我总是得到SocketError: getaddrinfo: nodename nor servname provided, or not known
    【解决方案2】:

    @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

    【讨论】:

      【解决方案3】:

      似乎Net::FTP::open 在后台调用Net::FTP::connect,它连接到端口set in the FTP_PORT constant。这不是一个很好的解决方案,但您可以将该常量设置为您需要的端口。

      【讨论】:

        猜你喜欢
        • 2011-11-21
        • 1970-01-01
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-07
        相关资源
        最近更新 更多