2012-07-27 6 views
6

Net :: FTP 루비 라이브러리를 사용하여 FTP 서버에 연결하고 파일을 다운로드합니다. 그것은 모두 잘 작동하지만, 이제는 방화벽이 IP 주소를 허용하고 IP 주소를 허용하기 때문에 아웃 바운드 프록시를 사용해야하며 Heroku를 사용하여 사이트를 호스팅하고 있습니다. 유망 해 보이는 새로운 Proximo 애드온을 시험해보고 있지만 Net :: FTP를 사용하여 얻을 수는 없습니다.Ruby Net :: FTP에서 프록시 서버를 사용하는 방법?

연결 (호스트, 포트 = FTP_PORT는)

선택적으로 기본 포트를 무시하고 호스트 FTP 연결을 설정합니다 :

나는하여 Net::FTP docs에서 다음을 참조하십시오. 환경 변수 SOCKS_SERVER가 설정되면 SOCKS 프록시를 통해 연결을 설정합니다. 연결을 설정할 수없는 경우 예외 (일반적으로 Errno :: ECONNREFUSED)를 발생시킵니다.

그러나이 환경 변수를 설정하려고하거나 ENV['SOCKS_SERVER'] = proximo_url을 설정하려고해도 작동하지 않습니다. 아무도 이것을 제대로하는 방법을 알고 있습니까? SOCKS 프록시 일 필요는 없지만 HTTP 프록시가 수행 할 수 있습니다. Net :: FTP 라이브러리가이를 지원하는지 잘 모르겠습니다.

은 ... 몇 가지 조사 후 ...

나는 인터넷 :: FTP 내가 these docs을 발견하는 SOCKSSocket라는 클래스를 찾는 것을 발견했다. 그러나 나는 그것을 포함 할 수 없다. include 'socket' false를 반환합니다. 이미로드되었음을 의미합니다.

+0

혹시 이것을 알아 냈습니까? –

+0

@JohnWright 불행히도 : ( –

답변

1

예 : 보석을 사용할 수 있습니다. Quotaguard. ftp와 loadbalancing은 문제를 일으킬 수 있기 때문에 제공된 고정 IP 중 하나를 프록시 서버로 사용합니다 (DNS 호스트 이름은 아님).

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 
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: '[email protected]'  , 
     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 

지금 실제 응용 프로그램에서 당신은 다만 할 수 있습니다 tvgriek

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 

감사를 올바른 방향으로 가리키는 위해.

관련 문제