एक फाइल को कॉपी कैसे करें जो अभी भी ssh के ऊपर लिखी जा रही है?


20

यहाँ स्थिति है:

  1. मैं क्लाइंट A से sftp का उपयोग करके सर्वर से एक बड़ी फ़ाइल अपलोड कर रहा हूं।
  2. मुझे इस फाइल को सर्वर से क्लाइंट B ओवर ssh में भी डाउनलोड करना होगा।

मैं क्या करना चाहूंगा जब सर्वर अभी भी क्लाइंट ए से अपलोड हो रहा है तो सर्वर से क्लाइंट बी में स्थानांतरण शुरू करें।

इसे प्राप्त करने के लिए सबसे अच्छा तरीका / उपकरण क्या है?

अद्यतन :

अब तक के जवाब दिलचस्प हैं - मैं उन सभी को पढ़ना और परीक्षण करना सुनिश्चित करूँगा। ऐसे जवाब के लिए बोनस अंक जो ग्राहक ए फ़ाइल को अपलोड करने के तरीके को नियंत्रित करने पर निर्भर नहीं करते हैं। (अर्थात, ग्राहक A से केवल एक चीज हम जानते हैं कि फ़ाइल एक ज्ञात फ़ाइल नाम के लिए लिखी जा रही है।)


ऊ, अच्छा सवाल। यह निश्चित रूप से संभव है, लेकिन मैं कुछ भी के बारे में पता नहीं कर रहा हूँ कि औजार यह
माइकल Mrozek

जवाबों:


10

SFTP का उपयोग करने के बजाय एक फ़ाइल के लिए आप ssh का उपयोग करके catया pvभेजने वाले पक्ष पर फ़ाइल को पाइप कर सकते हैं और teeमध्य सर्वर का उपयोग करके दोनों डेटा को एक फ़ाइल में भेज सकते हैं और दूसरे ssh लिंक पर एक प्रतिलिपि भेज सकते हैं जिसके दूसरे पक्ष को लिंक करते हैं बस एक फ़ाइल के लिए डेटा लिखता है। सटीक वूडू की आवश्यकता है मैं पाठक के लिए एक अभ्यास के रूप में छोड़ूंगा, क्योंकि मुझे अभी खेलने के लिए समय नहीं मिला है (क्षमा करें)। यह विधि केवल तभी काम करेगी जब दूसरा गंतव्य SSH के माध्यम से सार्वजनिक रूप से सुलभ हो, जो मामला नहीं हो सकता है क्योंकि आप इसे ग्राहक मशीन के रूप में वर्णित करते हैं।

एक और दृष्टिकोण, जो कम "रन और प्रतीक्षा" है, लेकिन अन्यथा आसान हो सकता है, यह rsyncसर्वर और क्लाइंट बी के बीच उपयोग करने के लिए है । पहली बार जब आप इसे चलाते हैं तो यह डेटा की एक आंशिक प्रतिलिपि प्राप्त कर सकता है, लेकिन आप बस फिर से चला सकते हैं यह बाद में अधिक डेटा प्राप्त करने के लिए (क्लाइंट1-> सर्वर हस्तांतरण पूरा होने के बाद एक अंतिम रन के साथ)। यह केवल तभी काम करेगा जब सर्वर SFTP ट्रांसफर के दौरान डेटा को सीधे फ़ाइल-नाम में डाल देता है (कभी-कभी आप डेटा को एक अस्थायी फ़ाइल में जाते हुए देखेंगे, जिसे फ़ाइल पूरी तरह से स्थानांतरित होने के बाद नाम बदल दिया जाता है - इसे बनाने के लिए किया जाता है फ़ाइल अधिक परमाणु अद्यतन लेकिन rsync विचार बेकार होगा)। यदि आप उपयोग करते हैं तो आप sc1 के बजाय C1-> S हस्तांतरण के लिए rsync का उपयोग कर सकते हैं--inplaceसमस्या से बचने के विकल्प ऊपर उल्लेख किया है) - rsync का उपयोग भी आप सुरक्षा पुनः भेजें सब कुछ करने की जरूरत के खिलाफ अगर C1-> सर्वर कनेक्शन अनुभवों एक बड़ी स्थानांतरण के दौरान समस्याओं (मैं का उपयोग करते हैं देना होगा rsync --inplace -a --progress <source> <dest>जब rsync उपलब्ध है SCP / SFTP के बजाय, के लिए यह "स्थानांतरण फिर से शुरू" व्यवहार)।

उपर्युक्त का सारांश प्रस्तुत करने के लिए:

rsync --inplace -a --progress <source> user@server:/<destination_file_or_folder>

client1 पर फिर चल रहा है

rsync --inplace -a --progress user@server:/<destination_file_or_folder> <destination_on_cli2>

क्लाइंट 2 पर बार-बार पहला ट्रांसफर पूरा होने तक (फिर एक बार और चलने के बाद सुनिश्चित करें कि आपको सब कुछ मिल गया है)। rsyncकेवल पूर्ण न्यूनतम स्थानांतरित करने पर बहुत अच्छा होता है, हर बार पूरे लॉट को स्थानांतरित करने के बजाय किसी स्थान को अपडेट करने की आवश्यकता होती है। व्यामोह के लिए आप --checksumrsync कमांड के विकल्प को जोड़ना चाह सकते हैं (जो बड़ी फ़ाइलों के लिए अधिक CPU समय लेगा, लेकिन जब तक इसकी आवश्यकता नहीं होगी तब तक अधिक डेटा स्थानांतरित नहीं किया जाएगा) और गति के लिए --compressविकल्प मदद करेगा यदि डेटा आप स्थानांतरित कर रहे हैं पहले से ही एक संकुचित प्रारूप में नहीं है।


5

मैं इसे फिलहाल नहीं आज़मा सकता, इसलिए यह अच्छी तरह से विफल हो सकता है: मेरा विचार यह है: निर्देशिका को माउंट करें जहां फ़ाइल क्लाइंट बी में आ रही है, जैसे क्लाइंट बी के फाइल सिस्टम में sshfs से / mnt / सर्वर। फिर

tail -c +0 -f /mnt/server/thefileinquestion > ~/finalfile

/ usr / bin / tail: पढ़ने के लिए `+0 'नहीं खोल सकता: ऐसी कोई फ़ाइल या निर्देशिका नहीं - coreutils 7.4
maxschlepzig

क्षमा करें, एक -सी गायब थी। मैंने इसे ऊपर के उत्तर में तय किया।
fschmitt

ठीक है, एक समस्या जो मुझे इसके साथ दिखाई देती है वह यह है कि कमांड समाप्त नहीं होती है (-f -> फ़ॉलो ...)। किसी को सिगिट या ऐसा कुछ जारी करना होता है, जब आप सुनिश्चित हों कि एफिलिनक्वेस्ट पूरी तरह से लिखा गया है। Btw, आपके पूंछ संस्करण और एफएस पर निर्भर करता है, पूंछ आंतरिक रूप से फ़ाइल (जैसे हर सेकंड) का मतदान करती है।
मैक्सक्लेज़िग ऑक्ट

मेरे पास एक मामला था: मेरे HDD पर एक वीडियो फ़ाइल रिकॉर्ड करना, लेकिन मैं बाहरी USB फ्लैश मेमोरी में कॉपी करना चाहता था ताकि रिकॉर्डिंग बंद होते ही मैं इसे एक व्यक्ति को सौंप सकूं। मैं कई कोशिश की rsync --appendऔर फिर के साथ जाँच की, md5sumलेकिन फ़ाइलों का मिलान नहीं किया। tail -c +0मेरे लिए काम किया। मैं pv -pteraपूंछ की प्रगति की निगरानी भी करता था , यह मुझे यह देखने की अनुमति देता है कि क्या यह काम कर रहा है। मैंने अभी तक यह सत्यापित करने के लिए md5s की जाँच करने के लिए समाप्त नहीं किया कि यह काम किया है, लेकिन बहुत अच्छा लग रहा है।
अन्डा

@unfa कृपया नीचे एक उत्तर (यानी एक टिप्पणी नहीं) जोड़कर अपनी टिप्पणी अपडेट करें।
Xofo

1

मुझे लगता है कि यह काम करना चाहिए:

user@clientA:~$ cat file | ssh server "cat > dest"

और फिर

user@clientB:~$ ssh server "tail +0 -f dest" > file

यदि आप अपने थ्रूपुट को देखना चाहते हैं, तो pv कमांड जोड़ें।


क्या आपका मतलब लिखना था tail -c +0?
मिठाई

1

आप इसके लिए एक फीफो का उपयोग कर सकते हैं। केवल दो xterms को शामिल किए बिना पहले सादगी के लिए:

एक्सटरम ए में:

$ mkfifo fif
$ cat test.tar.gz | tee copy.tar.gz > fif

Xterm B पर:

$ cat fif > dest.tar.gz
$ cmp test.tar.gz dest.tar.gz
$ echo $?
0
$ cmp test.tar.gz copy.tar.gz
$ echo $?
0

Ssh के साथ यह इन पंक्तियों के साथ कुछ होना चाहिए - शायद आपको ssh (a -e none) में एस्केप-कैरेक्टर को निष्क्रिय करना होगा:

ग्राहक A:

 $ ssh server mkfifo fif
 $ cat src.tar.gz | ssh "tee fif > copy.tar.gz"

ग्राहक B:

 $ ssh server cat fif > dest.tar.gz

1

मेरे पास एक स्थिति है जिसे मूल पोस्टर की तरह एक समाधान की आवश्यकता है। मैं अपने कंप्यूटर पर एक स्थान पर एक हॉकी खेल रिकॉर्ड कर रहा हूं और मैं इसे दूसरे स्थान पर अपने टीवी पर देखना चाहता हूं। दो स्थानों के बीच की लिंक कॉपी को 1.3Mb / s पर जाने की अनुमति देती है और रिकॉर्डिंग वीडियो लगभग 1.5Mb / s है। इसलिए, मैं फ़ाइल की प्रतिलिपि बनाना चाहता हूं क्योंकि यह रिकॉर्डिंग शुरू करता है। इस तरह मेरा 3 घंटे का खेल लगभग 3.5 घंटे में कॉपी हो जाएगा। इसलिए, मैं इसे कॉपी करता हूं क्योंकि यह रिकॉर्ड करना शुरू कर देता है और मैं इसे शुरू होने के 30 मिनट बाद देखना शुरू कर सकता हूं। फिर मैं इसे बिना किसी रुकावट के, लगभग वास्तविक समय में देख सकता हूं। यही है, जब तक मैं इसे अपनी नई फाइल लिखने के रूप में कॉपी करने के लिए प्राप्त कर सकता हूं। Rsync और scp जैसे टूल के साथ समस्या यह है कि वे फ़ाइल के आकार को देखते हैं जब आप कॉपी शुरू करते हैं और एक बार डेटा की उस मात्रा को कॉपी कर लेते हैं, तो यह क्विट हो जाता है; भले ही उस प्रतिलिपि के दौरान फ़ाइल दोगुने से अधिक हो गई हो। और, अगर, मैं बस इसे बंद करने के बाद इसे कॉपी करने के लिए एक लूप में rsync का उपयोग कर रहा हूं, जब अगला rsync समाप्त हो जाता है, तो यह लक्ष्य फ़ाइल को फिर से लिखता है और जो मेरे वीडियो प्लेयर को मारता है और मुझे इसे देखना फिर से शुरू करना होगा और जहाँ भी मैं आगे बढ़ूंगा कार्यक्रम में जब इसे अचानक मार दिया। मैं एक बेहतर समाधान चाहता था और मैं एक को खोजने में सक्षम नहीं था, इसलिए मैंने इसके बजाय इसे एक साथ जोड़ दिया:

dd if=2031_20160514030000.mpg |
pv --size 4653819304 |
ssh -C -c arcfour,blowfish-cbc -p 5555 myserver.com 'dd of=/media/TV/2031_20160514030000.mpg'

तो यह क्या करता है?

सबसे पहले, मैं फ़ाइल को कॉपी करने के लिए dd का उपयोग करता हूं क्योंकि यह बढ़ता है। चूंकि फ़ाइल dd से अधिक तेज़ी से बढ़ती है, इसलिए इसे नेटवर्क पर भेज सकते हैं, dd फ़ाइल के अंत तक कभी नहीं पकड़ता है। इसके बाद, मैं इसे "पाइप दर्शक (pv)" पर पाइप करता हूं और मैं इसे इस बात का अनुमान देता हूं कि ये फाइल आमतौर पर कितनी बड़ी फाइल पर आधारित होने वाली है। यह आवश्यक नहीं है, लेकिन मुझे प्रगति मीटर देखना पसंद है। फिर, मैं अपने ssh कनेक्शन के लिए स्ट्रीम को पाइप करता हूं। Ssh कनेक्शन -Cकम्प्रेशन के लिए उपयोग करता है (नेटवर्क बैंडविड्थ को कम करने और इसे तेज करने की कोशिश करता है), -c arcfour,blowfish-cbcकम से कम महंगे एन्क्रिप्शन के लिए (फिर से चीजों को थोड़ा तेज करने के लिए),-pमेरे फ़ायरवॉल पोर्ट के लिए मैं गंतव्य पर उपयोग कर रहा हूं, और ssh अंततः फ़ाइल को पुनः प्राप्त करने के लिए लक्ष्य पर dd कमांड चलाता है क्योंकि यह इसे प्राप्त करता है। मुझे यह कहते हुए खुशी हो रही है, यह समाधान बहुत अच्छा काम करता है। मैं हॉकी खेल देख सकता हूं, जबकि फाइल केवल थोड़ी देरी से बनाई और कॉपी की जा रही है।


0

मुझे यकीन नहीं है कि पूंछ-एफ विधि काम करती है (हालांकि यह शायद अगर फ़ाइल पाठ है)। कारण यह है कि मुझे पता नहीं है कि कैसे पूंछ-एफ, और एसएफटीपी हस्तांतरण और मेटा जानकारी पर भरोसा करते हैं।

यदि sftp मेटा सूचना को पहले स्थानांतरित करता है और टेल -f मेटा जानकारी पर निर्भर करता है, ताकि यह बताया जा सके कि कोई और फ़ाइल नहीं है, तो ईओएफ या नल के साथ पूंछ का अंत खराब हो सकता है।

यदि आप अपलोड के मार्ग की परवाह नहीं करते हैं अर्थात कंप्यूटर 1 कंप्यूटर 3 पर अपलोड करता है तो कंप्यूटर 3 पर अपलोड करता है, तो आप sftp के बजाय शीर्ष उपयोग बिटोरेंट की कोशिश कर सकते हैं। ऐसा लगता है कि यह वही है जिसके लिए डिजाइन किया गया था।


0

आप शुरुआत से ही फ़ाइल को पढ़ने का प्रयास कर सकते हैं लेकिन आपको यह सुनिश्चित करने की आवश्यकता है कि आप इसे कम से कम समान गति के रूप में लिख सकें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.