यदि यह मौजूद नहीं है, तो क्या scp एक निर्देशिका बना सकता है?


88

मैं scpफ़ाइलों को अपलोड करने के लिए उपयोग करना चाहता हूं लेकिन कभी-कभी लक्ष्य निर्देशिका मौजूद नहीं हो सकती है।

क्या फ़ोल्डर को स्वचालित रूप से बनाना संभव है? यदि हां, तो कैसे? यदि नहीं, तो मैं किस वैकल्पिक तरीके की कोशिश कर सकता हूं?

जवाबों:


71

यह कई चीजों में से एक है जो rsyncकर सकता है।

यदि आप rsyncपिछले कई वर्षों में जारी किए गए संस्करण का उपयोग कर रहे हैं , तो synt इसका मूल कमांड सिंटैक्स इसके समान है scp: of

$ rsync -r local-dir remote-machine:path

यह दूरस्थ मशीन पर कॉपी local-sourceऔर इसकी सामग्री को बनाएगा $HOME/path/local-dir, जो भी निर्देशिकाओं की आवश्यकता होगी

rsyncयहां कुछ प्रतिबंध हैं जो प्रभावित कर सकते हैं कि क्या यह आपकी विशेष स्थिति में काम करेगा। उदाहरण के लिए, यह गायब दूरस्थ निर्देशिकाओं के कई स्तरों का निर्माण नहीं करेगा; यह रिमोट पर केवल एक लापता स्तर तक का निर्माण करेगा। आप आसानी से इस rsyncतरह से कुछ के साथ आदेश पूर्ववर्ती द्वारा प्राप्त कर सकते हैं :

$ ssh remote-host 'mkdir -p foo/bar/qux'

$HOME/foo/bar/quxअगर यह अस्तित्व में नहीं है तो यह पेड़ पैदा करेगा । यदि यह पहले से मौजूद है तो यह शिकायत नहीं करेगा या कुछ और बुरा नहीं करेगा ।

rsyncकभी-कभी अन्य आश्चर्यजनक व्यवहार होते हैं। असल में, आप इसे यह पता लगाने के लिए कह रहे हैं कि आपको नकल करने का क्या मतलब है, और इसके अनुमान आपकी मान्यताओं से मेल नहीं खा सकते हैं। यह कोशिश करो और देखो। यदि यह अपेक्षा के अनुरूप व्यवहार नहीं करता है और आप यह नहीं देख सकते हैं कि क्यों, अपने स्थानीय और दूरस्थ निर्देशिका सेटअप के बारे में अधिक विवरण पोस्ट करें, और आपके द्वारा कोशिश की गई कमांड दें।


फ़ुटनोट्स :

  1. इससे पहले कि rsync2.6.0 (1 जनवरी 2004), यह आवश्यक -e sshहै कि यह की तरह व्यवहार करने के लिए झंडा scpक्योंकि यह अप्रचलित करने के लिए चूक RSH प्रोटोकॉल

  2. scpऔर rsyncकुछ झंडे साझा करें, लेकिन केवल ओवरलैप का एक सा हिस्सा है।

  3. का उपयोग करते समय SSHट्रांसफर प्रोटोकॉल के रूप में, rsyncएक ही चूक उपयोग करता है। इसलिए, ठीक उसी तरह scp, यह मान लिया जाएगा कि एक उपयोगकर्ता है जिसका नाम डिफ़ॉल्ट रूप से रिमोट मशीन पर आपके स्थानीय उपयोगकर्ता के समान है।


मैं मैक OSX का उपयोग कर रहा हूं, क्या मुझे स्थानीय और दूरस्थ दोनों तरफ rsync स्थापित करने की आवश्यकता है?
एजीमेप्लेयर

खोज rsyncके प्रलेखन पृष्ठ को खोजा नहीं गया कि लॉगिन करने के लिए ssh-key का उपयोग कैसे करें। मैं लॉगिन करने के लिए उपयोगकर्ता नाम / पासवर्ड का उपयोग नहीं करना चाहता
AGamePlayer

@AwQiruiGuo: मैक ओएस एक्स जहाजों के साथ rsync। और हाँ, आपको rsyncदूरस्थ पक्ष की आवश्यकता है, वह भी, जैसे की साथ scp। SSH कुंजी के रूप में, rsyncवास्तव में डिफ़ॉल्ट के साथ SSH का उपयोग कर रहा है -e ssh, इसलिए यदि आपके पास उपयोग के लिए कुंजी सेट है scp, तो वे भी काम rsyncकरेंगे।
वॉरेन यंग

1
@WarrenYoung -rको कोई फर्क नहीं पड़ता। यदि आप किसी निर्देशिका की प्रतिलिपि बना रहे हैं और यदि लक्ष्य मूल निर्देशिका मौजूद है, तो केवल आपके द्वारा वर्णित परिदृश्य ही काम करता है। इसलिए, rsync foo/ u@h:~/लक्ष्य निर्देशिका बनाएंगे, fooलेकिन लक्ष्य निर्देशिका rsync foo/ u@h:~/bar/नहीं बनाएंगे barbar/fooअगर bar/अस्तित्व में है तो वही पैदा करेगा । किसी भी मामले में, ओपी फाइलों को अपलोड कर रहा है और यहां तक ​​कि उन मामलों में भी जहां यह काम करता है, यह केवल संपूर्ण निर्देशिकाओं के लिए काम करता है।
terdon

1
हां, मैं इसके साथ भी खेलता रहा हूं। ऐसा लगता है कि फ़ाइल नाम निर्दिष्ट करना भी इसे विफल बनाता है। तो rsync file host:/foo/fileविफल रहता है अगर foo/मौजूद नहीं है, लेकिन rsync file host:/foo/निर्देशिका और स्थानों fileको बनाता है। अजीब। वैसे भी, आप काफी सही हैं और मूल परिदृश्य काम करता है, मैं अपने पतन को वापस ले लूंगा।
terdon

35

यदि आप फ़ाइलों के एक समूह की नकल कर रहे हैं, तो वास्तव में नहीं। यदि आप किसी निर्देशिका और उसके नीचे की सभी सामग्री को कॉपी कर रहे हैं, तो हाँ। इस आदेश को देखते हुए:

$ scp -pr /source/directory user@host:the/target/directory

अगर directoryमें मौजूद नहीं है ~/the/targetपर host, यह बनाया जाएगा। यदि, हालांकि, ~the/targetमौजूद नहीं है, तो आपके पास संभवतः मुद्दे होंगे - मुझे इस मामले के सटीक परिणाम याद नहीं हैं, लेकिन scpअसफल होने के लिए तैयार रहें ।


1
scp: /home/madmike/test_bin: No such file or directoryजैसे ही टारगेट डायरेक्टरी गायब होती है यह मेरे सेटअप पर टूट जाता है। क्लाइंट पर साइबरविन और सर्वर पर आरएचईएल 6.9 का उपयोग करना। आपका सेटअप क्या है?
15

16

जहाँ तक मुझे पता है, scpखुद ऐसा नहीं कर सकते, नहीं। हालाँकि, आप बस sshलक्ष्य मशीन के लिए, निर्देशिका बना सकते हैं और फिर कॉपी कर सकते हैं। कुछ इस तरह:

ssh user@host "mkdir -p /target/path/" &&
    scp /path/to/source user@host:/target/path/

ध्यान दें कि यदि आप संपूर्ण निर्देशिकाओं की प्रतिलिपि बना रहे हैं, तो उपरोक्त की आवश्यकता नहीं है। उदाहरण के लिए, निर्देशिका ~/fooको दूरस्थ होस्ट में कॉपी करने के लिए, आप -r(पुनरावर्ती) ध्वज का उपयोग कर सकते हैं :

scp ~/foo/ user@host:~/

जो ~/fooदूरस्थ होस्ट पर लक्ष्य निर्देशिका बनाएगा । हालाँकि, यह मूल निर्देशिका नहीं बना सकता। scp ~/foo user@host:~/bar/fooजब तक लक्ष्य निर्देशिका barमौजूद नहीं होगी, विफल रहेगी । किसी भी मामले में, -rयदि आप व्यक्तिगत फ़ाइलों की प्रतिलिपि बना रहे हैं , तो ध्वज एक लक्ष्य निर्देशिका बनाने में मदद नहीं करेगा।


3

हाँ तुम कर सकते हो। Scp के मैन पेज के अनुसार:

आदमी scp

.....

-r पुनरावर्ती पूरी निर्देशिका की प्रतिलिपि बनाएँ। ध्यान दें कि एसपीपी ट्री ट्रैवर्सल में सामने आए सिम्बल फॉलिकल लिंक का अनुसरण करता है।

....


7
यह लक्ष्य मूल निर्देशिका नहीं बनाएगा। यह एक निर्देशिका को मौजूदा स्थान पर कॉपी कर सकता है। तो, अगर रिमोट मौजूद है तो scp -r foo/ u@h:~/barबनाएगा लेकिन अगर यह नहीं है तो फेल हो जाएगा। bar/foobar/
terdon

1
यह विफल नहीं होगा। यह fooनई निर्देशिका के लिए सामग्री की प्रतिलिपि बनाएगा /bar। बेशक नाम बदल दिया गया है जो ओपी नहीं चाहेगा। यदि आप चाहते हैं कि गंतव्य मशीन में बनाई गई एक नई पेड़ संरचना है scpतो वह काम नहीं करेगा, यदि आप चाहते हैं कि पेड़ में एक निश्चित शाखा से एक पेड़ की संरचना को दोहराया जाए तो वह संरचना बनाई जाती है।
योइमोसो

6
हां, लेकिन यह केवल तभी काम करता है जब आप निर्देशिकाओं की नकल कर रहे हों , फाइलों की नहीं। scp -r file host:~/bar/नहीं बनाएंगे bar/
terdon

3

मैं btrfsस्नैपशॉट को स्थानांतरित करने से पहले निम्न फ़ंक्शन का उपयोग करता हूं ssh:

check_remote_dir() {
        printf "\ntesting remote directory: '$1' "

        if ssh -p $PORT $ROOT@$REMOTE "[ ! -d $1 ]"; then
                printf "\nCreating: $1 on $ROOT@$REMOTE\n"
                ssh -p $PORT $ROOT@$REMOTE "mkdir -p $1"
        else
                printf "[OK]\n"
        fi
}

बस अपनी स्क्रिप्ट में फ़ंक्शन को कॉल करें:

check_remote_dir /my/remote/path


मैं एक ही काम बहुत ज्यादा करता हूं, लेकिन मुझे पासवर्ड को सुरक्षा कारणों से टाइप करना होगा, इसलिए मैं इसे कम से कम दो बार टाइप करना चाहता हूं ...
स्टीफन रीच

0

आप mkdir कमांड के साथ कमांड को चेन कर सकते हैं और फिर आपके द्वारा बनाए गए फोल्डर का संदर्भ ले सकते हैं:

mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/

3
(१) प्रश्न कहता है "स्वचालित रूप से"। यह स्वचालित प्रतीत नहीं होता है। (२) यह टेर्डन के उत्तर पर केवल एक तुच्छ परिवर्तन प्रतीत होता है ।
जी-मैन

0

जब केवल एसएसपी उपलब्ध नहीं है (rssh द्वारा) के साथ केवल स्कैप या sftp तक ही सीमित है, तो खाली निर्देशिका ट्री को rsync के साथ कॉपी करके और फिर फ़ाइलों को कॉपी करके निर्देशिका बनाना संभव है।

जब मैंने ssh-copy-id काम नहीं करता है और .ssh निर्देशिका मौजूद नहीं है, तो मैंने दूरस्थ मेजबान के लिए सार्वजनिक ssh कुंजी लगाई है:

rsync -e 'ssh -p22' -av -f"+ */" -f"- *" ~/.ssh backup@1.2.3.4:~/
scp -P22 ~/.ssh/id_rsa.pub backup@1.2.3.4:~/.ssh/authorized_keys

इस कमांड को एक rsync में जोड़ना संभव है, यदि बीच में एक और फिल्टर शामिल है, यदि लक्ष्य फ़ाइल नाम समान है।

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