2012-07-27 46 views
6

मैं एक FTP सर्वर से कनेक्ट करने और फ़ाइलों को डाउनलोड करने के लिए नेट :: एफ़टीपी रूबी लाइब्रेरी का उपयोग कर रहा हूं। यह सब ठीक काम करता है, लेकिन अब मुझे फ़ायरवॉल श्वेतसूची आईपी पते के बाद से एक आउटबाउंड प्रॉक्सी का उपयोग करने की आवश्यकता है, और मैं साइट होस्ट करने के लिए हेरोकू का उपयोग कर रहा हूं। मैं नए प्रॉक्सीमो एड-ऑन को आजमा रहा हूं जो आशाजनक लग रहा है, लेकिन मुझे इसका उपयोग करने के लिए नेट :: एफ़टीपी नहीं मिल सकता है।रुबी नेट :: एफ़टीपी के साथ प्रॉक्सी सर्वर का उपयोग कैसे करें?

कनेक्ट (मेजबान, बंदरगाह = FTP_PORT)

, होस्ट करने के लिए वैकल्पिक रूप से डिफ़ॉल्ट पोर्ट अधिभावी एक FTP कनेक्शन स्थापित करता है:

मैं Net::FTP docs में निम्न देखें। यदि पर्यावरण परिवर्तनीय SOCKS_SERVER सेट है, तो सॉक्स प्रॉक्सी के माध्यम से कनेक्शन सेट अप करें। कनेक्शन स्थापित नहीं किया जा सकता है, तो एक अपवाद (आमतौर पर Errno :: ECONNREFUSED) उठाता है।

लेकिन इस पर्यावरण चर सेट करने की कोशिश कर रहा है, या ENV['SOCKS_SERVER'] = proximo_url सेटिंग या तो काम नहीं करता है। क्या कोई जानता है कि यह ठीक से कैसे करें? यह एक सॉक्स प्रॉक्सी नहीं होना चाहिए, एक HTTP प्रॉक्सी करेगा, लेकिन मुझे यकीन नहीं है कि नेट :: एफ़टीपी लाइब्रेरी इसका समर्थन करता है।

... कुछ शोध के बाद ...

मैंने पाया कि Net :: FTP एक वर्ग, SOCKSSocket कहा जाता है जिसके लिए मैं these docs पाया के लिए लग रहा है। लेकिन मैं इसे शामिल नहीं कर सकता। include 'socket' झूठी रिटर्न देता है जो मुझे पूरा यकीन है कि यह पहले ही लोड हो चुका है।

+0

क्या आपने कभी यह पता लगाया है? –

+0

@ जॉन राइट दुर्भाग्य से नहीं :( –

उत्तर

-1

आप Proximo के माध्यम से यातायात अग्रेषित करने के लिए Proximo आवरण का उपयोग कर सकते हैं। यहां आधिकारिक निर्देश दिए गए हैं: https://devcenter.heroku.com/articles/proximo#forwarding-traffic-through-proximo

+0

वह आलेख बताता है कि हेरोोकू के साथ प्रॉक्सी कैसे स्थापित करें, इसका रूबी के एफ़टीपी वर्ग को प्रॉक्सी करने के साथ कुछ लेना देना नहीं है। –

1

आप मणि का उपयोग उदाहरण के साथ संयोजन में कर सकते हैं। Quotaguard। सुनिश्चित करें कि आप प्रॉक्सी सर्वर के रूप में प्रदान किए गए स्थिर आईपी में से एक (और 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 

अब अपने वास्तविक आवेदन में तुम सिर्फ कर सकते हैं: सही दिशा में इशारा करते हुए के लिए

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 के लिए धन्यवाद।