2009-02-05 5 views
10

मैंने एक प्रोग्राम बनाया है जो फाइलों के समूह पर चलता है और उनमें से कुछ के लिए आमंत्रित करता है:अनुरोध पर एसएसएच पर फ़ाइलों को स्थानांतरित करने के लिए प्रेषक और रिसीवर?

scp <file> [email protected]:<remotefile> 

हालांकि, मेरे मामले में, हजारों छोटी फाइलें हो सकती हैं जिन्हें स्थानांतरित करने की आवश्यकता है, और एसपीपी एक नया खोल रहा है उनमें से प्रत्येक के लिए एसएसएच कनेक्शन, जिसमें काफी कुछ ओवरहेड है।

मैं सोच रहा था कि कोई समाधान नहीं है जहां मैं एक प्रक्रिया को जारी रखता हूं जो कनेक्शन को बनाए रखता है और मैं इसे एकल फाइलों पर प्रतिलिपि बनाने के लिए "अनुरोध" भेज सकता हूं।

आदर्श रूप से, मैं कुछ प्रेषक और रिसीवर प्रोग्राम के संयोजन की तलाश में हूं, जैसे कि मैं शुरुआत में एक ही प्रक्रिया (1) शुरू कर सकता हूं:

ssh [email protected] receiverprogram 

और प्रत्येक फ़ाइल के लिए, मैं एक आह्वान करता हूं कमांड (2):

senderprogram <file> <remotefile> 

और (2) के इनपुट (2) के आउटपुट को पाइप करें, और इससे फ़ाइल को स्थानांतरित किया जा सकेगा। अंत में, मैं केवल प्रक्रिया को भेज सकता हूं (1) समाप्त करने के लिए कुछ सिग्नल।

अधिमानतः प्रेषक और रिसीवर प्रोग्राम यूनिक्स के लिए ओपन सोर्स सी प्रोग्राम हैं। वे एक पाइप, या किसी अन्य रचनात्मक समाधान के बजाय सॉकेट का उपयोग कर संवाद कर सकते हैं।

हालांकि, यह एक महत्वपूर्ण बाधा है कि प्रत्येक फ़ाइल उस समय स्थानांतरित हो जाती है जब मैं इसे पुन: सक्रिय करता हूं: फ़ाइलों की सूची एकत्र करने के लिए स्वीकार्य नहीं है और फिर सभी फ़ाइलों को एक बार में स्थानांतरित करने के लिए scp का एक उदाहरण आमंत्रित करना अतं मै। इसके अलावा, मेरे पास प्राप्तकर्ता होस्ट के लिए केवल सरल खोल पहुंच है।

अद्यतन: मुझे एसएसएच की मल्टीप्लेक्सिंग सुविधाओं का उपयोग कर कनेक्शन ओवरहेड की समस्या का समाधान मिला, नीचे अपना स्वयं का जवाब देखें। फिर भी, मैं एक बक्षीस शुरू कर रहा हूं क्योंकि मुझे पता है कि कोई प्रेषक/रिसीवर प्रोग्राम मौजूद है या नहीं, जैसा कि मैंने यहां वर्णन किया है। ऐसा लगता है कि वहां कुछ ऐसा होना चाहिए जिसका उपयोग किया जा सके, उदा। Xmodem/ymodem/zmodem?

+0

एक मामूली नोट - यदि आप ब्रूनो के रूप में वर्णित एसपीपी/एसएसएच का उपयोग करते हैं, तो प्रदर्शन को चुनने के लिए एक रिश्तेदार "फ्रीबी" तर्क "-c आर्कफॉर" तर्क जोड़ना है - इससे एन्क्रिप्शन चरण अधिक हल्का होता है, और कर सकता है मोटे तौर पर डबल througput। – jasedit

उत्तर

3

इस तरह से काम करेगा, और अन्य चीजों के लिए, यह सामान्य दृष्टिकोण कम या ज्यादा सही है ।

(
iterate over file list 
    for each matching file 
    echo filename 
) | cpio -H newc -o | ssh remotehost cd location \&\& | cpio -H newc -imud 
+0

हाय जोशुआ, सीपीओ एक बहुत उपयोगी इमारत ब्लॉक की तरह दिखता है! हालांकि, अगर मैं उदाहरण के लिए कोशिश करता हूं 'cpio -H newc -o | {सीडी आउट-डीआईआर; cpio -H newc -im; } 'और फिर stdin पर कुछ नाम दर्ज करें, मुझे लगता है कि पिछली फ़ाइल तब तक कॉपी नहीं की जाती जब तक कि अगला दर्ज नहीं किया जाता है, क्योंकि cpio पूरे ब्लॉक को पढ़ने की प्रतीक्षा करता है? –

+1

हाँ, लेकिन यदि आप इसे कीबोर्ड-इंटरैक्टिव नहीं कर रहे हैं तो इससे कोई फर्क नहीं पड़ता। – Joshua

1

टैर के लिए नौकरी की तरह लगता है? अपने आउटपुट को एसएसएच पर पाइप करें, और दूसरी ओर एसएसएच आउटपुट को टैर पर पाइप करें।

+0

नहीं, टैर उसे "प्रत्येक फ़ाइल को इस पर इटेटरेटर के रूप में स्थानांतरित नहीं करेगा" आवश्यकता प्रदान नहीं करेगा। – Darron

+0

शायद, यदि आप इनपुट से "tar -x" पढ़ते रहते हैं, और उस इनपुट में एकाधिक "tar -A" आमंत्रण के आउटपुट को पाइप करके अनुरोध भेज सकते हैं। –

4

यह एसपीपी के बजाय sftp का उपयोग करने के लिए और बैच मोड में रखने के लिए काम कर सकता है। बैच कमांड को एक पाइप या यूनिक्स डोमेन सॉकेट फ़ाइल करें और इसे कमांड करें, क्योंकि आप उन्हें निष्पादित करना चाहते हैं।

इस पर सुरक्षा ग्राहक अंत में थोड़ा मुश्किल हो सकती है।

2

एसएसएच पर rsync का उपयोग करें यदि आप एक ही निर्देशिका (या निर्देशिकाओं के पदानुक्रम) में भेजने के लिए सभी फाइलें एकत्र कर सकते हैं।

यदि आपके पास एक ही स्थान पर सभी फाइलें नहीं हैं, तो कृपया कुछ और जानकारी दें कि आप क्या हासिल करना चाहते हैं और आप सभी फ़ाइलों को संग्रह में क्यों पैक नहीं कर सकते हैं और इसे भेज सकते हैं। यह इतना महत्वपूर्ण क्यों है कि प्रत्येक फाइल तुरंत भेजी जाती है? क्या यह ठीक होगा अगर फाइल को थोड़ी देर के साथ भेजा गया था (जैसे कि 4 के लायक डेटा जमा हो गया है)?

+0

प्रतिलिपि करते समय डेटा बफर करना ठीक है, लेकिन जब 'प्रेषक प्रोग्राम' प्रोग्राम सफलतापूर्वक पूरा हो जाता है, तो मैं निश्चित होना चाहता हूं कि फ़ाइल दूरस्थ होस्ट पर संग्रहीत की गई है। कारण यह है कि मैं एक तालिका में प्रतिलिपि स्थिति को चिह्नित करना चाहता हूं; अगली फाइलों को फिर से चालू करते समय तालिका व्यवहार को प्रभावित करती है। –

23

मुझे किसी अन्य कोण से समाधान मिला। चूंकि version 3.9, ओपनएसएसएच सत्र मल्टीप्लेक्सिंग का समर्थन करता है: एक कनेक्शन में एकाधिक लॉगिन या फ़ाइल स्थानांतरण सत्र हो सकते हैं। यह प्रति कनेक्शन सेट-अप लागत से बचाता है।

प्रश्न के मामले में, मैं पहले एक विशिष्ट स्थान पर सॉकेट (-S) के साथ एक नियंत्रण मास्टर (-M) सेट अप के साथ कनेक्शन खोल सकता हूं। मुझे सत्र की आवश्यकता नहीं है (-N)।

ssh [email protected] -M -S /tmp/%[email protected]%h:%p -N 

इसके बाद, मैं प्रत्येक फ़ाइल के लिए scp आह्वान और यह एक ही सॉकेट का उपयोग करने के निर्देश दे सकते हैं:

scp -o 'ControlPath /tmp/%[email protected]%h:%p' <file> [email protected]:<remotefile> 

यह आदेश लगभग तुरंत कॉपी करने शुरू होता है!

तुम भी सामान्य ssh कनेक्शन के लिए नियंत्रण सॉकेट, जो तब तुरंत खुल जाएगा उपयोग कर सकते हैं:

ssh [email protected] -S /tmp/%[email protected]%h:%p 

नियंत्रण सॉकेट अब उपलब्ध नहीं है, तो (उदाहरण के लिए, क्योंकि आप गुरु की मौत हो गई), इस पीठ पर गिर जाता है एक सामान्य कनेक्शन अधिक जानकारी this article में उपलब्ध है।

+0

यदि आप लिनक्स या किसी अन्य ओएस का उपयोग करते हैं तो FSSE समर्थन का उपयोग करने के लिए सबसे आसान तरीका sshfs का उपयोग करना अभी भी आसान है। – ypnos

+0

आप इस विकल्प को नौकरी चलाने वाले उपयोगकर्ता के .ssh/config में भी सेट कर सकते हैं। वहां आप मेजबान से मेल खा सकते हैं और कंट्रोलमास्टर और कंट्रोलपाथ प्रदान कर सकते हैं। – olle

+0

यह जानने के लिए बहुत आसान है। मैंने इस तकनीक का उपयोग करके एक बैच स्क्रिप्ट को तेजी से बढ़ाया है। धन्यवाद। – Jonathan

1

मुझे लगता है कि एसएफटीपी (एसएसएच) के माध्यम से शेयर एक्सेस करते समय GNOME डेस्कटॉप एक एसएसएच कनेक्शन का उपयोग करता है। मैं अनुमान लगा रहा हूं कि यह हो रहा है क्योंकि जब मैं रिमोट शेयर तक पहुंचता हूं तो मुझे एक एसएसएच प्रक्रिया दिखाई देती है। तो यदि यह सच है तो आप इस उद्देश्य के लिए एक ही कार्यक्रम का उपयोग करने में सक्षम होना चाहिए।

विभिन्न बैकएंड के माध्यम से सभी प्रकार के I/O निष्पादित करने के लिए गनोम के नए संस्करण ने GIO के माध्यम से जीवीएफएस का उपयोग किया। उबंटू पैकेज gvfs-bin विभिन्न कमांड लाइन उपयोगिताओं को प्रदान करता है जो आपको कमांड लाइन से बैकएंड में हेरफेर करने देता है।

सबसे पहले आप अपनी SSH फ़ोल्डर माउंट करने के लिए की आवश्यकता होगी:

SFTP gvfs माउंट: // user @ host/

और फिर आप अपनी फ़ाइलों को कॉपी करने के लिए gvfs-प्रति का उपयोग कर सकते हैं। मुझे लगता है कि सभी फाइल स्थानांतरण एक एसएसएच प्रक्रिया के माध्यम से किया जाएगा। आप यह देखने के लिए पीएस का उपयोग भी कर सकते हैं कि कौन सी प्रक्रिया का उपयोग किया जा रहा है।

यदि आप अधिक साहसी महसूस करते हैं तो आप सी में या किसी अन्य उच्च स्तर की भाषा में अपना स्वयं का प्रोग्राम भी लिख सकते हैं जो जीआईओ को एपीआई प्रदान करता है।

2

यह एक अच्छी छोटी समस्या है। मुझे एक प्रीपेक्टेड समाधान के बारे में पता नहीं है, लेकिन आप सरल शैल स्क्रिप्ट के साथ बहुत कुछ कर सकते हैं। मैं रिसीवर पर यह कोशिश करेंगे:

#!/bin/ksh 
# this is receiverprogram 

while true 
do 
    typeset -i length 
    read filename # read filename sent by sender below 
    read size  # read size of file sent 
    read -N $size contents # read all the bytes of the file 
    print -n "$contents" > "$filename" 
done 

इस पक्ष में मैं एक नामित पाइप बना सकते हैं और पाइप से पढ़ता था, जैसे,

mkfifo $HOME/my-connection 
ssh remotehost receiver-script < $HOME/my-connection 

फिर एक फ़ाइल भेजने के लिए मैं कोशिश करता हूँ इस स्क्रिप्ट

#!/bin/ksh 
# this is senderprogram 

FIFO=$HOME/my-connection 

localname="$1" 
remotename="$2" 
print "$remotename" > $FIFO 
size=$(stat -c %s "$localname") 
print "$size" > $FIFO 
cat "$localname" > $FIFO 

फ़ाइल आकार बड़ा तो आप शायद एक बार में इसे पढ़ने के लिए नहीं करना चाहती है, तो

के आदेश पर कुछ

आखिरकार आप स्क्रिप्ट का विस्तार करना चाहेंगे ताकि आप chmod और chgrp आदेशों से गुजर सकें।आप भेजने के कोड पर भरोसा के बाद से, यह शायद बात की संरचना ताकि रिसीवर बस प्रत्येक पंक्ति पर खोल eval कहता है, तो जैसे

print filename='"'"$remotename"'"' > $FIFO 
print "read_and_copy_bytes " '$filename' "$size" > $FIFO 

सामान भेजने के लिए और फिर एक स्थानीय समारोह read_and_copy_bytes परिभाषित करने के लिए सबसे आसान है। उद्धरण सही प्राप्त करना एक भालू है, लेकिन अन्यथा यह सीधा होना चाहिए।

बेशक, इनमें से कोई भी परीक्षण नहीं किया गया है! लेकिन मुझे उम्मीद है कि यह आपको कुछ उपयोगी विचार देता है।

+0

विचारों के लिए धन्यवाद! मैंने सबसे सरल संस्करण की कोशिश की, जो कुछ फिक्स (प्रिंट-आर, लंबाई आकार होना चाहिए) के बाद एक फ़ाइल स्थानांतरित कर सकती है, लेकिन रिसीवर उसके बाद एक अंतहीन पाश में जाता है: जहां तक ​​मैं कह सकता हूं, 'पढ़ा' तुरंत वापस लौटना प्रतीत होता है हालांकि अभी तक पढ़ने के लिए कुछ भी नहीं है ... –

+0

टाइपो के बारे में क्षमा करें। एक बार जब मैं अपने वेब ब्राउजर में पोस्ट प्राप्त करता हूं तो यह असंभव धीमा होता है और मुझे सामान याद आती है। यह अजीब बात है कि 'पढ़ा' ब्लॉक नहीं करता है। हो सकता है कि 864000 पढ़ा जाए, जो दस दिनों तक इंतजार कर रहा है? –

+0

टाइमआउट मदद नहीं करता है। मुझे लगता है कि 'read' तुरंत खाली स्ट्रिंग देता है जब फ़ाइल डिस्क्रिप्टर से इसे पढ़ा जाता है। इसे आज़माएं: ksh -xc 'जबकि सत्य; एल पढ़ो; प्रिंट -आर $ एल; किया '

0
rsync -avlzp [email protected]:/path/to/files /path/to/this/folder 

यह, फ़ाइलों को हस्तांतरण करने, एक गैर धीमी गति से रास्ता

0

इसे आसान बनाएं में जो कुछ इस तरह करता है एक छोटे से आवरण स्क्रिप्ट लिखने SSH का प्रयोग करेंगे।

  1. टार फ़ाइलों

कुछ इस तरह दूसरे पक्ष पर टार फ़ाइल

  • अनटार भेजें:

    1. टार -cvzf test.tgz फ़ाइलें .. ..
    2. scp test.tgz [email protected]:।
    3. ssh [email protected] टार -xzvf test.tgz

    /जोहान

  • +0

    मैं इसे सरल रखने के लिए सभी हूं, लेकिन जैसा कि समझाया गया है, मैं फ़ाइलों को एक साथ में स्थानांतरित नहीं कर सकता। साथ ही, यह 'scp -rp फ़ाइलों उपयोगकर्ता @ other.site.com' –

    +0

    का एक कम इष्टतम संस्करण प्रतीत होता है, केवल अंतर यह है कि आप अपने डेटा को टैर और ज़िप के साथ पैक कर देंगे ताकि नेटवर्क पर डेटा की कुल मात्रा होगी कम से। – Johan

    +0

    ठीक है, आप संपीड़न का मतलब है। ध्यान दें कि एसएसएच कनेक्शन को '-C' ध्वज या' संपीड़न 'विकल्प के साथ संपीड़ित किया जा सकता है। –

    3

    हो सकता है आप इस के लिए देख रहे हैं: ZSSH

    zssh (zmodem SSH) सुरक्षित खोल (एसएसएच) का उपयोग करते समय फ़ाइलों को एक दूरस्थ मशीन पर इंटरैक्टिव रूप से स्थानांतरित करने के लिए एक कार्यक्रम है। यह एसपीपी के लिए एक सुविधाजनक विकल्प होने का इरादा है, बिना किसी अन्य सत्र को खोलने और स्वयं को पुन: प्रमाणित किए बिना फ़ाइलों को स्थानांतरित करने की इजाजत देता है।

    1

    एक विकल्प Conch है एक SSH क्लाइंट और सर्वर कार्यान्वयन पायथन में लिखा Twsited ढांचे का उपयोग कर रहा है। आप इसे किसी ऐसे टूल को लिखने के लिए उपयोग कर सकते हैं जो किसी अन्य प्रोटोकॉल (HTTP या यूनिक्स डोमेन सॉकेट, एफ़टीपी, एसएसएच या जो कुछ भी) के माध्यम से अनुरोध स्वीकार करता है और एक लंबे समय से चल रहे एसएसएच कनेक्शन पर फ़ाइल स्थानान्तरण ट्रिगर करता है। असल में, मेरे पास उत्पादन में कई कार्यक्रम हैं जो एकाधिक एसएसएच कनेक्शन सेटअप से बचने के लिए इस तकनीक का उपयोग करते हैं।

    4

    क्या आपने sshfs को आजमाया है? आप कर सकते हैं:

    sshfs [email protected]_host:/remote_dir /mnt/local_dir 
    

    • /remote_dir कहाँ था निर्देशिका आप सिस्टम पर आप
    • /mnt/local_dir में sshing कर रहे हैं करने के लिए फ़ाइलों को भेजना चाहते हैं स्थानीय माउंट स्थान था

    इस सेटअप के साथ आप फ़ाइल को local_dir में फ़ाइल कर सकते हैं और यह होगा अपने remote_dir

    नोट remote_host को sftp पर भेजा एक भी कनेक्शन है वहाँ है कि, इसलिए भूमि के ऊपर

    के रास्ते में कुछ है

    आप झंडा -o ServerAliveInterval=15 उपयोग करने के लिए एक indefinite connection

    आप को बनाए रखने की आवश्यकता हो सकती है fuse को स्थानीय रूप से स्थापित करना होगा और sftp

    1

    कुछ हफ्ते पहले a very similar question here था। accepted answer रिमोट मशीन पर ssh'ing और सुरंग हस्तांतरण के लिए उस सुरंग का उपयोग करने के लिए एक सुरंग खोलने का प्रस्ताव किया।

    1

    Perhapse CurlFTPFS आपके लिए एक वैध समाधान हो सकता है।

    ऐसा लगता है कि यह सिर्फ आपके कंप्यूटर पर बाहरी कंप्यूटर के फ़ोल्डर को SFTP के माध्यम से माउंट करता है। एक बार ऐसा करने के बाद, आप अपने नियमित cp आदेशों का उपयोग करने में सक्षम होना चाहिए और सब कुछ सुरक्षित रूप से किया जाएगा।

    दुर्भाग्यवश मैं इसे स्वयं परीक्षण करने में सक्षम नहीं था, लेकिन अगर यह आपके लिए काम करता है तो मुझे बताएं!

    संपादित करें 1: मैं इसे डाउनलोड और परीक्षण करने में सक्षम हूं। जैसा कि मुझे डर था कि क्लाइंट के पास एफ़टीपी सर्वर की आवश्यकता है। हालांकि, मुझे एक और प्रोग्राम मिला है जो वास्तव में वही अवधारणा है जो आप खोज रहे हैं। sshfs आपको किसी भी विशेष सर्वर की आवश्यकता के बिना अपने क्लाइंट कंप्यूटर से कनेक्ट करने की अनुमति देता है। एक बार जब आप अपने फ़ोल्डर्स में से एक को घुमाएंगे, तो आप जो भी फाइलें चाहते हैं उसे स्थानांतरित करने के लिए आप अपने सामान्य cp कमांड का उपयोग कर सकते हैं। एक बार जब आप कर लेंगे, तो यह umount /path/to/mounted/folder का मुस्कुराहट मामला होना चाहिए। मुझे बताएं कि यह कैसे काम करता है!

    संबंधित मुद्दे

     संबंधित मुद्दे