Ana bilgisayardan Vagrant misafirine tek bir dosyayı kopyalamanın en kolay yolu?


241

Ana bilgisayarımdan Vagrant misafirine zaman zaman tek bir dosya kopyalamak istediğim bir kullanım durumum var.

Geleneksel sağlayıcılar (Kukla / Şef) aracılığıyla bunu yapmak istemiyorum çünkü bu genellikle bir kerelik - sadece Vagrantfile'ım eklemek için hızlı bir şey istiyorum.

Bir dizinin tamamını paylaşmak istemiyorum, çünkü büyük olasılıkla konuktaki dizinin tamamını çekmeden varolan bir dosyanın üzerine yazmak istiyorum.

Ayrıca, bir kabuk sağlama betiği yazmak ve potansiyel kaçma ile başa çıkmak için biraz aşırıya kaçmış gibi görünüyor, tek yapmak istediğim bir dosyayı kopyalamak.

Peki, tek bir dosyayı ana bilgisayardan konuğa kopyalamanın en kolay yolu nedir?


kabul edilen cevabın Vagrant 1.x'e dayandığını unutmayın; bir dosya sağlayıcı kullanmak standart Vagrant 2 yaklaşımıdır , ancak /vagrant burada belirtildiği gibi bağlama noktasını değiştirmek de iyi bir seçenek olabilir
STW

3
@Jouell'den gelen cevap tek bir dosyanın bir kerelik kopyasının basit kullanım durumu için gerçekten daha fazla oy hak ediyor: vagrant upload /path/to/my/file...
dat

vagrant scp file.txt :~/.
AlikElzin-kilaka

Yanıtlar:


107

Dosyayı kopyalamak için kabuk sağlayıcı kullanmak yerine bir Vagrant kullanabilirsiniz dosya .

Sağlayıcı adı: "file"

Dosya sağlayıcı, ana makineden misafir makineye bir dosya yüklemenizi sağlar.

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

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

3
Bu kesinlikle Vagrant 2'de bunu yapmanın en iyi yoludur! Ancak, Vagrant 2 bunu yapmak için gerekli anda mevcut değildi ... :)
LeeXGreen

4
Bu çözüm kulağa hoş geliyor, ancak izin hataları nedeniyle herhangi bir dosyayı kopyalayamıyorum.
orbatschow

@orbatschow Ben de aynı sorunu vardı, ama eğer kopyaladıysanız değil/tmp
Ben 6

6
OP'nin sorduğu şey bu değil. soru, zaman zaman dosyaların nasıl aktarılacağıydı; provizyon yapmak zorunda kalmak aşırıdır.
axd

253

En kolay yolu sorduğunuz için, vagrant-scp kullanmanızı öneririz. . Vagrant'a bir scp komutu ekler, böylece dosyaları normalde scp ile yaptığınız gibi VM'nize kopyalayabilirsiniz.

Yükleme yöntemi:

vagrant plugin install vagrant-scp

Şöyle kullanın:

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

1
Bu benim için işe yaramadı. Eklentiyi yükledim, ancak "vagrant-scp eklentisi bulunamadı" hatasıyla karşılaşmaya devam etti. Lütfen doğru şekilde yüklendiğinden emin olun vagrant plugin.
rockerston

6
Merhaba Rod, vagrant-scp Vagrant 1.7+ ile çalışır. Açtığınız hatadan 1.4.3 çalıştırıyorsunuz. Bu eklentiye ihtiyacınız varsa, korkarım (hızlı ve ağrısız) yükseltmeniz gerekecek.
Luca Invernizzi

1
Dosyaları kopyalamak için bu komutu denedim ama işe yaramadı ve hata veren vagrant scp /vagrant/www/koushik.php ubuntu/trusty64:/usr/share/nginx/htmldosyaları nginx kök dizinine kopyalamaya çalışıyorum. Diyor ki, The machine with the name 'C' was not found configured for this Vagrant environment. Dizin ve her şey yolunda.
Koushik Das

3
Eklenecek bir şey: İlk sütunda vagrant global durumuyla alabileceğiniz makinenin kimliğini kullanmanız gerekir. Yine de, bu en iyi çözüm imho.
min hundje

1
@KoushikDas Windows'ta kutunun dışında çalışmaz. Windows 10'da Ubuntu alt sistemini etkinleştirmelisiniz ve sonra dosya yolu için C: / .. koymak yerine, / mnt / c / ... koydunuz ve Yaşasın! Ayrıca diğer yoruma dikkat edin, vagrant makinesinin kimliğini almak için vagrant genel durumunu kullanın.
Andrew

141

Aslında çok daha basit bir çözüm var. Bkz. Https://gist.github.com/colindean/5213685/#comment-882885 :

"özellikle scp'yi herhangi bir nedenle istemiyorsanız, ana bilgisayardan VM'ye dosya aktarmanın en kolay yolunun bunları Vagrantfile ile aynı dizine koymak olduğunu unutmayın - bu dizinin otomatik olarak VM'de / vagrant altına bağlandığı doğrudan VM'den kopyalayabilir veya kullanabilirsiniz. "


3
Bu tam olarak cevabımın yaptığı şey ... dosyayı / vagrant / dizininden kopyalamak için bir kabuk sağlayıcısı çalıştırıyor.
LeeXGreen

2
LeexGreen'in kullandığı gibi vagrant provizyonunu kullanmak daha iyidir.
tokhi

4
Bunu sağlayın config.vm.synced_folder ".", "/vagrant", disabled: falseve sonravagrant reload
Christopher Markieta

Bu mu değil üzerinde çalışmak centos/7ters operasyonu (yerel makineye serseri kutu) yapmaya çalışıyor eğer serseri kutu.
ryantuck

Ubuntu 14 vagrant VM'imden sunucuma bir dosya kopyalarken bu benim için mükemmel çalışıyor. Teşekkürler!!
XtraSimplicity

98

Varsayılan olarak, ilk vagrant örneği ssh portunu 2222 olarak kullanır ve ip adresi 127.0.0.1'dir (Portu gerçek sanal ana bilgisayarla ayarlamanız gerekebilir)

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

Böylece yerel dosyanızı vagrant örneğine kopyalamak için aşağıdaki komutu çalıştırabilirsiniz. şifre kullanıcı adı ile aynıdır vagrant.

scp -P 2222 your_file vagrant@127.0.0.1:.

Dosyayı yerel ana makinenize de kopyalayabilirsiniz.

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

3
Bunu yapmak ve katı anahtar kontrolünü devre dışı bırakmak zorunda kaldım:scp -P 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no my-file.txt matt@127.0.0.1:/tmp
Matt

Bu ssh seçeneklerini ~/.ssh/configvarsayılan olarak eklemenizi tavsiye edeceğim, bu da benim StrictHostKeyChecking no
BMW

1
+1 + Birden fazla sanal makine varsa, bağlantı noktasının değeri Oracle VM VirtualBox Manager kullanıcı arayüzünden alınmalıdır - soldan vm, ayarlar, ağ, bağlantı noktası yönlendirme seçin
Yordan Georgiev

1
Bu kabul edilen cevaptan daha iyidir. / Vagrant dizini her zaman orada değildir.
jimm101

Rsync'in açıklaması "rcp için daha hızlı, esnek bir yedek" olarak göz önüne alındığında, rsyncbu durumda çalışmanın ne kadar zor olduğunu scpşaşırtmak.
Wildcard

56

İşte benim probleme yaklaşımım:

1. Adım - Özel anahtarı, ssh bağlantı noktasını ve IP'yi bulun:

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

Adım 2 - scp için parametre olarak bağlantı noktasını ve özel anahtarı kullanarak dosya aktarın:

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

Umut ediyorum bu yardım eder,


4
Bu en basit yol. Teşekkür ederim.
elmonkeylp

2
Anahtarı kullanarak dosyayı aktarmama izin verdim. Bu bilgi olmadan daha yüksek cevap işe yaramadı, bu yüzden teşekkür ederim!
inostia

1
Kolay ve eksiksiz çözüm.
Tao Starbow

27

Ne yaptığım dosyayı vagrant dizini (otomatik olarak / vagrant / olarak monte) içinde tutmak ve bir kabuk sağlayıcı ile kopyalamak oldu:

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

4
Ben kullanarak tavsiye ediyoruz coreutils installörn install -D -m644 -C ...src dest. cp yerine, izinleri belirtmek, sahiplik, otomatik olarak önde gelen dizinler oluşturmak gibi şeyler yapabilirsiniz, sadece dosyanın güncellenmesi gerekiyorsa kopyasını yapın, vb ... cp yerine, bu kadar basit ve güzel yapma ihtiyacı.
xenoterracide

@LeeXGreen. Yapmaya çalıştığın aynı şeyi yapmaya çalışıyorum ama cevabını pek almadım. Terminalde bu kod satırını yazdınız mı? Tam olarak nereye koydun?
Dan Rubio

Cevabımdaki kod snippet'i, Vagrantfilediğer tedarikçilerinizle birlikte yanınızda. Sen değiştirmeniz gerekir path_within_repove remote_file:) tabii ki, uygulamanız için mantıklı şeyler ile
LeeXGreen

Çalışıyor ama "varsayılan: stdin: bir tty değil" hatası alıyorum
radtek


20

Dizininizdeki dosyalara sahip olmanız engellenirse, bu kodu Ana makineden bir komut dosyasında çalıştırabilirsiniz.

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

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

Bu kurulumda, yalnızca /File/To/Copykopyalamak istediğiniz dosyaya veya dosyalara geçmeniz ve ardından/Where/To/Put/File VM'de dosyaların kopyalanmasını istediğiniz konumdur.

Bu dosyayı oluşturup çağırırsanız copyToServer.sh, shbu dosyaları göndermek için komutu çalıştırabilirsiniz .

sh ./copyToServer.sh

Son bir not olarak, provisionerbu kodu Ana sunucudan çalıştırırken Guest sunucusunda çalıştığı için bu kodu çalıştıramazsınız.


1
Bu muhtemelen vagrant-scp eklentisini kurmanın dışındaki en iyi çözümdür. Vagrant'ın kullandığı SSH yapılandırmasını kullanır, böylece farklı sağlayıcılar tarafından sağlanan farklı ağ kurulumlarını idare edebilir.
Sandy Chapman

1
Güzel! Ayrıca vagrant ssh-config, gelecekte kullanıcıların bunu daha da kolaylaştırmak için çıktılarını alıp ~ / .ssh / config dosyasına yapıştırabileceklerini de belirtmenizi öneririm . Yani bunu
chf'ın

2
"Ana bilgisayar yönergesi bir komut satırı seçeneği olarak desteklenmiyor" - ssh-config bölümünün başlığı nedeniyle "Ana bilgisayar varsayılanı" hatasını önlemek için ssh-config çıkışının ilk satırını atlamayı gerekli buldum. Bu yüzden, OPTIONS=`vagrant ssh-config | tail -n +2 | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`betiğim ssh-config çıktısının ilk satırını kullanarak atlamalıdır.
troyfolger

1
Alternatif olarak, "Ana bilgisayar yönergesi desteklenmiyor" hatasını kaldırmak için, OPTIONS=`vagrant ssh-config | grep -v '^Host ' | awk -v ORS=' ' 'NF{print "-o " $1 "=" $2}'`burada belirtilen şekilde kullanabilirsiniz : gist.github.com/geedew/11289350
user783836

10

Vagrant, oturum açmak yerine ssh üzerinden bir komut yürütmenin bir yolunu sunar, böylece Linux ana bilgisayarı ve konuk için şunları kullanabilirsiniz:

  • ev sahibinden misafir:

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

  • konuktan ev sahibine:

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

Eklentilere veya misafir yüklemelerine gerek yoktur. Vagrantfile ile aynı dizinde değilseniz, vagrant ssh 'a vagrant kutusu kimliği sağladığınızdan emin olun. Vagrant v1.8.1 üzerinde test edilmiştir.



9

Şuraya giriş ekleyebilirsiniz ~/.ssh/config:

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

ve basit scp file vagrant:/path/. vagrant ssh-configKomutunu kullanarak kimlik dosyasının yolunu bulabilirsiniz .


1
Çok yararlı ve neler olduğunu açıklığa yardımcı olur. Bu, her iki yönü kopyalamanıza, yinelemeli kopyalar vb. Yapmanıza olanak tanır ve mevcut scp / ssh bilgisini güzelce kullanır
nealmcb

1
Sadece yukarıdaki cevapları tekrar okudum ve vagrant ssh-config~ / .ssh / config'inize koyabileceğiniz daha eksiksiz ve kullanışlı bir yapılandırma snip'i veren geedew'in cevabı ile oynayarak keşfettim . Ama tekrar teşekkürler!
nealmcb

7

Vagrantfile
Ardından, dizininizi içeren dizine gidin Vagrantfileve aşağıdakileri düzenleyin :

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

"" şu anda ana makinenizde bulunduğunuz dizin anlamına gelir
"/ vagrant" konuk makinede "/ home / vagrant" anlamına gelir (Vagrant makinesi) .

Eğer varsa klasöre konuk makinesine göndermek için gereken dosyaları kopyalayın Vagrantfile Sonra açık Git Bash ve cdsize sahip dizine Vagrantfileve türünü:

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

burada XXXXXXX vm adınızdır . Vm adınızı çalıştırarak alabilirsiniz

vagrant global-status

7

bazı nedenlerden dolayı kullanma izniniz yoksa

vagrant plugin install vagrant-scp

alternatif bir yol var:

Önce VagrantProject'inizi kaldırın , sonra terminale yazın:

vagrant ssh-config

sanal makinenizin "Ana MakineAdı" ve "Bağlantı Noktası" hakkında bilgiler alırsınız.

Bazı durumlarda, projenizde bazı sanal makineler olabilir. Bu yüzden sadece ana makinenizi bulun (genel olarak, bu VM 2222 bağlantı noktasına sahiptir) ve diğer makinelerin bilgilerine dikkat etmeyin.

kopyasını yapmak için komutu yazın:

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

Bu dikte bir vagrant şifresi koymanız gerekecek: varsayılan olarak "vagrant"

bundan sonra sanal makinenizdeki dosyalara bakarsanız:

vagrant ssh xxVirtualMachineNamexx
pwd
ls

sanal makine dizininizde "file.txt" bulunacaktır


vagrant şifre koyduktan sonra "İzin reddedildi" alıyorum
user2568374

2
ancak bunun nedeni hedef dizindeki izinlerdir. / Home / vagrant klasörüne kopyaladım ve bu işe yaradı.
user2568374

4

Eğer vagrant kutu adınızı biliyorsanız vagrant scp eklentisi çalışır. kutu adınızı sağlayacak vagrant genel durumunu kontrol edin, sonra şunları çalıştırabilirsiniz:

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

vagrant scp ~ / foobar "benim durumumda varsayılan isim": / home / "user" /


1
bu benim için çalıştı. düzenleme de yararlı, ben de vagrant scp eklentisini yüklemek için komut içerir.
WhyAyala

1

Bunu dene .. vagrant ubuntu 14.04 Bu benim için çalıştı.

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

1

Herhangi bir şey ( vagrant-scpvb.) Yüklemeden bunu yapmanın alternatif bir yolu , adın defaultolduğu gibi kullanılması gerektiğine vagrant ssh-configdikkat edin.

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) ...Kabuklar üzerinde çalışsaydı, işlev gerekli olmazdı. Ancak bu Bash tarafından desteklenmediği için bu geçici çözüme başvurmalıyız.


1

Birisi windows host'dan vagrant'a dosya aktarmak istiyorsa, bu çözüm benim için çalıştı.

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.

Vagrant makinenizdeki dizinleri görebilmeniz gerekir.


-3

Yerelden vagrant'a dosya kopyalamanın en iyi yolu, herhangi bir kod veya herhangi bir şey veya herhangi bir yapılandırma değişikliği yazmaya gerek yok. 1- Önce vagrant ( vagrant up ) 2- açık cygwin 3- cygwin: vagrantfile olan veya vagrant'ı başlattığınız klasöre gidin 4- ssh vagrant 5- şimdi normal bir sistem gibi çalışacaktır.


Bu yaklaşımla keşfettiğim bir sorun var: Vagrant'ın Misafir Eklemelerinizi yapılandırması gerekiyorsa, dosya sağlayıcısı çalıştığında / vagrant dizini aslında bağlanamayabilir.
Torenware Networks
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.