Najprostszym sposobem na skopiowanie pojedynczego pliku z hosta do gościa Vagrant?

241

Mam przypadek użycia, w którym czasami chcę skopiować pojedynczy plik z komputera hosta do gościa Vagrant.

Nie chcę tego robić za pośrednictwem tradycyjnych dostawców (Puppet / Chef), ponieważ często jest to jednorazowe - chcę tylko coś szybko dodać do mojego Vagrantfile.

Nie chcę udostępniać całego katalogu, być może dlatego, że chcę zastąpić istniejący plik bez nukania całego katalogu na gościu.

Wydaje się również trochę przesadą napisanie skryptu obsługi powłoki i radzenie sobie z potencjalnym ucieczką, gdy wszystko, co chcę zrobić, to skopiować plik.

Jaki jest więc najłatwiejszy sposób na skopiowanie pojedynczego pliku z hosta na gościa?

LeeXGreen
źródło
zwróć uwagę, że zaakceptowana odpowiedź oparta jest na Vagrant 1.x - użycie programu do udostępniania plików jest standardowym podejściem Vagrant 2 , chociaż dobrą opcją może być zmiana punktu montowania, /vagrant jak wspomniano tutaj
STW
3
Odpowiedź @jouell naprawdę zasługuje na więcej głosów na prosty przypadek jednorazowej kopii pojedynczego pliku: vagrant upload /path/to/my/file...
dat
vagrant scp file.txt :~/.
AlikElzin-kilaka

Odpowiedzi:

107

Zamiast używać dostawcy powłoki do kopiowania pliku, możesz również użyć narzędzia Vagrant do udostępniania plików .

Nazwa dostawcy: "file"

Dostawca plików umożliwia przesłanie pliku z komputera hosta na komputer gościa.

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

  config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig"
end
lynnaloo
źródło
3
To zdecydowanie najlepszy sposób, aby to zrobić w Vagrant 2! Jednak Vagrant 2 nie był dostępny w momencie, gdy musiałem to zrobić ... :)
LeeXGreen
4
To rozwiązanie brzmi nieźle, ale nie mogę skopiować żadnego pliku z powodu błędów uprawnień.
orbatschow
@orbatschow Miałem ten sam problem, ale nie gdybym go skopiował/tmp
Ben
6
nie o to prosił PO. pytanie brzmiało: jak czasami przesyłać pliki; konieczność uruchomienia obsługi administracyjnej to przesada.
axd
253

Ponieważ pytasz o najłatwiejszy sposób, sugeruję użycie vagrant-scp . Dodaje polecenie scp do włóczęgi, dzięki czemu można kopiować pliki na maszynę wirtualną, tak jak zwykle w przypadku scp.

Zainstaluj przez:

vagrant plugin install vagrant-scp

Używaj go w ten sposób:

vagrant scp <some_local_file_or_dir> [vm_name]:<somewhere_on_the_vm>
Luca Invernizzi
źródło
1
To mi nie zadziałało. Zainstalowałem wtyczkę, ale ciągle pojawiał się komunikat o błędzie „Nie można znaleźć wtyczki„ vagrant-scp ”. Upewnij się, że została poprawnie zainstalowana za pośrednictwem vagrant plugin”.
rockerston
6
Cześć Rod, vagrant-scp współpracuje z Vagrant 1.7+. Z błędu, który otworzyłeś, korzystasz z wersji 1.4.3. Jeśli potrzebujesz tej wtyczki, obawiam się, że będziesz musiał ją zaktualizować (co jest szybkie i bezbolesne).
Luca Invernizzi
1
Próbowałem tego polecenia, aby skopiować pliki, ale nie działało i daje błąd vagrant scp /vagrant/www/koushik.php ubuntu/trusty64:/usr/share/nginx/htmlPróbuję skopiować pliki do katalogu głównego nginx. Mówi: The machine with the name 'C' was not found configured for this Vagrant environment. katalog i wszystko jest w porządku.
Koushik Das
3
Jedną rzecz do dodania: musisz użyć identyfikatora komputera, który możesz uzyskać z błędnym statusem globalnym w pierwszej kolumnie. Niemniej jednak jest to najlepsze rozwiązanie imho.
min hundje
1
@KoushikDas Nie działa od razu w systemie Windows. Musisz włączyć podsystem Ubuntu w systemie Windows 10, a następnie zamiast wstawiać C: / .. dla ścieżki do pliku, wstawiasz / mnt / c / ... I działa! Zwróć też uwagę na inny komentarz: użyj błędnego statusu globalnego, aby uzyskać identyfikator maszyny błędnej.
Andrew
141

W rzeczywistości istnieje znacznie prostsze rozwiązanie. Zobacz https://gist.github.com/colindean/5213685/#comment-882885 :

„pamiętaj, że jeśli z jakiegoś powodu nie chcesz scp, najłatwiejszym sposobem przesłania plików z hosta na maszynę wirtualną jest po prostu umieszczenie ich w tym samym katalogu co plik Vagrantfile - katalog ten jest automatycznie montowany w katalogu / vagrant na maszynie wirtualnej, więc możesz je skopiować lub użyć bezpośrednio z maszyny wirtualnej. ”

Eric P.
źródło
3
To jest dokładnie to, co robi moja odpowiedź ... uruchamia program inicjujący powłokę, aby skopiować plik z / vagrant /.
LeeXGreen,
2
Lepiej jest korzystać z błędnej obsługi administracyjnej, tak jak to robił LeexGreen.
tokhi
4
Upewnij się, że config.vm.synced_folder ".", "/vagrant", disabled: falsei wtedyvagrant reload
Christopher Markieta
to ma nie działać na centos/7polu Vagrant jeśli staramy się robić operacji odwrotnej (włóczęga skrzynki na lokalnym komputerze).
ryantuck
Działa to dla mnie idealnie podczas kopiowania pliku z mojej błędnej maszyny Wirtualnej Ubuntu 14 na mój host. Dzięki!!
XtraSimplicity
98

Domyślnie pierwsza błędna instancja 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)

Możesz więc uruchomić poniższe polecenie, aby skopiować plik lokalny do błędnej instancji. hasło jest takie samo jak nazwa użytkownika vagrant.

scp -P 2222 your_file [email protected]:.

Możesz także skopiować plik z powrotem na lokalnego hosta.

scp -P 2222 [email protected]:/PATH/filename .
BMW
źródło
3
Musiałem to zrobić i wyłączyć ścisłe sprawdzanie kluczy:scp -P 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no my-file.txt [email protected]:/tmp
Matt
Polecę dodać te opcje ssh ~/.ssh/configjako domyślne, co zrobiłem w moim środowisku:StrictHostKeyChecking no
BMW
1
+1 + Jeśli jedna ma więcej niż jedną maszynę wirtualną, wartość portu należy pobrać z interfejsu użytkownika Oracle VM VirtualBox Manager - wybierz vm po lewej, ustawienia, sieć, przekierowanie portów
Yordan Georgiev
1
To jest lepsze niż zaakceptowana odpowiedź. Katalog / vagrant nie zawsze tam jest.
jimm101
Zaskakujące, jak trudniej jest rsyncw tym przypadku pracować w porównaniu z tym scp, biorąc pod uwagę opis rsync jako „szybszego, elastycznego zamiennika rcp”.
Wildcard,
56

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 scp:

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

Mam nadzieję, że to pomoże,

alfredocambera
źródło
4
To jest najprostszy sposób. Dziękuję Ci.
elmonkeylp
2
Użycie klucza pozwoliło mi przesłać plik. Wyższa odpowiedź bez tych informacji nie działała, więc dziękuję!
inostia
1
Proste i kompletne rozwiązanie.
Tao Starbow
27

Skończyło się to na tym, że trzymałem ten plik w moim błędnym katalogu (automatycznie montowanym jako / vagrant /) i kopiowałem go za pomocą dostawcy powłoki:

command = "cp #{File.join('/vagrant/', path_within_repo)} #{remote_file}"
config.vm.provision :shell, :inline => command
LeeXGreen
źródło
4
Polecam użycie coreutils installnp. Src install -D -m644 -C ...dest. zamiast cp, ponieważ możesz robić takie rzeczy, jak określanie uprawnień, własność, automatyczne tworzenie wiodących katalogów, robienie kopii tylko wtedy, gdy plik wymaga aktualizacji itp. zamiast cp, co jest proste i w porządku, jeśli to wszystko musieć zrobić.
Xenoterracide
@LeeXGreen. Próbuję zrobić to samo, co próbowałaś zrobić, ale nie bardzo rozumiem twoją odpowiedź. Czy wpisałeś ten wiersz kodu w terminalu? Gdzie dokładnie to umieściłeś?
Dan Rubio
Fragment kodu z mojej odpowiedzi znajduje się Vagrantfilewraz z pozostałymi dostawcami. Trzeba wymienić path_within_repoi remote_filerzeczy, które mają sens, dla danej aplikacji, oczywiście :)
LeeXGreen
Działa, ale pojawia się błąd „default: stdin: is not tty”
radtek
20

Jeśli nie masz dostępu do 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 musisz tylko zmienić /File/To/Copyplik lub pliki, które chcesz skopiować, a następnie/Where/To/Put/File jest to lokalizacja na maszynie wirtualnej, do której chcesz skopiować pliki.

Jeśli utworzysz ten plik i wywołasz go copyToServer.sh, możesz uruchomić shpolecenie wypchnięcia tych plików.

sh ./copyToServer.sh

Na koniec nie można uruchomić tego kodu, provisionerponieważ działa on na serwerze gościa, podczas gdy ten kod działa z hosta.

Geedew
źródło
1
Jest to prawdopodobnie najlepsze rozwiązanie poza instalowaniem wtyczki vagrant-scp. Korzysta z konfiguracji SSH, z której korzysta Vagrant, aby obsługiwać różne konfiguracje sieciowe dostarczane przez różnych dostawców.
Sandy Chapman
1
Miły! Sugeruję również, aby pamiętać, że ludzie mogą po prostu pobrać dane wyjściowe vagrant ssh-configi wkleić je do swojego pliku ~ / .ssh / config, aby uczynić to jeszcze łatwiejszym w przyszłości. To
znaczy
2
Stwierdziłem, że konieczne jest pominięcie pierwszego wiersza wyjścia ssh-config, aby uniknąć błędu „Dyrektywa hosta nie jest obsługiwana jako opcja wiersza polecenia” - spowodowana nagłówkiem sekcji ssh-config: „Domyślne hosta”. Więc mój skrypt musi OPTIONS=`vagrant ssh-config | tail -n +2 | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`ominąć użycie pierwszego wiersza wyniku ssh-config.
troyfolger
1
Alternatywnie, aby usunąć błąd „Dyrektywa hosta nieobsługiwany”, można użyć OPTIONS=`vagrant ssh-config | grep -v '^Host ' | awk -v ORS=' ' 'NF{print "-o " $1 "=" $2}'`zgodnie z dokumentacją tutaj: gist.github.com/geedew/11289350
user783836
10

Vagrant zapewnia sposób wykonywania komendy ssh zamiast logowania, więc w przypadku hosta i gościa systemu Linux 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 potrzebujesz wtyczek ani przeładowań gości. Po prostu upewnij się, że podałeś identyfikator skrzynki „Vagrant ssh”, jeśli nie jesteś w tym samym katalogu, co plik Vagrantfile. Testowane na Vagrant v1.8.1.

użytkownik7962684
źródło
Podejście od gościa do gospodarza nie zachowuje specjalnych symboli w plikach
Dr.X
9

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ą vagrant ssh-configpolecenia.

chf
źródło
1
Bardzo pomocny i pomaga wyjaśnić, co się dzieje. Pozwala to na kopiowanie obu kierunków, wykonywanie kopii rekurencyjnych itp. I ładnie wykorzystuje istniejącą wiedzę na temat scp / ssh
nealmcb
1
Właśnie ponownie przeczytałem powyższe odpowiedzi i odkryłem, grając z odpowiedzią geedew, która vagrant ssh-configdaje ci jeszcze bardziej kompletną i wygodniejszą konfigurację, którą możesz umieścić w swoim ~ / .ssh / config. Ale jeszcze raz dziękuję!
nealmcb,
7

Przejdź do katalogu, w którym masz swój Vagrantfile
Następnie, edytuj swójVagrantfile i dodaj:

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

„.” oznacza katalog, w którym aktualnie znajdujesz się na komputerze- hoście
„/ vagrant” odnosi się do „/ home / vagrant” na maszynie gościa (maszynie Vagrant).

Skopiuj pliki, które chcesz wysłać na maszynę gościa, do folderu, w którym masz swój. Vagrantfile Następnie otwórz Git Bash i cddo katalogu, w którym masz swój, Vagrantfilei wpisz:

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

gdzie XXXXXXX to nazwa twojej maszyny wirtualnej . Możesz uzyskać swoją nazwę VM uruchamiając

vagrant global-status
akshaynagpal
źródło
7

jeśli z jakichś powodów nie masz pozwolenia na korzystanie

vagrant plugin install vagrant-scp

istnieje alternatywny sposób:

Najpierw włóczkuj swój VagrantProject , a następnie napisz w terminalu:

vagrant ssh-config

będziesz mieć informacje na temat „HostName” i „Port” twojej maszyny wirtualnej.

W niektórych przypadkach w twoim projekcie mogą znajdować się maszyny wirtualne. Więc po prostu znajdź swoją maszynę nadrzędną (ogólnie ta maszyna wirtualna ma port 2222) i nie zwracaj uwagi na informacje innych maszyn.

napisz polecenie, aby wykonać kopię:

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

Na tym stromiu będziesz musiał podać błędne hasło: domyślnie jest to „włóczęga”

po tym, jeśli spojrzysz na pliki na maszynie wirtualnej:

vagrant ssh xxVirtualMachineNamexx
pwd
ls

będziesz mieć plik „file.txt” w katalogu maszyny wirtualnej

slideWXY
źródło
po wprowadzeniu błędnego hasła otrzymuję komunikat „Odmowa
dostępu
2
ale wynikało to z uprawnień do docelowego katalogu. Skopiowałem do / home / vagrant i to zadziałało.
user2568374
4

vagrant plugin scp działa, jeśli znasz nazwę swojego błędnego pudełka. sprawdź błędny status globalny, który poda nazwę twojego pudełka, a następnie możesz uruchomić:

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

vagrant scp ~ / foobar „nazwa w moim przypadku domyślna”: / home / „użytkownik” /

Bálint Szigeti
źródło
1
to działało dla mnie. edycja jest również pomocna, dołączę także polecenie instalacji plugawej wtyczki scp.
Dlaczego Ayala
1

Spróbuj tego .. włóczęga ubuntu 14.04 To zadziałało dla mnie.

scp -r -P 2222 vagrant@localhost:/home .
Caliari
źródło
1

Alternatywny sposób na zrobienie tego bez instalowania czegokolwiek ( vagrant-scpitp.) Należy pamiętać, że nazwa defaultmusi być używana bez zmian , ponieważ ją vagrant ssh-configemituje.

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 konieczna, gdyby scp -F =(vagrant ssh-config) ...działała w różnych powłokach. Ponieważ jednak Bash tego nie obsługuje, musimy zastosować to obejście.

Gurjeet Singh
źródło
1

Jeśli ktoś chce przenieść plik z hosta Windows do włóczęgi, to rozwiązanie zadziałało dla mnie.

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.

Powinieneś być w stanie zobaczyć katalogi na swojej błędnej maszynie.

Lufy
źródło
-3

Najlepszy sposób na skopiowanie pliku z lokalnego na włóczęgowaty, bez potrzeby pisania kodu, żadnych zmian lub zmian w konfiguracji. 1- Najpierw włóczęga ( włóczęga ) 2- otwórz cygwin 3- cygwin: przejdź do folderu, w którym znajduje się plik włóczęgi lub skąd uruchamiasz włóczęgę 4- ssh włóczęga 5- teraz będzie działać jak normalny system.

D-2020365
źródło
Odkryłem jeden problem z tym podejściem: jeśli włóczęga musi skonfigurować dodatki dla gości, katalog / vagrant może nie zostać faktycznie podłączony podczas działania dostawcy plików.
Torenware Networks,