Najprostszy sposób na skopiowanie pojedynczego pliku z hosta na Vagrant guest?

Mam przypadek użycia, w którym od czasu do czasu chcę skopiować pojedynczy plik z komputera hosta do Gościa włóczęgi.

Nie chcę tego robić za pomocą tradycyjnych provisionerów (Puppet / Chef), ponieważ często jest to jednorazowy ... chcę tylko coś szybkiego dodać do mojego Vagrantfile.

Nie chcę udostępniać całego katalogu, być może dlatego, że chcę nadpisać istniejący plik bez nukowania całego katalogu gościa.

Napisanie powłoki też wydaje się trochę przesadą skrypt provisioning, i radzić sobie z ewentualnym ucieczki, gdy wszystko, co chcę zrobić, to skopiować plik.

Jaki jest najprostszy sposób na skopiowanie pojedynczego pliku z hosta do gościa?

 191
Author: LeeXGreen, 2013-05-23

15 answers

Zamiast kopiowania pliku za pomocą provisionera powłoki, możesz również użyć provisionera pliku Vagrant .

Nazwa dostawcy: "file"

Provisioner plików umożliwia przesyłanie pliku z komputera hosta do komputera gościa.

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

  config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig"
end
 78
Author: lynnaloo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-07 16:35:06

Ponieważ prosisz o najprostszy sposób, sugeruję użycie Vagrant-scp. Dodaje polecenie scp do vagrant, dzięki czemu można kopiować pliki do maszyny wirtualnej, tak jak normalnie robi się to z scp.

Zainstaluj przez:

vagrant plugin install vagrant-scp

Użyj go tak:

vagrant scp <some_local_file_or_dir> [vm_name]:<somewhere_on_the_vm>
 192
Author: Luca Invernizzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-26 19:57:22

Istnieje o wiele prostsze rozwiązanie. Zobacz https://gist.github.com/colindean/5213685/#comment-882885 :

" proszę zauważyć, że jeśli z jakiegoś powodu nie chcesz scp, najprostszym sposobem na przesyłanie plików z hosta do maszyny Wirtualnej jest umieszczenie ich w tym samym katalogu co plik Vagrantfile - ten katalog jest automatycznie montowany w / vagrant w maszynie wirtualnej, dzięki czemu możesz kopiować lub używać ich bezpośrednio z maszyny wirtualnej."

 125
Author: Eric P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-21 15:33:24

Domyślnie pierwsza instancja vagrant używa portu ssh jako 2222, a jej adres ip to 127.0.0.1 (może być konieczne dostosowanie portu za pomocą prawdziwego wirtualnego hosta)

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

Więc możesz uruchomić poniższe polecenie, aby skopiować lokalny plik do instancji vagrant. hasło jest takie samo jak nazwa użytkownika, która jest vagrant.

scp -P 2222 your_file [email protected]:.

Możesz również skopiować plik z powrotem do lokalnego hosta.

scp -P 2222 [email protected]:/PATH/filename .
 82
Author: BMW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-19 00:58:05

Oto moje podejście do problemu:

Krok 1-Znajdź klucz prywatny, port ssh i adres 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

Krok 2-Prześlij plik używając portu i klucza prywatnego jako parametrów dla scp:

  scp -P 2222 -i /root/.vagrant.d/insecure_private_key \
  someFileName.txt [email protected]:~

Mam nadzieję, że to pomoże,

 45
Author: alfredocambera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-01 22:28:11

Skończyło się na tym, że zatrzymałem plik w moim katalogu vagrant (automatycznie montowany jako / vagrant/) i skopiowałem go za pomocą provisionera powłoki:

command = "cp #{File.join('/vagrant/', path_within_repo)} #{remote_file}"
config.vm.provision :shell, :inline => command
 27
Author: LeeXGreen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-23 05:14:32

Jeśli nie możesz mieć plików w katalogu, możesz uruchomić ten kod w pliku skryptu z komputera hosta.

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

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

W tej konfiguracji wystarczy zmienić /File/To/Copy na plik lub pliki, które chcesz skopiować, a następnie /Where/To/Put/File jest lokalizacją na maszynie wirtualnej, do której chcesz skopiować pliki.

Jeśli utworzysz ten plik i nazwiesz go copyToServer.sh, Możesz następnie uruchomić polecenie sh, aby wypchnąć te pliki.

sh ./copyToServer.sh

Jako ostatnia uwaga, nie możesz uruchomić tego kodu jako provisioner ponieważ działa na serwerze gościa, podczas gdy ten kod działa z hosta.

 18
Author: geedew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-24 20:43:01

Możesz dodać wpis w ~/.ssh/config:

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

I proste scp file vagrant:/path/. Możesz znaleźć ścieżkę do pliku tożsamości za pomocą polecenia vagrant ssh-config.

 9
Author: chf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-30 13:26:40

Vagrant umożliwia wykonanie polecenia przez ssh zamiast logowania się, więc dla hosta Linuksa i gościa możesz użyć:

  • od gospodarza do gościa:

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

  • od gościa do gospodarza:

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

Nie ma potrzeby instalowania wtyczek ani przeładowywania gości. Po prostu upewnij się, aby podać identyfikator Vagrant box do 'Vagrant ssh', jeśli nie jesteś w tym samym katalogu co plik Vagrantfile. Testowane na Vagrant v1.8. 1.

 9
Author: user7962684,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-04 12:09:56

Jeśli z jakichś powodów nie masz uprawnień do używania

vagrant plugin install vagrant-scp

Istnieje alternatywny sposób:

Najpierw vagrant up yourVagrantProject , a następnie napisz w terminalu:

vagrant ssh-config

Będziesz miał informacje o "nazwie hosta" i "Porcie" Twojej maszyny wirtualnej.

W niektórych przypadkach, możesz mieć kilka maszyn wirtualnych w swoim projekcie. Więc po prostu znajdź swoją maszynę główną (ogólnie rzecz biorąc, ta maszyna wirtualna ma port 2222 ) i nie zwracaj uwagi na inne maszyny informacje.

Zapisz polecenie, aby wykonać kopię:

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

Na tej stromie będziesz musiał umieścić hasło włóczęgi : domyślnie jest to "vagrant"

Następnie, jeśli spojrzysz na pliki w maszynie wirtualnej:

vagrant ssh xxVirtualMachineNamexx
pwd
ls

Będziesz miał " plik.txt " w katalogu maszyn wirtualnych

 6
Author: slideWXY,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-03 11:02:33

Przejdź do katalogu gdzie masz swoje Vagrantfile
Następnie Edytuj swój Vagrantfile i dodaj:

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

"." oznacza katalog, w którym aktualnie znajdujesz się na swojej maszynie hosta
"/Vagrant " odnosi się do" /home/vagrant " na guest machine (Vagrant machine).

Skopiuj pliki, które musisz wysłać do guest machine do folderu, w którym masz swoje Vagrantfile Następnie otwórz Git Bash i cd do katalogu, w którym masz swój Vagrantfile i typ:

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

Gdzie XXXXXXX jest twoją nazwą vm. Nazwę maszyny Wirtualnej można uzyskać, uruchamiając

vagrant global-status
 5
Author: akshaynagpal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-03 18:59:16

Wtyczka Vagrant scp działa, jeśli znasz nazwę swojego pudełka vagrant. zaznacz Vagrant global-status, który poda nazwę twojej skrzynki, a następnie możesz uruchomić:

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

Vagrant scp ~/foobar "name in my case default":/home/"user" /

 3
Author: Bálint Szigeti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-11 10:08:22

Spróbuj tego.. vagrant ubuntu 14.04 To mi pomogło.

scp -r -P 2222 vagrant@localhost:/home .
 0
Author: Caliari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-06 17:59:31

Alternatywny sposób, aby to zrobić bez instalowania czegokolwiek (vagrant-scp itp.) Zauważ, że nazwa default musi być używana tak jak jest, ponieważ vagrant ssh-config to emituje.

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

Funkcja nie byłaby potrzebna, gdyby scp -F =(vagrant ssh-config) ... działała na powłokach. Ale ponieważ nie jest to obsługiwane przez Bash, musimy uciekać się do tego obejścia.

 0
Author: Gurjeet Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-20 16:55:30

Najlepszy sposób na skopiowanie pliku z lokalnego do vagranta, bez potrzeby pisania kodu, jakichkolwiek rzeczy lub jakichkolwiek zmian konfiguracyjnych. 1-First up the vagrant ( vagrant up ) 2-otwarty cygwin 3-cygwin: przejdź do folderu gdzie jest vagrantfile lub z którego uruchamiasz vagrant 4- SSH vagrant 5 - Teraz będzie działać jak normalny system.

 -2
Author: D-2020365,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-10 11:02:11