Sftp के साथ निर्देशिकाओं को अपलोड करना?


97

मुझे sftp द्वारा निर्देशिकाओं को अपलोड करने में कुछ परेशानी हो रही है (जिसमें अन्य निर्देशिकाएं कुछ स्तर गहरी हैं)। मुझे लगता है कि मैं इस के आसपास gzipping द्वारा काम कर सकता है, लेकिन मुझे नहीं लगता कि यह क्यों आवश्यक है।

वैसे भी, मैं कोशिश करता हूं

sftp> put bin/
Uploading bin/ to /home/earlz/blah/bin
bin/ is not a regular file
sftp> put -r bin/
Uploading bin/ to /home/earlz/blah/bin
Couldn't canonicalise: No such file or directory
Unable to canonicalise path "/home/earlz/blah/bin"

मुझे लगता है कि अंतिम त्रुटि संदेश पूरी तरह से बेवकूफ है। तो निर्देशिका मौजूद नहीं है? निर्देशिका क्यों नहीं बना?

वहाँ वैसे भी sftp के साथ इस मुद्दे के आसपास है, या मैं बस scp का उपयोग करना चाहिए?

जवाबों:


68

सही : मैंने शुरू में गलत दावा किया कि ओपनएसएसएच ने समर्थन नहीं किया put -r। यह करता है, लेकिन यह बहुत अजीब तरीके से करता है। ऐसा लगता है कि गंतव्य निर्देशिका पहले से मौजूद है, स्रोत निर्देशिका के समान नाम के साथ।

sftp> put -r source
 Uploading source/ to /home/myself/source
 Couldn't canonicalize: No such file or directory
 etc.
sftp> mkdir source
sftp> put -r source
 Uploading source/ to /home/myself/source
 Entering source/
 source/file1
 source/file2

क्या विशेष रूप से अजीब है कि यह तब भी लागू होता है जब आप गंतव्य के लिए एक अलग नाम देते हैं:

sftp> put -r source dest
 Uploading source/ to /home/myself/dest
 Couldn't canonicalize: ...
sftp> mkdir dest
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Couldn't canonicalize: ...
sftp> mkdir dest/source
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Entering source/
 source/file1
 source/file2

एक बेहतर कार्यान्वित पुनरावर्ती के लिए put, आप psftpइसके बजाय PuTTY कमांड लाइन टूल का उपयोग कर सकते हैं । यह putty-toolsडेबियन (और सबसे अधिक संभावना उबंटू) के तहत पैकेज में है ।

यदि आप GUI का उपयोग करना चाहते हैं, तो वैकल्पिक रूप से, Filezilla वही करेगा जो आप चाहते हैं।


FYI करें: ओपनएसएसएच 5.4 से sftpअनुमति देता put -rहै
टीनो

3
धन्यवाद - मैंने अपना उत्तर सही कर लिया है। यह समय के बारे में है, है ना? ; -प
जेंडर

128

मुझे नहीं पता कि sftp ऐसा क्यों करता है लेकिन आप केवल पुनरावर्ती प्रतिलिपि बना सकते हैं यदि गंतव्य निर्देशिका पहले से मौजूद है। तो यह करो ...

sftp> mkdir bin
sftp> put -r bin

1
-rओपनएसएसएच 5.4 या उच्चतर की जरूरत है
टीनो

22

आपको rsyncइसके बजाय उपयोग करने में रुचि हो सकती है । उसके लिए कमान होगी

 rsync --delete --rsh=ssh -av bin/ remote-ip-or-fqdn:/home/earlz/blah/bin/

यह सब कुछ कॉपी करेगा bin/और इसे रिमोट सर्वर पर रखेगा /home/earlz/blah/bin/। अतिरिक्त लाभ के रूप में, यह पहले यह देखने के लिए जांच करेगा कि क्या रिमोट साइड पर फ़ाइल बदल नहीं गई है, और यदि यह नहीं है, तो यह इसे फिर से नहीं भेजेगा। इसके अतिरिक्त, आप -z विकल्प जोड़ सकते हैं और यह आपके लिए इसे संपीड़ित करेगा।


Awsome! बहुत आसन!
पूछें

3
कृपया ध्यान दें कि sftpएक कमांड और एक प्रोटोकॉल है । -protocol का rsyncसमर्थन नहीं करता है sftp
टीनो

9

lcd: आपका स्थानीय फ़ोल्डर (सबफ़ोल्डर के साथ)

cd: आपका रिमोट फ़ोल्डर

put -r .


वास्तव में, मुझे लगता है कि यह सबसे सही उत्तर है ... मेरे पूरे फोल्डर को वहां डालने के उद्देश्य से
nopole

sftp ने शिकायत की जब मैंने स्थानीय पैरेंट फ़ोल्डर में cd'd किया और निर्देशिका को नाम से रखने का प्रयास किया। लेकिन cdजिस निर्देशिका को मैं अपलोड करना चाहता था, उसमें यह किया था। धन्यवाद!
करीमकोरन

8

क्या मुझे ज़िपिंग के बिना, लेकिन टार सहित कुछ हद तक जटिल जवाब देना चाहिए?

ये रहा:

tar -cf - ./bin | ssh target.org " ( cd /home/earlz/blah ; tar -xf - ) "

यह निर्देशिका को पैक करेगा। टार (-cf: = create file) के साथ .bin, फ़ाइल नाम - (कोई नहीं, stdout) और इसे ssh-command के माध्यम से target.org के लिए पाइप करें (जो कि एक IP भी हो सकता है) जहां कमांड उद्धरण में, प्रदर्शन किया गया है: सीडी से ब्लाह, और टार -xf (एक्सट्रैक्ट फाइल) - कोई नहीं, कोई नाम नहीं, बस स्टड।

यह ऐसा है जैसे आप घर पर पैकेज पैक करते हैं, उसे पोस्ट पर लाते हैं, फिर काम करने के लिए ड्राइव करते हैं, जहां आप पैकेज की अपेक्षा करते हैं और इसे खोलते हैं।

शायद वहाँ एक और अधिक सुंदर समाधान है जो बस sftp का उपयोग करता है।


एक पाइप्ड tarएक बहुत अच्छा समाधान है, हालांकि इसके लिए sshलॉगिन समर्थन की आवश्यकता है ( sftpशीर्ष पर एक अलग प्रोटोकॉल है ssh)। tar, दूसरों के विपरीत, डिफ़ॉल्ट रूप से , पुनरावर्ती चलता है, सभी विशेष फ़ाइलों (FIFO, ब्लॉक / चरित्र उपकरणों आदि) को स्थानांतरित करता है, स्रोत से लक्ष्य प्रणाली में UID / GID मैपिंग का अनुवाद करने की कोशिश करता है और एक पारंपरिक लघु कमांडलाइन है। (एक अपवाद हालांकि: "यूनिक्स डोमेन सॉकेट्स" स्थानांतरित नहीं किया गया है। लेकिन जिन्हें उन लोगों की आवश्यकता है?)
टीनो

मैं इस पद्धति का उपयोग करता हूं जब मुझे नोड्स के बीच संपीड़न की आवश्यकता होती है, तो आप pvलंबे स्थानान्तरण में गति को देखने के लिए उपकरण का उपयोग कर सकते हैं
फेलिप अल्केबार


1

आप rsync का उपयोग कर सकते हैं , जो कि scp और sftp के लिए एक बहुत ही शक्तिशाली विकल्प है, खासकर जब मशीन A से मशीन B तक की प्रतियों को अपडेट करते समय, क्योंकि यह उन फ़ाइलों को कॉपी नहीं करता है जिन्हें बदला नहीं गया है; यह मशीन B से उन फ़ाइलों को हटाने में भी सक्षम है जिन्हें मशीन A से हटा दिया गया है (केवल जब यह पाठ्यक्रम को बताया गया है)।

उदाहरण के लिए :

rsync -zrp /home/a/ user@remote.host.com:/home/b/  

-R विकल्प फ़ाइलों की पुनरावृत्ति करने के लिए है, -z स्थानांतरण के दौरान संपीड़न को सक्षम करता है, और -p प्रतिलिपि बनाते समय फ़ाइल अनुमतियों (फ़ाइल निर्माण, संपादन, आदि) को संरक्षित करता है, जो कि कुछ है जो कि AFAIK नहीं करता है। कई और विकल्प संभव हैं; हमेशा की तरह, मैन पेज पढ़ें।
करोलोस द्वारा मूल उत्तर


0

Ssh के साथ रिमोट सर्वर में लॉगिन करें, अपने बॉक्स से वापस कनेक्ट करने के लिए sftp का उपयोग करें, फिर get -rकमांड का उपयोग करके डायरेक्ट्री को रिमोट सर्वर में ट्रांसफर करें। प्राप्त आदेश आपको निर्देशिका को पहले से निर्मित किए बिना निर्देशिकाओं को पुन: स्थानांतरित करने की अनुमति देता है।

ssh remote ip
sftp local ip 
get -r whichever-dir

0

SFTP मामला:

मुझे उस संरचना को अपने ftp पर कॉपी करने की आवश्यकता थी:

mainfolder --- folder --- subfolder
                  |           |
              file1.txt   file2.txt

इससे मेरी समस्या हल हो गई:

cd ./mainfolder
mkdir folder
put -r /from/source/folder/* /mainfolder/folder/
cd ./folder
mkdir subfolder
put -r /from/source/folder/subfolder/* /mainfolder/folder/subfolder/

0

मैंने सिर्फ आर्क लिनक्स विकी से सीखा है कि sshfs का उपयोग करके sftp-share को माउंट करना संभव है। मैं chroot और जेल के साथ sftp-server चला रहा हूं और sshfs बहुत अच्छी तरह से काम करता है।

  1. माउंट: sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. अनमाउंट: fusermount -u <your/local/mount/directory>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.