2012-01-04 15 views
5

मेरे पास एक सर्वर है जिसमें xls लॉग फ़ाइलों के अलावा कुछ भी नहीं है। प्रत्येक फ़ाइल 5-15 एमबी है और यह इस अर्थ में गतिशील है कि फ़ाइलों को किसी भी समय जोड़ा जाता है। अब मुझे रूबी का उपयोग करके निम्नलिखित प्रक्रिया करने का एक तरीका चाहिए।मैं एक सर्वर से दूसरे सर्वर में एक फ़ाइल कैसे कॉपी करूं?

  1. फ़ाइल नाम को एक सर्वर से भेजकर फ़ाइल कॉपी करें जिसमें किसी अन्य सर्वर पर लॉग फ़ाइल नहीं है।
  2. मुझे सर्वर पासवर्ड को तर्क के रूप में पास करने की आवश्यकता है।
  3. सब कुछ पृष्ठभूमि में होता है, जो रूबी लिपि से ट्रिगर होता है।

उत्तर

4

यह कि यह कैसे काम

मैं के रूप में @theTinMan ने सुझाव दिया और मैं अपने फ़ाइलों की प्रतिलिपि करने में सक्षम था नेट ssh & नेट SCP मणि का इस्तेमाल किया है।

require 'rubygems' 
require 'net/ssh' 
require 'net/scp' 

Net::SSH.start("ip_address", "username",:password => "*********") do |session| 
    session.scp.download! "/home/logfiles/2-1-2012/login.xls", "/home/anil/Downloads" 
end 

और एक प्रति एक संपूर्ण फ़ोल्डर

require 'rubygems' 
require 'net/ssh' 
require 'net/scp' 

Net::SSH.start("ip_address", "username",:password => "*********") do |session| 
    session.scp.download!("/home/logfiles/2-1-2012", "/home/anil/Downloads", :recursive => true) 
end 
1

आपको शायद अपनी खुद की चीज़ रोल करने के बजाय rsync का उपयोग करना चाहिए। सार्वजनिक/निजी कुंजी पहुंच के साथ ssh का उपयोग करें और आप एक पासवर्ड से बचेंगे। एक पासवर्ड का उपयोग करना शायद एक बुरा विचार है।

+0

बिना कुछ कंपनियों कुंजी उपयोग की अनुमति नहीं है। पासवर्ड से निपटने में दर्द होता है, लेकिन यह उनकी सुरक्षा नीति का हिस्सा भी है। –

+1

कुछ कंपनियों के पास आईटी विभाग भी ट्रोल के साथ काम करते हैं। पासवर्ड अनुमान लगाया जा सकता है। चाबियाँ चोरी होनी चाहिए। – tadman

+0

यह हो सकता है। तथ्य यह है कि कुछ स्थानों को पासवर्ड की आवश्यकता होती है। –

10

Net::SCP और Net::SSH रत्नों को देखें। सबसे पहले आपको एक सुरक्षित प्रति का उपयोग करके फ़ाइल पुनर्प्राप्त करने देता है, और दूसरा आपको पुनर्प्राप्ति के लिए उपलब्ध फ़ाइलों के नाम आसानी से ढूंढने देगा। नेट :: एसएसएच में, ssh.exec! आपका मित्र होगा।

Net::SCP डॉक्स से

:

Net :: SCP SCP (सुरक्षित कॉपी) ग्राहक प्रोटोकॉल लागू करता है, रूबी कार्यक्रमों सुरक्षित रूप से और प्रोग्राम के रूप में करने के लिए और दूरदराज के सर्वर से अलग-अलग फ़ाइलों या पूरी निर्देशिका पेड़ हस्तांतरण करने के लिए अनुमति देता है। यह एक ही कनेक्शन के साथ-साथ सिंक्रोनस, सीरियल प्रतियों के लिए समानांतर में काम कर रहे एकाधिक एक साथ एससीपी प्रतियों के लिए समर्थन प्रदान करता है।

Net :: SCP भी प्रदान करता है एक खुले uri टाई में, आप खोल सकते हैं और एक दूरस्थ फ़ाइल को पढ़ने के लिए कर्नेल # खुला विधि का उपयोग कर सकते हैं ताकि:

 
    # if you want to read from a URL voa SCP: 
    require 'uri/open-scp' 
    puts open("scp://[email protected]/path/to/file").read 

Net::SSH डॉक्स से:

require 'net/ssh' 

Net::SSH.start('host', 'user', :password => "password") do |ssh| 
    # capture all stderr and stdout output from a remote process 
    output = ssh.exec!("hostname") 

ब्लॉक को बंद करने के लिए उपरोक्त कोड में end जोड़ें। ब्लॉक के अंदर, output आपके द्वारा भेजे गए आदेश के परिणाम होंगे।

फाइलों वाली मशीन से रूबी के माध्यम से फ़ाइलों को पुनर्प्राप्त करने का एक विकल्प, रूबी को फ़ाइलों को होस्ट करने वाली मशीन से सीधे हस्तांतरण शुरू करना होगा और उन्हें अन्य मशीन पर scp के माध्यम से धक्का देना होगा।

नेट :: एससीपी और नेट :: एसएसएच का उपयोग करने के बजाय, आप इसे एक मणि में प्रबंधित करने के लिए Net::SFTP का उपयोग कर सकते हैं। यह एक सुरक्षित कनेक्शन पर भी सवारी करता है, लेकिन एसएफटीपी आपके लिए उपलब्ध नहीं हो सकता है। Net::SFTP::Operations::Dir और Net::SFTP::Operations::Download कक्षाएं और दस्तावेज़ आपका मित्र होंगे।

अन्य विकल्पों में मानक rsync का उपयोग एक साधारण खोल में @tadman के रूप में किया गया है। इसे पूरा करने के कई तरीके हैं, और यह वातावरण की मेजबानी में एक आम आवश्यकता है।


किसी अन्य बेहतर दृष्टिकोण?

rsync, कमांड लाइन पर। यह बहुत स्मार्ट है और जरूरत पड़ने पर फ़ाइलों के फ़ोल्डरों और डेल्टा को स्थानांतरित कर सकता है। इसके अलावा, "How to transfer files using ssh and Ruby" और इसका लिंक "Ruby file upload ssh intro" है।

रूल्ड के साथ @ tadman की rsync की सलाह देने के लिए मेल्डिंग, "Cheapest rsync replacement (with Ruby)" है।

+0

बॉस आपने मेरा दिन बचाया। नेट/एसएसएच काम किया। प्रश्न में कोड जोड़कर, बहुत बहुत धन्यवाद। –

+1

यदि उसने आपकी मदद की तो आपको प्रश्न (वोट बटन के नीचे थोड़ा टिक चिह्न) स्वीकार करना चाहिए, यह अच्छा एसओ शिष्टाचार है। –

+0

@theTinMan यह एक फ़ाइल के लिए काम करता है, क्या पूरे फ़ोल्डर की प्रतिलिपि बनाने का कोई तरीका है, मैंने उपरोक्त मणि के साथ प्रयास किया है, लेकिन एससीपी सफलतापूर्वक समाप्त नहीं हुआ (1) (नेट :: एससीपी :: त्रुटि) –

0

लगता है यह संभव है करने के लिए SCP

@session = Net::SSH.start(@ftpIp, @ftpUser, :password => @ftpPass) 
@conn = Net::SFTP::Session.new(@session).connect! 

def download_remote_folder(remote_path, local_path, use_ssh = @use_ssh) 
    @conn ||= connect 
    if (use_ssh) 
     @conn.download!(remote_path,local_path,:recursive => true) 
    else 
     @conn.get(remote_path, local_path) 
    end 
    end 

    def download_remote_file(remote_path, local_path, use_ssh = @use_ssh) 
    @conn ||= connect 
    if (use_ssh) 
     @conn.download!(remote_path,local_path) 
    else 
     @conn.get_file(remote_path, local_path) 
    end 
    end 
संबंधित मुद्दे