Le moyen le plus simple de copier un seul fichier de l'hôte à L'invité Vagabond?

J'ai un cas d'utilisation où je veux parfois copier un seul fichier de ma machine hôte vers L'invité Vagabond.

Je ne veux pas le faire via des provisioners traditionnels (Puppet / Chef) parce que c'est souvent un one-off-Je veux juste quelque chose de rapide à ajouter à mon Vagrantfile.

Je ne veux pas partager un répertoire entier, peut-être parce que je veux écraser un fichier existant sans Nuker un répertoire entier sur l'invité.

Il semble aussi un peu exagéré d'écrire un shell provisioning script, et traiter les échappements potentiels, quand tout ce que je veux faire est de copier un fichier.

Alors, quel est le moyen le plus simple de copier un seul fichier d'hôte en invité?

191
demandé sur LeeXGreen 2013-05-23 05:07:08

15 réponses

Au Lieu d'utiliser un shell provisioner de copier le fichier, vous pouvez également utiliser un Vagabond fichier provisioner.

Nom du fournisseur: "file"

Le provisionneur de fichiers vous permet de télécharger un fichier de la machine hôte vers la machine invitée.

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

  config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig"
end
78
répondu lynnaloo 2015-11-07 16:35:06

Puisque vous demandez le moyen le plus simple, je suggère d'utiliser Vagrant-scp. Il ajoute une commande scp à vagrant, de sorte que vous pouvez copier des fichiers sur votre machine virtuelle comme vous le feriez normalement avec scp.

Installer via:

vagrant plugin install vagrant-scp

Utilisez-le comme ceci:

vagrant scp <some_local_file_or_dir> [vm_name]:<somewhere_on_the_vm>
192
répondu Luca Invernizzi 2015-08-26 19:57:22

Il existe en fait une solution beaucoup plus simple. Voir https://gist.github.com/colindean/5213685/#comment-882885:

" veuillez noter qu'à moins que vous ne souhaitiez spécifiquement scp pour une raison quelconque, le moyen le plus simple de transférer des fichiers de l'hôte vers la machine virtuelle est de les placer dans le même répertoire que le fichier Vagrant - ce répertoire est automatiquement monté sous /vagrant dans la machine virtuelle afin que vous puissiez les copier ou les utiliser directement"

125
répondu Eric P 2014-03-21 15:33:24

Par défaut, la première instance vagrant utilise le port SSH comme 2222, et son adresse ip est 127.0.0.1 (vous devrez peut-être ajuster le port avec l'hôte virtuel réel)

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

Vous pouvez donc exécuter la commande ci-dessous pour copier votre fichier local dans une instance vagrant. le mot de passe est le même que le nom d'utilisateur qui est vagrant.

scp -P 2222 your_file vagrant@127.0.0.1:.

Vous pouvez également copier le fichier sur votre hôte local.

scp -P 2222 vagrant@127.0.0.1:/PATH/filename .
82
répondu BMW 2018-04-19 00:58:05

Voici mon approche du problème:

Étape 1-Trouvez la clé privée, le port ssh et 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

Étape 2-Transférer le fichier en utilisant le port et la clé privée comme paramètres pour scp:

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

J'espère que ça aide,

45
répondu alfredocambera 2015-08-01 22:28:11

Ce que j'ai fini par faire était de garder le fichier dans mon répertoire vagrant (automatiquement monté comme / vagrant/) et de le copier avec un provisionneur shell:

command = "cp #{File.join('/vagrant/', path_within_repo)} #{remote_file}"
config.vm.provision :shell, :inline => command
27
répondu LeeXGreen 2013-05-23 05:14:32

Si vous êtes empêché d'avoir les fichiers dans votre répertoire, vous pouvez exécuter ce code dans un fichier de script à partir de la machine hôte.

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

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

Dans cette configuration, il vous suffit de modifier /File/To/Copy pour le ou les fichiers que vous souhaitez copier, puis /Where/To/Put/File est l'emplacement sur la machine virtuelle que vous souhaitez avoir les fichiers copiés.

Si vous créez ce fichier et l'appelez copyToServer.sh, Vous pouvez alors exécuter la commande sh pour pousser ces fichiers.

sh ./copyToServer.sh

Comme note finale, vous ne pouvez pas exécuter ce code provisioner parce que cela fonctionne sur le serveur invité, alors que ce code s'exécute à partir de L'hôte.

18
répondu geedew 2014-04-24 20:43:01

, Vous pouvez ajouter une entrée dans ~/.ssh/config:

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

Et lescp file vagrant:/path/. Vous pouvez trouver le chemin d'accès au fichier d'identité en utilisant la commande vagrant ssh-config.

9
répondu chf 2015-01-30 13:26:40

Vagrant fournit un moyen d'exécuter une commande sur ssh au lieu de se connecter, donc Pour Linux host et guest, vous pouvez utiliser:

  • de l'hôte à l'invité:

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

  • de l'invité à l'hôte:

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

Pas besoin de plugins ou de rechargements invités. Assurez-vous simplement de fournir vagrant box ID à 'vagrant ssh' si vous n'êtes pas dans le même répertoire que le Vagrantfile. Testé sur Vagrant v1. 8. 1.

9
répondu user7962684 2017-05-04 12:09:56

Si pour certaines raisons vous n'avez pas la permission d'utiliser

vagrant plugin install vagrant-scp

Il y a une autre façon:

D'abord vagrant up yourVagrantProject , puis écrivez dans le terminal:

vagrant ssh-config

Vous aurez des informations sur "HostName" et "Port" de votre machine virtuelle.

, Dans certains cas, vous pourriez avoir des machines virtuelles dans votre projet. Il suffit donc de trouver votre machine maîtresse (en général, cette machine virtuelle a le port 2222), et ne faites pas attention aux autres machines information.

Écrivez la commande pour faire la copie:

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

À cette pente, vous devrez mettre un mot de passe Vagabond : par défaut c'est "erratique"

Après cela, si vous regardez les fichiers dans votre machine virtuelle:

vagrant ssh xxVirtualMachineNamexx
pwd
ls

Vous aurez le fichier".txt " dans le répertoire de votre machine virtuelle

6
répondu slideWXY 2017-03-03 11:02:33

Allez dans le répertoire où vous avez votre Vagrantfile
Ensuite, modifiez votre Vagrantfile et ajoutez ce qui suit:

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

"." signifie le répertoire dans lequel vous vous trouvez actuellement sur votre machine hôte
"/vagrant " fait référence à "/ home / vagrant " sur la machine invité (Machine Vagrant).

Copiez les fichiers que vous devez envoyer à la machine invitée dans le dossier où vous avez votre Vagrantfile Ensuite, ouvrez Git Bash et cd dans le répertoire où vous avez votre Vagrantfile et type:

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

Où XXXXXXX est votre nom vm . Vous pouvez obtenir votre nom de machine virtuelle en exécutant

vagrant global-status
5
répondu akshaynagpal 2016-11-03 18:59:16

Le plugin Vagrant scp fonctionne si vous connaissez le nom de votre boîte vagrant. Vérifiez vagrant global-status qui fournira votre nom de boîte, puis vous pouvez exécuter:

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

Vagrant scp ~/foobar "nom dans mon cas par défaut":/home/"user"/

3
répondu Bálint Szigeti 2016-08-11 10:08:22

Essayez ceci.. vagrant ubuntu 14.04 Cela a fonctionné pour moi.

scp -r -P 2222 vagrant@localhost:/home .
0
répondu Caliari 2017-12-06 17:59:31

Une autre façon de le faire sans installer quoi que ce soit (vagrant-scp etc.) Notez que le nom default doit être utilisé tel quel, puisque vagrant ssh-config l'émet.

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 fonction ne serait pas nécessaire si scp -F =(vagrant ssh-config) ... aurait fonctionné à travers les shells. Mais comme cela n'est pas pris en charge par Bash, nous devons recourir à cette solution de contournement.

0
répondu Gurjeet Singh 2018-07-20 16:55:30

La meilleure façon de copier le fichier de local à vagrant, pas besoin d'écrire du code ou quelque chose ou des changements de configuration. 1-D'abord le vagabond (Vagabond vers le haut ) 2-Ouvrir cygwin 3-cygwin: allez dans votre dossier où est vagrantfile ou d'où vous lancez le vagrant 4- SSH vagrant 5-Maintenant, cela fonctionnera comme un système normal.

-2
répondu D-2020365 2017-08-10 11:02:11