6

我正在使用 Net::FTP ruby​​ 库连接到 FTP 服务器并下载文件。这一切都很好,但现在我需要使用出站代理,因为他们的防火墙将 IP 地址列入白名单,并且我正在使用 Heroku 来托管该站点。我正在尝试新的 Proximo 插件,它看起来很有希望,但我无法让 Net::FTP 使用它。

我在Net::FTP 文档中看到以下内容:

连接(主机,端口 = FTP_PORT)

建立与主机的 FTP 连接,可选择覆盖默认端口。如果设置了环境变量 SOCKS_SERVER,则通过 SOCKS 代理设置连接。如果无法建立连接,则引发异常(通常是 Errno::ECONNREFUSED)。

但是尝试设置这个环境变量,或者设置ENV['SOCKS_SERVER'] = proximo_url也不起作用。有谁知道如何正确地做到这一点?它不必是 SOCKS 代理,HTTP 代理就可以,但我不确定 Net::FTP 库是否支持这一点。

...经过一些研究...

我发现 Net::FTP 寻找一个名为 的类SOCKSSocket,为此我找到了这些文档。但我不能包括它。include 'socket'返回 false 我很确定这意味着它已经加载。

4

3 回答 3

1

您可以将socksify gem 与例如结合使用。配额保护。确保您使用提供的静态 IP 之一(而不是 DNS 主机名)作为代理服务器,因为 FTP 和负载平衡可能会导致麻烦。

Socksify::debug = true
proxy_uri = URI(ENV['QUOTAGUARDSTATIC_URL'])
proxy_hostname = proxy_uri.hostname
proxy_port = 1080
TCPSocket::socks_username = proxy_uri.user
TCPSocket::socks_password = proxy_uri.password
Socksify::proxy(proxy_hostname, proxy_port) do |soc| 
       Net::FTP.open(server) do |ftp|
            ftp.passive = true
            ftp.debug_mode = true 
            ftp.login user, password
            ftp.get(export, storelocation)
            ftp.close
       end
end
于 2016-05-24T10:43:06.803 回答
0

这是我对这个问题的看法。锅炉板:

# Connects to ftp through a socks proxy
#
# TODO: testing, use ssl, capture debugging output, recovery on network failure...
#
# @param ftpHost   [String ] Domain name or ip address of the ftp server
# @param proxyHost [String ] Host name or ip address of the socks proxy
# @param proxyPort [FixNum ] Port number of the socks proxy
# @param proxyUser [String ] User name for connecting to the proxy if needed
# @param proxyPass [String ] Password  for connecting to the proxy if needed
# @param ftpPort   [FixNum ] Ftp port, defaults to 21
# @param ftpUser   [String ] Ftp username
# @param ftpPass   [String ] Ftp password
# @param debug     [Boolean] Whether to turn on debug output of both socksify and Net::FTP, will be sent to STDOUT
# @param passive   [Boolean] Whether to use passive FTP mode
#
def ftp(

        ftpHost:                      ,
        proxyHost:                    ,
        proxyPort:                    ,
        proxyUser: nil                ,
        proxyPass: nil                ,
        ftpPort:   Net::FTP::FTP_PORT ,
        ftpUser:   'anonymous'        ,
        ftpPass:   'anonymous@'       ,
        debug:     false              ,
        passive:   true

    )

    Socksify::debug           = debug
    TCPSocket::socks_username = proxyUser
    TCPSocket::socks_password = proxyPass

    Socksify::proxy( proxyHost, proxyPort ) do |_|

        begin

            # Check whether we got an ip address or a domain name.
            # If needed we'll do dns through the socket to avoid dns leaks.
            #
            Regexp.new( URI::RFC2396_Parser.new.pattern[ :IPV4ADDR ] ) =~ ftpHost  or

                ftpHost = Socksify::resolve( ftpHost )


            ftp            = Net::FTP.new
            ftp.debug_mode = debug
            ftp.passive    = passive

            ftp.connect ftpHost, ftpPort
            ftp.login   ftpUser, ftpPass

            yield ftp

        ensure

            ftp.close

        end

    end

end

现在在您的实际应用程序中,您可以这样做:

def listRemoteFiles

    connect do |ftp|

        puts ftp.list.inspect  # or other cool functions from Net::FTP

    end

end


def connect &block

    ftp({

        debug:     true            ,
        proxyHost: your.proxy.host ,
        proxyPort: your.proxy.port ,
        ftpHost:   your.ftpHost 

    }, &block )

end

感谢tvgriek指出正确的方向。

于 2017-02-05T20:04:36.027 回答
-1

您可以使用 Proximo 包装器通过 Proximo 转发流量。以下是官方说明: https ://devcenter.heroku.com/articles/proximo#forwarding-traffic-through-proximo

于 2014-08-14T08:25:06.170 回答