Il modo più semplice per copiare un singolo file dall'host al guest Vagrant?


241

Ho un caso d'uso in cui occasionalmente desidero copiare un singolo file dal mio computer host al guest Vagrant.

Non voglio farlo tramite i tradizionali provisioner (Puppet / Chef) perché questo è spesso una tantum - voglio solo qualcosa di veloce da aggiungere al mio Vagrantfile.

Non voglio condividere un'intera directory, forse perché voglio sovrascrivere un file esistente senza eseguire il backup di un'intera directory sul guest.

Sembra anche un po 'eccessivo scrivere uno script di provisioning della shell e gestire l'eventuale evasione, quando tutto quello che voglio fare è copiare un file.

Quindi, qual è il modo più semplice per copiare un singolo file dall'host al guest?


si noti che la risposta accettata si basa su Vagrant 1.x: l' utilizzo di un file provisioner è l'approccio standard di Vagrant 2 , sebbene la modifica del punto di montaggio /vagrant come menzionato qui possa anche essere una buona opzione
STW

3
La risposta di @jouell merita davvero più voti per il semplice caso d'uso di una copia una tantum di un singolo file: vagrant upload /path/to/my/file...
dat

vagrant scp file.txt :~/.
AlikElzin-Kilaka,

Risposte:


107

Invece di utilizzare un provisioner di shell per copiare il file, è anche possibile utilizzare un provisioner di file Vagrant .

Nome del fornitore: "file"

Il file provisioner consente di caricare un file dal computer host al computer guest.

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

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

3
Questo è sicuramente il modo migliore per farlo in Vagrant 2! Tuttavia, Vagrant 2 non era disponibile al momento in cui avevo bisogno di farlo ... :)
LeeXVerde

4
Questa soluzione sembra buona, ma non riesco a copiare alcun file a causa di errori di autorizzazione.
Orbatschow,

@orbatschow Ho avuto lo stesso problema, ma non se l'avessi copiato/tmp
Ben

6
questo non è ciò che l'OP ha chiesto. la domanda era come trasferire occasionalmente i file; dover eseguire il provisioning è eccessivo.
axd

253

Dato che chiedi il modo più semplice, ti suggerisco di usare vagrant-scp . Aggiunge un comando scp a Vagrant, in modo da poter copiare i file sulla VM come faresti normalmente con scp.

Installa tramite:

vagrant plugin install vagrant-scp

Usalo così:

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

1
Questo non ha funzionato per me. Ho installato il plug-in, ma ho continuato a ricevere un errore che diceva "Impossibile trovare il plug-in" vagrant-scp ". Assicurati che sia installato correttamente tramite vagrant plugin".
Rockerston,

6
Ciao Rod, vagrant-scp funziona con Vagrant 1.7+. Dal bug che hai aperto, stai eseguendo 1.4.3. Se hai bisogno di questo plugin, temo che dovrai aggiornare (che è veloce e indolore).
Luca Invernizzi,

1
Ho provato questo comando per copiare i file ma non ha funzionato e dando errore vagrant scp /vagrant/www/koushik.php ubuntu/trusty64:/usr/share/nginx/htmlSto provando a copiare i file nella directory principale di nginx. Dice: The machine with the name 'C' was not found configured for this Vagrant environment. La directory e tutto va bene.
Koushik Das,

3
Una cosa da aggiungere: devi usare l'ID della macchina che puoi ottenere con lo stato globale vagabondo nella prima colonna. Tuttavia, questa è la migliore soluzione imho.
min hundje,

1
@KoushikDas Non funziona su Windows. Devi abilitare il sottosistema Ubuntu su Windows 10, quindi invece di inserire C: / .. per il percorso del file, inserisci / mnt / c / ... E funziona evviva! Nota anche l'altro commento, usa lo stato globale vagabondo per ottenere l'id della macchina vagabonda.
Andrew,

141

In realtà esiste una soluzione molto più semplice. Vedi https://gist.github.com/colindean/5213685/#comment-882885 :

"per favore nota che, a meno che tu non voglia specificamente scp per qualche motivo, il modo più semplice per trasferire file dall'host alla VM è semplicemente metterli nella stessa directory del Vagrantfile - quella directory viene montata automaticamente sotto / vagrant nella VM così puoi copiarli o usarli direttamente dalla VM. "


3
Questo è esattamente ciò che fa la mia risposta ... esegue un provider di shell per copiare il file da / vagrant /.
LeeXVerde

2
È meglio usare il provisioning vagabondo come hanno usato LeexGreen.
Tokyo

4
Assicurati che config.vm.synced_folder ".", "/vagrant", disabled: falsee poivagrant reload
Christopher Markieta,

questo non funziona sulla centos/7scatola del vagabondo se si tenta di eseguire l'operazione inversa (scatola del vagabondo sulla macchina locale).
Ryantuck,

Questo funziona perfettamente per me quando copio un file dalla mia VM vagabonda Ubuntu 14 al mio host. Grazie!!
XtraSimplicity,

98

Come impostazione predefinita, la prima istanza di Vagrant utilizza la porta ssh come 2222 e il suo indirizzo IP è 127.0.0.1 (potrebbe essere necessario regolare la porta con un host virtuale reale)

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

Quindi puoi eseguire il comando seguente per copiare il tuo file locale nell'istanza di Vagrant. la password è uguale al nome utente che è vagrant.

scp -P 2222 your_file vagrant@127.0.0.1:.

È inoltre possibile copiare il file nuovamente sull'host locale.

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

3
Ho dovuto fare questo e disabilitare il controllo chiave rigoroso:scp -P 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no my-file.txt matt@127.0.0.1:/tmp
Matt

Consiglierò di aggiungere queste opzioni ssh ~/.ssh/configcome predefinite, cosa che ho fatto nel mio ambiente:StrictHostKeyChecking no
BMW

1
+1 + Se uno ha più di una macchina virtuale, il valore della porta dovrebbe essere preso dall'interfaccia utente di Oracle VM VirtualBox Manager - selezionare vm a sinistra, impostazioni, rete, port forwarding
Yordan Georgiev

1
Questo è meglio della risposta accettata. La directory / vagrant non è sempre lì.
jimm101,

Sorprendente quanto sia più difficile rsynclavorare in questo caso rispetto a scp, data la descrizione di rsync come "sostituzione più rapida e flessibile per rcp".
Wildcard il

56

Ecco il mio approccio al problema:

Passaggio 1: trova la chiave privata, la porta ssh e l'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

Passaggio 2: trasferire il file utilizzando la porta e la chiave privata come parametri per scp:

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

Spero possa essere d'aiuto,


4
Questo è il modo più semplice. Grazie.
elmonkeylp,

2
L'uso della chiave mi ha permesso di trasferire il file. La risposta più alta senza queste informazioni non ha funzionato, quindi grazie!
inostia,

1
Soluzione semplice e completa.
Tao Starbow,

27

Quello che ho finito per fare è stato mantenere il file nella mia directory di Vagrant (montato automaticamente come / vagrant /) e copiarlo con un provider di shell:

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

4
Consiglierei di usare coreutils, installad esempio install -D -m644 -C ...src dest. invece di cp, perché puoi fare cose come specificare i permessi, la proprietà, creare automaticamente le directory principali, fare la copia solo se il file deve essere aggiornato, ecc ... invece di cp, che è semplice e va bene se questo è tutto bisogno di fare.
xenoterracide,

@LeeXGreen. Sto cercando di fare la stessa cosa che stavi cercando di fare, ma non ho ancora ricevuto la tua risposta. Hai digitato quella riga di codice nel terminale? Dove l'hai posizionato esattamente?
Dan Rubio,

Lo snippet di codice della mia risposta va nel tuo Vagrantfileinsieme agli altri tuoi fornitori. Dovrai sostituire path_within_repoe remote_filecon cose che hanno senso, per la tua applicazione, ovviamente :)
LeeXVerde

Funziona ma ottengo l'errore "predefinito: stdin: non è un tty"
radtek


20

Se non si dispone di file nella directory, è possibile eseguire questo codice in un file di script dal computer host.

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

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

In questa configurazione, è sufficiente modificare /File/To/Copyil file o i file che si desidera copiare e quindi/Where/To/Put/File la posizione sulla VM in cui si desidera copiare i file.

Se si crea questo file e lo copyToServer.shsi chiama, è quindi possibile eseguire il shcomando per inviare tali file.

sh ./copyToServer.sh

Come nota finale, non è possibile eseguire questo codice come provisionerperché viene eseguito sul server Guest, mentre questo codice viene eseguito dall'host.


1
Questa è probabilmente la migliore soluzione al di fuori dell'installazione del plug-in vagrant-scp. Utilizza la configurazione SSH utilizzata da Vagrant in modo da poter gestire le diverse configurazioni di rete fornite da diversi provider.
Sandy Chapman,

1
Bello! Ti suggerisco anche di notare che le persone possono semplicemente prendere l'output vagrant ssh-confige incollarlo nel loro file ~ / .ssh / config, per renderlo ancora più facile in futuro. Cioè combinando questo con la risposta di chf
nealmcb,

2
Ho trovato necessario saltare la prima riga dell'output di ssh-config per evitare l'errore "Direttiva host non supportata come opzione della riga di comando" - causato dall'intestazione per la sezione ssh-config: "Host default". Quindi, il mio script deve OPTIONS=`vagrant ssh-config | tail -n +2 | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`omettere di usare quella prima riga dell'output di ssh-config.
troyfolger

1
In alternativa, per rimuovere l'errore "Direttiva host non supportata" è possibile utilizzare OPTIONS=`vagrant ssh-config | grep -v '^Host ' | awk -v ORS=' ' 'NF{print "-o " $1 "=" $2}'`come documentato qui: gist.github.com/geedew/11289350
user783836

10

Vagrant fornisce un modo per eseguire un comando su ssh invece di accedere, quindi per host e guest Linux puoi usare:

  • da ospite a ospite:

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

  • da ospite a ospite:

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

Non sono necessari plug-in o ricariche guest. Assicurati di fornire l'identificativo della casella vagabondo a "vagrant ssh" se non sei nella stessa directory del file Vagrant. Testato su Vagrant v1.8.1.


L'approccio da ospite a ospite non conserva simboli speciali nei file
Dr.X

9

È possibile aggiungere la voce in ~/.ssh/config:

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

e il semplice scp file vagrant:/path/. È possibile trovare il percorso del file di identità utilizzando il vagrant ssh-configcomando.


1
Molto utile e aiuta a chiarire cosa sta succedendo. Questo ti consente di copiare entrambe le direzioni, fare copie ricorsive, ecc. E sfrutta bene le conoscenze esistenti di scp / ssh
nealmcb,

1
Ho appena riletto le risposte sopra e scoperto giocando con la risposta di Geedew che vagrant ssh-configti dà una configurazione ancora più completa e comoda che puoi inserire nella tua ~ / .ssh / config. Ma grazie ancora!
nealmcb,

7

Vai alla directory in cui hai il tuo Vagrantfile
Quindi, modifica il tuo Vagrantfilee aggiungi quanto segue:

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

"" indica che la directory in cui ci si trova attualmente nella macchina host
"/ vagrant" si riferisce a "/ home / vagrant" sulla macchina ospite (macchina Vagrant).

Copia i file che devi inviare al computer guest nella cartella in cui hai il tuo Vagrantfile Quindi apri Git Bash e cdnella directory in cui hai il tuo Vagrantfilee digita:

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

dove XXXXXXX è il tuo nome VM . Puoi ottenere il tuo nome VM eseguendo

vagrant global-status

7

se per qualche motivo non hai il permesso di usare

vagrant plugin install vagrant-scp

c'è un modo alternativo:

Prima vagrant up yourVagrantProject , quindi scrivere nel terminale:

vagrant ssh-config

avrai informazioni su "Nomehost" e "Porta" della tua macchina virtuale.

In alcuni casi, potresti avere alcune macchine virtuali nel tuo progetto. Quindi trova la tua macchina principale (in generale, questa macchina virtuale ha la porta 2222) e non prestare attenzione alle informazioni di altre macchine.

scrivere il comando per effettuare la copia:

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

A questo punto dovrai inserire una password vagabonda: per impostazione predefinita è "vagabonda"

dopodiché se guardi i file nella tua macchina virtuale:

vagrant ssh xxVirtualMachineNamexx
pwd
ls

avrai "file.txt" nella directory della tua macchina virtuale


dopo aver inserito la password vagabonda ricevo "Autorizzazione negata"
user2568374

2
ma ciò era dovuto alle autorizzazioni sulla directory di destinazione. Ho copiato in / home / vagrant e ha funzionato.
user2568374

4

il plugin vagrant scp funziona se conosci il nome della tua casella vagabondo. controlla lo stato globale vagabondo che fornirà il nome della tua casella, quindi puoi eseguire:

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

vagrant scp ~ / foobar "nome nel mio caso predefinito": / home / "utente" /


1
questo ha funzionato per me. anche la modifica è utile, includerei anche il comando per installare il plug-in vagrant scp.
WhyAyala

1

Prova questo .. vagrant ubuntu 14.04 Questo ha funzionato per me.

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

1

Un modo alternativo per farlo senza installare nulla ( vagrant-scpecc.) Nota che il nome defaultdeve essere usato così com'è, poiché lo vagrant ssh-configemette.

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

La funzione non sarebbe necessaria se scp -F =(vagrant ssh-config) ...avesse funzionato su più shell. Ma poiché questo non è supportato da Bash, dobbiamo ricorrere a questa soluzione alternativa.


1

Se qualcuno vuole trasferire file da host di Windows a Vagrant, allora questa soluzione ha funzionato per me.

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.

Dovresti essere in grado di vedere le directory nella tua macchina vagabonda.


-3

Il modo migliore per copiare il file da locale a vagabondo, Non è necessario scrivere alcun codice o qualsiasi cosa o eventuali modifiche alla configurazione. 1- Primo su il vagabondo (su vagabondo su ) 2- apri cygwin 3- cygwin: vai nella tua cartella dove è vagrantfile o da dove lanci il vagabondo 4- ssh vagrant 5- ora funzionerà come un normale sistema.


Un problema che ho scoperto con questo approccio: se Vagrant deve configurare le Aggiunte Guest, la directory / vagrant potrebbe non essere effettivamente montata durante l'esecuzione del provisioner di file.
Torenware Networks,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.