314 votes

Quelle est la méthode la plus simple pour copier un fichier unique de l'hôte vers l'invité Vagrant ?

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

Je ne veux pas le faire via les provisionneurs traditionnels (Puppet / Chef) parce que c'est souvent un cas unique -- je veux juste quelque chose de rapide à ajouter à mon fichier Vagrant.

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

Il semble également un peu exagéré d'écrire un script script de provisionnement du shell, et de gérer l'échappement potentiel, alors que tout ce que je veux faire, c'est copier un fichier.

Quel est donc le moyen le plus simple de copier un fichier unique de l'hôte vers l'invité ?

64voto

alfredocambera Points 539

Voici mon approche du problème :

Étape 1 - Trouver 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 cela vous aidera,

27voto

LeeXGreen Points 406

Ce que j'ai fini par faire, c'est de garder le fichier dans mon répertoire vagrant (automatiquement monté en tant que /vagrant/) et de le copier à l'aide d'un shell provisioner :

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

21voto

geedew Points 504

Si vous ne pouvez pas avoir les fichiers dans votre répertoire, vous pouvez exécuter ce code dans un fichier 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 suffit de modifier /File/To/Copy jusqu'au(x) fichier(s) que vous souhaitez copier et ensuite /Where/To/Put/File est l'emplacement sur la VM vers lequel vous souhaitez que les fichiers soient 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

Enfin, il n'est pas possible d'exécuter ce code en tant que provisioner parce qu'il s'exécute sur le serveur invité, alors que ce code s'exécute à partir de l'hôte.

13voto

onlyme Points 1266

Toutes les réponses ci-dessus peuvent fonctionner. Mais voici ce qui a fonctionné pour moi. J'avais plusieurs hôtes vagrant : host1, host2. Je voulais copier un fichier de ~/Desktop/file.sh vers l'hôte : host1 Je l'ai fait :

    $vagrant upload ~/Desktop/file.sh host1

Cela copiera ~/Desktop/file.sh sous /home/xxxx où xxx est votre utilisateur vagrant sous host1

12voto

user7962684 Points 121

Vagrant fournit un moyen d'exécuter une commande via ssh au lieu de se connecter, donc pour l'hôte et l'invité Linux 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 recharges pour les invités. Assurez-vous simplement de fournir l'ID de la boîte vagrant à 'vagrant ssh' si vous n'êtes pas dans le même répertoire que le fichier Vagrant. Testé sur Vagrant v1.8.1.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X