मैं scp
फ़ाइलों को अपलोड करने के लिए उपयोग करना चाहता हूं लेकिन कभी-कभी लक्ष्य निर्देशिका मौजूद नहीं हो सकती है।
क्या फ़ोल्डर को स्वचालित रूप से बनाना संभव है? यदि हां, तो कैसे? यदि नहीं, तो मैं किस वैकल्पिक तरीके की कोशिश कर सकता हूं?
मैं scp
फ़ाइलों को अपलोड करने के लिए उपयोग करना चाहता हूं लेकिन कभी-कभी लक्ष्य निर्देशिका मौजूद नहीं हो सकती है।
क्या फ़ोल्डर को स्वचालित रूप से बनाना संभव है? यदि हां, तो कैसे? यदि नहीं, तो मैं किस वैकल्पिक तरीके की कोशिश कर सकता हूं?
जवाबों:
यह कई चीजों में से एक है जो 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
कभी-कभी अन्य आश्चर्यजनक व्यवहार होते हैं। असल में, आप इसे यह पता लगाने के लिए कह रहे हैं कि आपको नकल करने का क्या मतलब है, और इसके अनुमान आपकी मान्यताओं से मेल नहीं खा सकते हैं। यह कोशिश करो और देखो। यदि यह अपेक्षा के अनुरूप व्यवहार नहीं करता है और आप यह नहीं देख सकते हैं कि क्यों, अपने स्थानीय और दूरस्थ निर्देशिका सेटअप के बारे में अधिक विवरण पोस्ट करें, और आपके द्वारा कोशिश की गई कमांड दें।
फ़ुटनोट्स :
इससे पहले कि rsync
2.6.0 (1 जनवरी 2004), यह आवश्यक -e ssh
है कि यह की तरह व्यवहार करने के लिए झंडा scp
क्योंकि यह अप्रचलित करने के लिए चूक RSH प्रोटोकॉल ।
scp
और rsync
कुछ झंडे साझा करें, लेकिन केवल ओवरलैप का एक सा हिस्सा है।
का उपयोग करते समय SSH
ट्रांसफर प्रोटोकॉल के रूप में, rsync
एक ही चूक उपयोग करता है। इसलिए, ठीक उसी तरह scp
, यह मान लिया जाएगा कि एक उपयोगकर्ता है जिसका नाम डिफ़ॉल्ट रूप से रिमोट मशीन पर आपके स्थानीय उपयोगकर्ता के समान है।
rsync
के प्रलेखन पृष्ठ को खोजा नहीं गया कि लॉगिन करने के लिए ssh-key का उपयोग कैसे करें। मैं लॉगिन करने के लिए उपयोगकर्ता नाम / पासवर्ड का उपयोग नहीं करना चाहता
rsync
। और हाँ, आपको rsync
दूरस्थ पक्ष की आवश्यकता है, वह भी, जैसे की साथ scp
। SSH कुंजी के रूप में, rsync
वास्तव में डिफ़ॉल्ट के साथ SSH का उपयोग कर रहा है -e ssh
, इसलिए यदि आपके पास उपयोग के लिए कुंजी सेट है scp
, तो वे भी काम rsync
करेंगे।
-r
को कोई फर्क नहीं पड़ता। यदि आप किसी निर्देशिका की प्रतिलिपि बना रहे हैं और यदि लक्ष्य मूल निर्देशिका मौजूद है, तो केवल आपके द्वारा वर्णित परिदृश्य ही काम करता है। इसलिए, rsync foo/ u@h:~/
लक्ष्य निर्देशिका बनाएंगे, foo
लेकिन लक्ष्य निर्देशिका rsync foo/ u@h:~/bar/
नहीं बनाएंगे bar
। bar/foo
अगर bar/
अस्तित्व में है तो वही पैदा करेगा । किसी भी मामले में, ओपी फाइलों को अपलोड कर रहा है और यहां तक कि उन मामलों में भी जहां यह काम करता है, यह केवल संपूर्ण निर्देशिकाओं के लिए काम करता है।
rsync file host:/foo/file
विफल रहता है अगर foo/
मौजूद नहीं है, लेकिन rsync file host:/foo/
निर्देशिका और स्थानों file
को बनाता है। अजीब। वैसे भी, आप काफी सही हैं और मूल परिदृश्य काम करता है, मैं अपने पतन को वापस ले लूंगा।
यदि आप फ़ाइलों के एक समूह की नकल कर रहे हैं, तो वास्तव में नहीं। यदि आप किसी निर्देशिका और उसके नीचे की सभी सामग्री को कॉपी कर रहे हैं, तो हाँ। इस आदेश को देखते हुए:
$ scp -pr /source/directory user@host:the/target/directory
अगर directory
में मौजूद नहीं है ~/the/target
पर host
, यह बनाया जाएगा। यदि, हालांकि, ~the/target
मौजूद नहीं है, तो आपके पास संभवतः मुद्दे होंगे - मुझे इस मामले के सटीक परिणाम याद नहीं हैं, लेकिन scp
असफल होने के लिए तैयार रहें ।
scp: /home/madmike/test_bin: No such file or directory
जैसे ही टारगेट डायरेक्टरी गायब होती है यह मेरे सेटअप पर टूट जाता है। क्लाइंट पर साइबरविन और सर्वर पर आरएचईएल 6.9 का उपयोग करना। आपका सेटअप क्या है?
जहाँ तक मुझे पता है, 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
यदि आप व्यक्तिगत फ़ाइलों की प्रतिलिपि बना रहे हैं , तो ध्वज एक लक्ष्य निर्देशिका बनाने में मदद नहीं करेगा।
हाँ तुम कर सकते हो। Scp के मैन पेज के अनुसार:
आदमी scp
.....
-r पुनरावर्ती पूरी निर्देशिका की प्रतिलिपि बनाएँ। ध्यान दें कि एसपीपी ट्री ट्रैवर्सल में सामने आए सिम्बल फॉलिकल लिंक का अनुसरण करता है।
....
scp -r foo/ u@h:~/bar
बनाएगा लेकिन अगर यह नहीं है तो फेल हो जाएगा। bar/foo
bar/
foo
नई निर्देशिका के लिए सामग्री की प्रतिलिपि बनाएगा /bar
। बेशक नाम बदल दिया गया है जो ओपी नहीं चाहेगा। यदि आप चाहते हैं कि गंतव्य मशीन में बनाई गई एक नई पेड़ संरचना है scp
तो वह काम नहीं करेगा, यदि आप चाहते हैं कि पेड़ में एक निश्चित शाखा से एक पेड़ की संरचना को दोहराया जाए तो वह संरचना बनाई जाती है।
scp -r file host:~/bar/
नहीं बनाएंगे bar/
।
मैं 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
आप mkdir कमांड के साथ कमांड को चेन कर सकते हैं और फिर आपके द्वारा बनाए गए फोल्डर का संदर्भ ले सकते हैं:
mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/
जब केवल एसएसपी उपलब्ध नहीं है (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 में जोड़ना संभव है, यदि बीच में एक और फिल्टर शामिल है, यदि लक्ष्य फ़ाइल नाम समान है।