होस्ट से वैग्रेंट गेस्ट तक एक फ़ाइल को कॉपी करने का सबसे आसान तरीका?


241

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

मैं पारंपरिक प्रबन्धकों (कठपुतली / रसोइये) के माध्यम से ऐसा नहीं करना चाहता, क्योंकि यह अक्सर एक-बंद होता है - मैं बस अपने वैग्रांटीफिल में कुछ जल्दी जोड़ना चाहता हूं।

मैं एक पूरी निर्देशिका साझा नहीं करना चाहता, संभवतः इसलिए कि मैं एक पूरी फ़ाइल को अतिथि पर पूरी निर्देशिका के बिना मौजूदा फ़ाइल को अधिलेखित करना चाहता हूं।

शेल प्रोविजनिंग स्क्रिप्ट लिखना और संभावित रूप से भागने से निपटना भी थोड़ा कठिन लगता है, जब मैं एक फाइल कॉपी करना चाहता हूं।

तो, होस्ट से अतिथि तक किसी एक फ़ाइल को कॉपी करने का सबसे आसान तरीका क्या है?


ध्यान दें कि स्वीकृत उत्तर वैग्रांट 1.x-- पर आधारित है, एक फाइल प्रोक्टर का उपयोग करना मानक वैग्रांट 2 दृष्टिकोण है , हालांकि /vagrant यहां बताए गए अनुसार माउंट बिंदु को बदलना भी एक अच्छा विकल्प हो सकता है
STW

3
@ जौले का जवाब वास्तव में एकल फ़ाइल की एक-एक कॉपी के सरल उपयोग के मामले में अधिक वोटों का गुणन करता है: vagrant upload /path/to/my/file...
dat

जवाबों:


107

फ़ाइल की प्रतिलिपि बनाने के लिए शेल प्रोफ़ाइटर का उपयोग करने के बजाय, आप एक वैग्रंट फ़ाइल प्रोफ़ाइज़र का उपयोग भी कर सकते हैं ।

प्रोविज़नर का नाम: "file"

फ़ाइल प्रावधान आपको होस्ट मशीन से अतिथि मशीन पर एक फ़ाइल अपलोड करने की अनुमति देता है।

Vagrant.configure("2") do |config|
  # ... other configuration

  config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig"
end

3
यह निश्चित रूप से Vagrant 2 में ऐसा करने का सबसे अच्छा तरीका है! हालाँकि, वैग्रैंट 2 उस समय उपलब्ध नहीं था जब मुझे ऐसा करने की आवश्यकता थी ... :)
लीक्सग्रीन

4
यह समाधान अच्छा लगता है, लेकिन मैं अनुमति त्रुटियों के कारण किसी भी फ़ाइल की प्रतिलिपि नहीं बना सकता।
ऑर्बेट्सचो

@orbatschow मुझे वही समस्या थी, लेकिन अगर मैंने इसे कॉपी नहीं किया तो/tmp
बेन

6
यह वह नहीं है जो ओपी ने पूछा था। सवाल यह था कि कभी-कभार फाइलें कैसे ट्रांसफर की जाती थीं ; प्रावधान चलाने के लिए overkill है।
13

253

चूंकि आप सबसे आसान तरीका पूछते हैं, इसलिए मेरा सुझाव है कि आप वेजेंट-एसपीपी का उपयोग करें । यह एक एसआरपी कमांड को योनि में जोड़ता है, इसलिए आप अपने वीएम को फाइलें कॉपी कर सकते हैं जैसे आप सामान्य रूप से एससीपी के साथ करते हैं।

इसके माध्यम से स्थापित करें:

vagrant plugin install vagrant-scp

इसका उपयोग ऐसे करें:

vagrant scp <some_local_file_or_dir> [vm_name]:<somewhere_on_the_vm>

1
यह मेरे लिए काम नहीं किया। मैंने प्लगइन स्थापित किया, लेकिन एक त्रुटि मिलती रही जिसने कहा कि "प्लगइन" आवारा-स्कैप "नहीं मिल सका। कृपया सुनिश्चित करें कि यह ठीक से स्थापित है vagrant plugin।"
रॉकरटन

6
हाय रॉड, वैग्रांट-स्कैप वैग्रांट 1.7+ के साथ काम करता है। आपके द्वारा खोले गए बग से, आप 1.4.3 चला रहे हैं। यदि आपको इस प्लगइन की आवश्यकता है, तो मुझे डर है कि आपको अपग्रेड करना होगा (जो जल्दी और दर्द रहित है)।
लुका इन्वरनिज़ी

1
मैंने इस कमांड को फाइलों को कॉपी करने की कोशिश की, लेकिन काम नहीं किया और त्रुटि देते हुए vagrant scp /vagrant/www/koushik.php ubuntu/trusty64:/usr/share/nginx/htmlमैं फाइल को nginx रूट निर्देशिका में कॉपी करने की कोशिश कर रहा हूं। यह कहता है, The machine with the name 'C' was not found configured for this Vagrant environment. निर्देशिका और सब कुछ ठीक है।
कौशिक दास

3
जोड़ने के लिए एक चीज: आपको उस मशीन की आईडी का उपयोग करना होगा जिसे आप पहले कॉलम में आवारा ग्लोबल-स्टेटस के साथ प्राप्त कर सकते हैं। बहरहाल, यह सबसे अच्छा समाधान imho है।
मिन हंडजे

1
@KoushikDas खिड़कियों पर बॉक्स से बाहर काम नहीं करता है। आपको उबंटू सबसिस्टम को विंडोज़ 10 पर सक्षम करना है, और फिर फ़ाइल के पथ के लिए C: / .. लगाने के बजाय, आपने / mnt / c / ... डाल दिया है और हुर्रे काम करता है! अन्य टिप्पणी पर भी ध्यान दें, योनि मशीन की आईडी प्राप्त करने के लिए योनि वैश्विक स्थिति का उपयोग करें।
एंड्रयू

141

वास्तव में एक बहुत सरल उपाय है। Https://gist.github.com/colindean/5213685/#comment-882885 देखें :

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


3
यह वही है जो मेरा उत्तर देता है ... यह फाइल को कॉपी करने के लिए / योनि / से एक शेल प्रोपर चलाता है।
लीक्सग्रीन

2
लेक्सग्रीन के रूप में योनि प्रावधान का उपयोग करना बेहतर है।
तोखी

4
यह सुनिश्चित करें कि config.vm.synced_folder ".", "/vagrant", disabled: falseऔर फिरvagrant reload
क्रिस्टोफर Markieta

यदि यह रिवर्स ऑपरेशन (स्थानीय मशीन के लिए आवारा बॉक्स) करने की कोशिश कर रहा है, तो यह वेजेंट बॉक्स पर काम नहीं करता है centos/7
रयनतुक

यह मेरे लिए पूरी तरह से काम करता है जब मेरे मेजबान के लिए Ubuntu 14 आवारा वीएम से एक फ़ाइल की प्रतिलिपि बनाता है। धन्यवाद!!
XtraSimplicity 21

98

डिफ़ॉल्ट रूप से, पहला योनि उदाहरण 2222 के रूप में ssh पोर्ट का उपयोग करता है, और इसका आईपी पता 127.0.0.1 है (आपको वास्तविक वर्चुअल होस्ट के साथ पोर्ट को समायोजित करने की आवश्यकता हो सकती है)

==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)

तो आप अपने स्थानीय फ़ाइल को आवृत्त करने के लिए कमांड को नीचे चला सकते हैं। पासवर्ड वही है जो यूजरनेम है vagrant

scp -P 2222 your_file vagrant@127.0.0.1:.

आप फ़ाइल को अपने स्थानीय होस्ट पर भी कॉपी कर सकते हैं।

scp -P 2222 vagrant@127.0.0.1:/PATH/filename .

3
मुझे यह करना था और सख्त कुंजी जाँच को निष्क्रिय करना था:scp -P 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no my-file.txt matt@127.0.0.1:/tmp
मैट

मैं इन ssh विकल्पों ~/.ssh/configको डिफ़ॉल्ट रूप में जोड़ने की सिफारिश करूंगा , जो मैंने अपने वातावरण में किया था:StrictHostKeyChecking no
बीएमडब्ल्यू

1
+1 + यदि किसी के पास एक से अधिक वर्चुअल मशीनें हैं, तो पोर्ट का मान Oracle VM वर्चुअल बॉक्स मैनेजर के UI से लिया जाना चाहिए - बाईं ओर vm, सेटिंग्स, नेटवर्क, पोर्ट फ़ॉरवर्डिंग का चयन करें
Yordan Georgiev

1
यह स्वीकृत उत्तर से बेहतर है। / योनि निर्देशिका हमेशा वहाँ नहीं है।
jimm101

आश्चर्यजनक रूप rsyncसे इस मामले में काम करने के लिए कितना कठिन है scp, rsync के विवरण को "आरसीपी के लिए तेज, लचीला प्रतिस्थापन" के रूप में दिया गया है।
वाइल्डकार्ड

56

यहाँ समस्या के लिए मेरा दृष्टिकोण है:

चरण 1 - निजी कुंजी, ssh पोर्ट और IP ढूंढें:

root@vivi:/opt/boxes/jessie# vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /root/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

चरण 2 - स्थानांतरण फ़ाइल का उपयोग पोर्ट और निजी कुंजी के लिए मापदंडों के रूप में करें:

  scp -P 2222 -i /root/.vagrant.d/insecure_private_key \
  someFileName.txt vagrant@127.0.0.1:~

मुझे उम्मीद है यह मदद करेगा,


4
यह सबसे सरल तरीका है। धन्यवाद।
elmonkeylp

2
कुंजी का उपयोग करके मुझे फ़ाइल स्थानांतरित करने की अनुमति दी गई। इस जानकारी के बिना उच्च जवाब काम नहीं करता है, इसलिए धन्यवाद!
inostia

1
आसान और पूर्ण समाधान।
ताओ स्टारबो जूल

27

मैंने जो किया, उसे अपनी योनि निर्देशिका के भीतर फ़ाइल रखने के लिए किया गया था (स्वचालित रूप से / योनि / के रूप में घुड़सवार) और इसे एक शेल प्रोसेसर के साथ कॉपी करें:

command = "cp #{File.join('/vagrant/', path_within_repo)} #{remote_file}"
config.vm.provision :shell, :inline => command

4
मैं कोरुटिल्स installजैसे install -D -m644 -C ...src डेस्ट का उपयोग करने की सलाह दूंगा । cp के बजाय, क्योंकि आप अनुमतियाँ निर्दिष्ट करने, स्वामित्व जैसी चीज़ें कर सकते हैं, स्वचालित रूप से अग्रणी निर्देशिकाएँ बना सकते हैं, केवल तभी कॉपी करें यदि फ़ाइल को अद्यतन करने की आवश्यकता है, आदि ... cp के बजाय, जो सरल और ठीक है यदि आप सब हैं करना पडेगा।
xenoterracide

@LeeXGreen। मैं वही करने की कोशिश कर रहा हूं जो आप करना चाह रहे थे लेकिन मुझे आपका जवाब नहीं मिला। क्या आपने टर्मिनल में कोड की वह पंक्ति टाइप की थी? आपने वास्तव में कहां स्थान दिया है?
दान रूबियो

मेरे उत्तर से कोड स्निपेट Vagrantfileआपके अन्य प्रावधानों के साथ आपके पास जाता है । आपको अपने आवेदन के लिए, चीजों को बदलने path_within_repoऔर समझने की आवश्यकता होगी remote_file, जो निश्चित रूप से :)
लीक्सग्रीन

काम करता है, लेकिन मुझे "डिफ़ॉल्ट: स्टडिन: एक
ट्टी

25
vagrant upload localfile

जो योनि के उपयोगकर्ता के घर डायर में लोकलफाइल डाल देगा

https://www.vagrantup.com/docs/cli/upload.html


2
ऐसा लगता है कि ओपी के अनुरोध को पूरी तरह से आसान उपयोग के लिए फिट करने के लिए।
18

20

यदि आप अपनी निर्देशिका में फ़ाइलें रखने से प्रतिबंधित हैं, तो आप इस कोड को होस्ट मशीन से स्क्रिप्ट फ़ाइल में चला सकते हैं।

#!/bin/sh
OPTIONS=`vagrant ssh-config | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`

scp ${OPTIONS} /File/To/Copy vagrant@YourServer:/Where/To/Put/File

इस सेटअप में, आपको केवल /File/To/Copyउस फ़ाइल या फ़ाइलों को बदलना होगा जिसे आप कॉपी करना चाहते हैं और फिर/Where/To/Put/File वीएम पर वह स्थान है जिसकी आप चाहते हैं कि फ़ाइलों की प्रतिलिपि बनाई जाए।

यदि आप यह फ़ाइल बनाते हैं और इसे कॉल copyToServer.shकरते हैं, तो आप shउन फ़ाइलों को पुश करने के लिए कमांड चला सकते हैं ।

sh ./copyToServer.sh

अंतिम नोट के रूप में, आप इस कोड को नहीं चला सकते provisionerक्योंकि अतिथि सर्वर पर चलता है, जबकि यह कोड होस्ट से चलता है।


1
यह संभवतः vag-scp प्लगइन स्थापित करने के बाहर सबसे अच्छा समाधान है। यह SSH कॉन्फ़िगरेशन का उपयोग करता है जो वैग्रंट उपयोग करता है इसलिए यह विभिन्न प्रदाताओं द्वारा प्रदान किए गए विभिन्न नेटवर्क सेटअप को संभाल सकता है।
सैंडी चैपमैन

1
अच्छा! मेरा सुझाव है कि आप यह भी ध्यान दें कि लोग इसका आउटपुट ले सकते हैं vagrant ssh-configऔर इसे अपनी ~ / .ssh / config फाइल में पेस्ट कर सकते हैं, ताकि भविष्य में यह और भी आसान हो सके।
I

2
मैंने पाया है कि "होस्ट निर्देश एक कमांड लाइन विकल्प के रूप में समर्थित नहीं है" से बचने के लिए ssh-config आउटपुट की पहली पंक्ति को छोड़ना आवश्यक है - ssh-config खंड के लिए हेडर के कारण: "होस्ट डिफ़ॉल्ट"। तो, मेरी स्क्रिप्ट को OPTIONS=`vagrant ssh-config | tail -n +2 | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`ssh-config आउटपुट की पहली पंक्ति का उपयोग करके छोड़ना है।
ट्रॉफ्लॉगर

1
वैकल्पिक रूप से, "होस्ट निर्देश समर्थित नहीं" त्रुटि को दूर करने के लिए जिसे आप OPTIONS=`vagrant ssh-config | grep -v '^Host ' | awk -v ORS=' ' 'NF{print "-o " $1 "=" $2}'`यहां दस्तावेज के रूप में उपयोग कर सकते हैं : gist.github.com/geedew/11289350
user783836

10

वैगरंट लॉग इन करने के बजाय ssh पर कमांड निष्पादित करने का एक तरीका प्रदान करता है, इसलिए लिनक्स होस्ट और अतिथि के लिए आप इसका उपयोग कर सकते हैं:

  • मेजबान से अतिथि तक:

cat ~/file_on_host.txt | vagrant ssh -c 'cat - > ~/file_on_guest.txt'

  • अतिथि से मेजबान:

vagrant ssh -c 'cat ~/file_on_guest.txt' > ~/file_on_host.txt

प्लगइन्स या अतिथि पुनः लोड की कोई आवश्यकता नहीं है। यदि आप वैग्रांटफाइल के समान ही डीर में नहीं हैं, तो 'वेजिटश एसएच' को योनि बॉक्स आईडी प्रदान करना सुनिश्चित करें। Vagrant v1.8.1 पर परीक्षण किया गया।


अतिथि से होस्ट के दृष्टिकोण तक फाइलों में विशेष प्रतीकों को संरक्षित नहीं किया जाता है
डॉएक्स

9

आप इसमें प्रविष्टि जोड़ सकते हैं ~/.ssh/config:

Host vagrant
    User vagrant
    HostName localhost
    Port 2222
    IdentityFile /home/user_name/.vagrant.d/insecure_private_key

और सरल scp file vagrant:/path/। आप vagrant ssh-configकमांड का उपयोग करके पहचान फ़ाइल के लिए पथ पा सकते हैं ।


1
बहुत मददगार है, और यह स्पष्ट करने में मदद करता है कि क्या चल रहा है। इससे आप दोनों दिशाओं की नकल कर सकते हैं, पुनरावर्ती प्रतियां, आदि कर सकते हैं और scp / ssh के मौजूदा ज्ञान का लाभ उठा सकते हैं
nealmcb

1
मैं बस ऊपर दिए गए उत्तरों को फिर से पढ़ता हूं और wiht geedew के उत्तर को खेलकर पता चलता है जो vagrant ssh-configआपको और भी अधिक पूर्ण और सुविधाजनक कॉन्फिगरेशन प्रदान करता है जिसे आप अपने ~ / .ssh / config में डाल सकते हैं। लेकिन फिर से धन्यवाद!
nealmcb

7

उस निर्देशिका पर जाएं जहां आपके पास आपका है Vagrantfile
, अपना संपादन करें Vagrantfileऔर निम्नलिखित जोड़ें:

config.vm.synced_folder ".", "/vagrant", :mount_options => ['dmode=774','fmode=775']

"।" इसका मतलब है कि वर्तमान में आप अपने मेजबान मशीन
" / योनि" पर हैं, अतिथि मशीन पर "/ घर / योनि" को संदर्भित करता है (वैग्रेंट मशीन) ।

उस फाइल को कॉपी करें जिसे आपको गेस्ट मशीन में उस फोल्डर में भेजना है जहाँ आपके पास आपका Vagrantfile खुला गेट बैश है और cdउस डायरेक्टरी में जहाँ आपके पास आपका Vagrantfileटाइप है:

vagrant scp config.json XXXXXXX:/home/vagrant/

जहाँ XXXXXXX आपका vm नाम है । आप अपना vm नाम चलाकर प्राप्त कर सकते हैं

vagrant global-status

7

अगर कुछ कारणों से आपको उपयोग करने की अनुमति नहीं है

vagrant plugin install vagrant-scp

एक वैकल्पिक तरीका है:

पहले अपने वीग्रांटप्रोजेक्ट को ऊपर उठायें , फिर टर्मिनल में लिखें:

vagrant ssh-config

आपके पास अपने वर्चुअल मशीन के "HostName" और "पोर्ट" के बारे में सूचना होगी।

कुछ मामलों में, आप अपने प्रोजेक्ट में कुछ वर्चुअल मशीन रख सकते हैं। तो बस अपने मास्टर-मशीन को खोजें (सामान्य तौर पर, इस वीएम में पोर्ट 2222 है), और अन्य मशीनों पर ध्यान न दें।

प्रतिलिपि बनाने के लिए कमांड लिखें:

scp -P xxPortxx  /Users/where/is/your/file.txt  vagrant@xxHostNamexx:/home/vagrant

इस खड़ी पर आपको एक योनि पासवर्ड डालना होगा: डिफ़ॉल्ट रूप से यह "योनि" है

उसके बाद यदि आप अपनी वर्चुअल मशीन की फाइलों को देखते हैं:

vagrant ssh xxVirtualMachineNamexx
pwd
ls

आपके वर्चुअल मशीन निर्देशिका में "file.txt" होगा


योनि पासवर्ड डालने के बाद मुझे "अनुमति अस्वीकृत" हो रही है
user2568374

2
लेकिन यह लक्ष्य डायर की अनुमति के कारण था। मैंने / घर / योनि की नकल की और वह काम किया।
user2568374

4

यदि आप अपने योनि बॉक्स का नाम जानते हैं, तो वेजिटेंट एसपीपी प्लगइन काम करता है। योनि की वैश्विक स्थिति की जांच करें जो आपके बॉक्स का नाम प्रदान करेगी फिर आप चला सकते हैं:

vagrant global-status
id       name    provider   state   directory
------------------------------------------------------------------------
13e680d  **default** virtualbox running /home/user

योनि स्केप ~ / फ़ोबोबार "मेरे मामले में नाम डिफ़ॉल्ट": / होम / "उपयोगकर्ता" /


1
यह मेरे लिए काम किया। संपादन भी सहायक है, मैं भी कमांड को शामिल करने के लिए आवारा एसपीपी प्लगइन स्थापित करेगा।
WhyAyala

1

यह कोशिश करो .. योनि ubuntu 14.04 यह मेरे लिए काम किया।

scp -r -P 2222 vagrant@localhost:/home .

1

कुछ भी स्थापित किए बिना ऐसा करने का एक वैकल्पिक तरीका ( vagrant-scpआदि) ध्यान दें कि नाम का defaultउपयोग करने की आवश्यकता है, क्योंकि vagrant ssh-configवह उत्सर्जन करता है।

vg_scp() {
  tmpfile=$(mktemp /tmp/vagrant-ssh-config.XXXX)
  vagrant ssh-config > $tmpfile
  scp -F $tmpfile "$@"
  rm $tmpfile
}

# Copy from local to remote
vg_scp somefile default:/tmp

# Copy from remote to local
vg_scp default:/tmp/somefile ./

# Copy a directory from remote to local
vg_scp -r default:/tmp ./tmp

यदि scp -F =(vagrant ssh-config) ...गोले भर में काम किया होता तो यह कार्य आवश्यक नहीं होता। लेकिन चूंकि यह बैश द्वारा समर्थित नहीं है, इसलिए हमें इस समाधान का सहारा लेना होगा।


1

अगर कोई विंडो होस्ट से योनि में फ़ाइल स्थानांतरित करना चाहता है, तो यह समाधान मेरे लिए काम करता है।

1. Make sure to install **winscp** on your windows system
2. run **vagrant up** command
3. run **vagrant ssh-config** command and note down below details
4. Enter Hostname, Port, Username: vagrant, Password: vagrant in winscp and select **SCP**, file protocol 
5. In most cases, hostname: 127.0.0.1, port: 2222, username: vagrant, password: vagrant.

आपको अपनी योनि मशीन में निर्देशिकाओं को देखने में सक्षम होना चाहिए।


-3

स्थानीय से योनि में फाइल कॉपी करने का सबसे अच्छा तरीका, कोई कोड या कोई भी चीज या कोई कॉन्फ़िगरेशन परिवर्तन लिखने की आवश्यकता नहीं है। 1- सबसे पहले आवारा ( योनि ऊपर ) 2- खुला सागवान 3- साग्विन: अपने उस फोल्डर में जाएं, जहां वेज्रान्टाइल है या जहां से आप वैजाइनल 4- ssh वज्र लॉन्च करते हैं, 5- अब यह एक सामान्य सिस्टम की तरह काम करेगा।


एक समस्या जो मुझे इस दृष्टिकोण से पता चली है: यदि योनि को आपके अतिथि परिवर्धन को कॉन्फ़िगर करने की आवश्यकता है, तो / योनि निर्देशिका वास्तव में माउंट नहीं हो सकती है जब फ़ाइल प्रावधान चलता है।
टॉरेनवेयर नेटवर्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.