¿La forma más fácil de copiar un solo archivo del host al invitado Vagrant?


241

Tengo un caso de uso en el que ocasionalmente quiero copiar un solo archivo de mi máquina host al huésped Vagrant.

No quiero hacerlo a través de aprovisionadores tradicionales (Puppet / Chef) porque esto es a menudo único; solo quiero algo rápido para agregar a mi Vagrantfile.

No quiero compartir un directorio completo, posiblemente porque quiero sobrescribir un archivo existente sin destruir un directorio completo en el invitado.

También parece un poco exagerado escribir un script de aprovisionamiento de shell y lidiar con posibles escapes, cuando todo lo que quiero hacer es copiar un archivo.

Entonces, ¿cuál es la forma más fácil de copiar un solo archivo del host al invitado?


tenga en cuenta que la respuesta aceptada se basa en Vagrant 1.x: el uso de un aprovisionador de archivos es el enfoque estándar de Vagrant 2 , aunque cambiar el punto de montaje /vagrant como se menciona aquí también puede ser una buena opción
STW

3
La respuesta de @jouell realmente merece más útiles para el caso simple uso de una copia de un archivo único de una sola vez: vagrant upload /path/to/my/file...
dat

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

Respuestas:


107

En lugar de usar un aprovisionador de shell para copiar el archivo, también puede usar un aprovisionador de archivos Vagrant .

Nombre del aprovisionador: "file"

El aprovisionador de archivos le permite cargar un archivo desde la máquina host a la máquina invitada.

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

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

3
¡Esta es definitivamente la mejor manera de hacer esto en Vagrant 2! Sin embargo, Vagrant 2 no estaba disponible en el momento en que necesitaba hacer esto ... :)
LeeXGreen

44
Esta solución suena bien, pero no puedo copiar ningún archivo debido a errores de permiso.
orbatschow

@orbatschow Tuve el mismo problema, pero no si lo copié a él/tmp
Ben

66
esto no es lo que pidió el OP. la pregunta era cómo transferir archivos ocasionalmente ; tener que ejecutar el aprovisionamiento es excesivo.
axd

253

Como solicita la forma más fácil, le sugiero que use vagrant-scp . Agrega un comando scp a vagrant, para que pueda copiar archivos a su VM como lo haría normalmente con scp.

Instalar a través de:

vagrant plugin install vagrant-scp

Úselo así:

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

1
Esto no funcionó para mí. Instalé el complemento, pero seguí recibiendo un error que decía "No se pudo encontrar el complemento" vagrant-scp ". Asegúrese de que esté instalado correctamente a través de vagrant plugin".
Rockerston

66
Hola Rod, vagrant-scp funciona con Vagrant 1.7+. Desde el error que abriste, estás ejecutando 1.4.3. Si necesita este complemento, me temo que tendrá que actualizar (que es rápido e indoloro).
Luca Invernizzi

1
Intenté este comando para copiar archivos pero no funcionó y, al dar error vagrant scp /vagrant/www/koushik.php ubuntu/trusty64:/usr/share/nginx/html, estoy tratando de copiar archivos en el directorio raíz de nginx. Dice: The machine with the name 'C' was not found configured for this Vagrant environment. El directorio y todo está bien.
Koushik Das

3
Una cosa para agregar: debe usar la ID de la máquina que puede obtener con el estado global vagabundo en la primera columna. No obstante, esta es la mejor solución en mi humilde opinión.
min hundje

1
@KoushikDas No funciona de fábrica en Windows. Debe habilitar el subsistema de Ubuntu en Windows 10, y luego, en lugar de poner C: / .. para la ruta del archivo, debe poner / mnt / c / ... ¡Y funciona! También tenga en cuenta el otro comentario, use vagrant global-status para obtener la identificación de la máquina vagabunda.
Andrew

141

En realidad, hay una solución mucho más simple. Ver https://gist.github.com/colindean/5213685/#comment-882885 :

"tenga en cuenta que, a menos que desee específicamente scp por alguna razón, la forma más fácil de transferir archivos desde el host a la VM es simplemente colocarlos en el mismo directorio que el Vagrantfile: ese directorio se monta automáticamente en / vagrant en la VM, por lo que puede copiarlos o usarlos directamente desde la VM ".


3
Esto es exactamente lo que hace mi respuesta ... ejecuta un aprovisionador de shell para copiar el archivo desde / vagrant /.
LeeXGreen

2
Es mejor usar el aprovisionamiento vagabundo como lo ha usado LeexGreen.
tokhi

44
Asegúrese de eso config.vm.synced_folder ".", "/vagrant", disabled: falsey luegovagrant reload
Christopher Markieta

esto no funciona en el centos/7cuadro vagabundo si intenta hacer la operación inversa (cuadro vagabundo a la máquina local).
Ryan Tuck el

Esto funciona perfectamente para mí cuando copio un archivo de mi VM vagabunda Ubuntu 14 a mi host. ¡¡Gracias!!
XtraSimplicity

98

De manera predeterminada, la primera instancia vagabunda usa el puerto ssh como 2222, y su dirección IP es 127.0.0.1 (es posible que deba ajustar el puerto con un host virtual real)

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

Por lo tanto, puede ejecutar el siguiente comando para copiar su archivo local a una instancia vagabunda. la contraseña es lo mismo que el nombre de usuario que es vagrant.

scp -P 2222 your_file vagrant@127.0.0.1:.

También puede copiar el archivo a su host local.

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

3
Tuve que hacer esto y deshabilitar la comprobación estricta de claves:scp -P 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no my-file.txt matt@127.0.0.1:/tmp
Matt

Recomendaré agregar estas opciones ssh por ~/.ssh/configdefecto, lo cual hice en mi entorno:StrictHostKeyChecking no
BMW

1
+1 + Si uno tiene más de una máquina virtual, el valor del puerto debe tomarse de la interfaz de usuario de Oracle VM VirtualBox Manager - seleccione vm a la izquierda, configuración, red, reenvío de puerto
Yordan Georgiev

1
Esto es mejor que la respuesta aceptada. El directorio / vagrant no siempre está ahí.
jimm101

Sorprende lo difícil que es llegar rsynca trabajar en este caso en comparación con scpla descripción de rsync como "un reemplazo más rápido y flexible para rcp".
Comodín el

56

Aquí está mi enfoque del problema:

Paso 1 - Encuentra la clave privada, el puerto ssh y la 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

Paso 2 - Transfiera el archivo usando el puerto y la clave privada como parámetros para scp:

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

Espero que ayude,


44
Esta es la forma más simple. Gracias.
elmonkeylp

2
Usar la tecla me permitió transferir el archivo. La respuesta más alta sin esta información no funcionó, ¡así que gracias!
inostia

1
Solución fácil y completa.
Tao Starbow

27

Lo que terminé haciendo fue mantener el archivo dentro de mi directorio vagabundo (montado automáticamente como / vagrant /) y copiarlo con un aprovisionador de shell:

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

44
Recomiendo usar coreutils, installpor ejemplo, install -D -m644 -C ...src dest. en lugar de cp, porque puede hacer cosas como especificar los permisos, la propiedad, crear automáticamente los directorios principales, solo hacer la copia si el archivo necesita ser actualizado, etc ... en lugar de cp, que es simple y correcto si eso es todo necesito hacer.
xenoterracide

@LeeXGreen. Estoy tratando de hacer lo mismo que intentabas hacer, pero no entiendo tu respuesta. ¿Escribiste esa línea de código en la terminal? ¿Dónde exactamente colocaste eso?
Dan Rubio

El fragmento de código de mi respuesta va Vagrantfilejunto a sus otros proveedores. Necesitará reemplazar path_within_repoy remote_filecon cosas que tengan sentido, para su aplicación, por supuesto :)
LeeXGreen

Funciona pero aparece el error "predeterminado: stdin: no es un tty"
radtek


20

Si no puede tener los archivos en su directorio, puede ejecutar este código en un archivo de script desde la máquina 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

En esta configuración, solo necesita cambiar /File/To/Copyel archivo o archivos que desea copiar y luego /Where/To/Put/Filees la ubicación en la VM en la que desea copiar los archivos.

Si crea este archivo y lo llama, copyToServer.shpuede ejecutar el shcomando para enviar esos archivos.

sh ./copyToServer.sh

Como nota final, no puede ejecutar este código provisionerporque se ejecuta en el servidor Invitado, mientras que este código se ejecuta desde el Host.


1
Esta es probablemente la mejor solución fuera de instalar el complemento vagrant-scp. Utiliza la configuración SSH que utiliza Vagrant para poder manejar las diferentes configuraciones de red proporcionadas por diferentes proveedores.
Sandy Chapman

1
¡Agradable! Le sugiero que también tenga en cuenta que las personas simplemente pueden tomar la salida vagrant ssh-configy pegarla en su archivo ~ / .ssh / config, para hacer esto aún más fácil en el futuro. Es decir, combinar esto con la respuesta de
chf

2
He descubierto que es necesario omitir la primera línea de la salida de ssh-config para evitar el error "La directiva de host no es compatible como una opción de línea de comandos", causada por el encabezado de la sección ssh-config: "Host default". Entonces, mi script tiene OPTIONS=`vagrant ssh-config | tail -n +2 | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`que omitir el uso de esa primera línea de salida ssh-config.
troyfolger

1
Alternativamente, para eliminar el error "No se admite la directiva de host", puede usar OPTIONS=`vagrant ssh-config | grep -v '^Host ' | awk -v ORS=' ' 'NF{print "-o " $1 "=" $2}'`como se documenta aquí: gist.github.com/geedew/11289350
user783836

10

Vagrant proporciona una forma de ejecutar un comando a través de ssh en lugar de iniciar sesión, por lo que para el host y el invitado de Linux puede usar:

  • de anfitrión a invitado:

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

  • de invitado a anfitrión:

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

No hay necesidad de complementos o recargas de invitados. Solo asegúrese de proporcionar la ID de la caja vagabunda a 'vagrant ssh' si no está en el mismo directorio que el archivo Vagrantfile. Probado en Vagrant v1.8.1.


El enfoque de invitado a host no conserva símbolos especiales en los archivos
Dr.X

9

Puede agregar una entrada en ~/.ssh/config:

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

Y lo simple scp file vagrant:/path/. Puede encontrar la ruta al archivo de identidad con el vagrant ssh-configcomando.


1
Muy útil y ayuda a aclarar lo que está sucediendo. Esto le permite copiar ambas direcciones, hacer copias recursivas, etc. y aprovecha muy bien el conocimiento existente de scp / ssh
nealmcb

1
Acabo de volver a leer las respuestas anteriores y descubrí jugando con la respuesta de Geedew que vagrant ssh-configte da una configuración aún más completa y conveniente recortada que puedes poner en tu ~ / .ssh / config. Pero gracias de nuevo!
nealmcb

7

Vaya al directorio donde tiene su Vagrantfile
Entonces, edite su Vagrantfiley agregue lo siguiente:

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

"." significa que el directorio en el que se encuentra actualmente en su máquina host
"/ vagrant" se refiere a "/ home / vagrant" en la máquina invitada (máquina Vagrant).

Copie los archivos que necesita enviar a la máquina invitada a la carpeta donde tiene su Vagrantfile A continuación, abra Git Bash y cdal directorio donde tiene su Vagrantfiley escriba:

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

donde XXXXXXX es tu nombre vm . Puede obtener su nombre de VM ejecutando

vagrant global-status

7

si por alguna razón no tienes permiso para usar

vagrant plugin install vagrant-scp

hay una forma alternativa:

Primero vague su proyecto de vagabundo , luego escriba en el terminal:

vagrant ssh-config

tendrá información sobre "HostName" y "Port" de su máquina virtual.

En algunos casos, podría tener algunas máquinas virtuales en su proyecto. Así que solo encuentre su máquina maestra (en general, esta VM tiene el puerto 2222), y no preste atención a la información de otras máquinas.

escribe el comando para hacer la copia:

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

En este empinado tendrá que poner una contraseña vagabunda: por defecto es "vagabundo"

después de eso si mira los archivos en su máquina virtual:

vagrant ssh xxVirtualMachineNamexx
pwd
ls

tendrá el "archivo.txt" en el directorio de su máquina virtual


después de poner en contraseña vagabundo que estoy recibiendo "Permiso denegado"
user2568374

2
pero esto se debió a los permisos en el directorio de destino. Copié a / home / vagrant y eso funcionó.
user2568374

4

El complemento scp vagabundo funciona si conoce el nombre del cuadro vagabundo. verifique el estado global vagabundo que proporcionará el nombre de su casilla y luego puede ejecutar:

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

vagabundo scp ~ / foobar "nombre en mi caso predeterminado": / home / "usuario" /


1
Esto funcionó para mí. la edición también es útil, también incluiría el comando para instalar el plugin scp vagabundo.
WhyAyala

1

Pruebe esto ... ubuntu vauntu 14.04 Esto funcionó para mí.

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

1

Una forma alternativa de hacerlo sin instalar nada ( vagrant-scpetc.) Tenga en cuenta que el nombre defaultdebe usarse tal cual, ya vagrant ssh-configque emite eso.

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 función no sería necesaria si scp -F =(vagrant ssh-config) ...hubiera funcionado en shells. Pero como Bash no lo admite, tenemos que recurrir a esta solución.


1

Si alguien quiere transferir el archivo del host de Windows al vagabundo, entonces esta solución me funcionó.

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.

Debería poder ver directorios en su máquina vagabunda.


-3

La mejor manera de copiar archivos de local a vagabundo, no es necesario escribir ningún código ni ninguna cosa ni ningún cambio de configuración. 1- Primero el vagabundo ( vagabundo arriba ) 2- abre cygwin 3- cygwin: ve a tu carpeta donde está vagrantfile o desde donde inicias el vagabundo 4- ssh vagrant 5- ahora funcionará como un sistema normal.


Un problema que he descubierto con este enfoque: si vagrant necesita configurar sus adiciones de invitado, el directorio / vagrant puede no estar realmente montado cuando se ejecuta el aprovisionador de archivos.
Torenware Networks
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.