web-dev-qa-db-fra.com

Le moyen le plus simple de copier un fichier unique d'un hôte à un invité vagabond

Dans certains cas, je souhaite parfois copier un seul fichier de mon ordinateur hôte vers l'invité Vagrant.

Je ne veux pas le faire via les fournisseurs traditionnels (Puppet/Chef), car il s'agit souvent d'un travail ponctuel - je veux juste quelque chose à ajouter rapidement à mon fichier Vagrant.

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

Il semble également un peu exagéré d'écrire un script d'approvisionnement du shell et de gérer les échappées potentielles, alors que tout ce que je veux faire est de copier un fichier.

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

206
LeeXGreen

Au lieu d'utiliser un approvisionneur Shell pour copier le fichier, vous pouvez également utiliser un Vagrant approvisionneur de fichiers .

Nom du fournisseur:"file"

Le fournisseur 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
85
lynnaloo

Puisque vous demandez le moyen le plus simple, je suggère d'utiliser vagrant-scp . Il ajoute une commande scp à vagrant afin que vous puissiez copier des fichiers sur votre VM comme vous le feriez normalement avec scp.

Installer via:

vagrant plugin install vagrant-scp

Utilisez-le comme suit:

vagrant scp <some_local_file_or_dir> [vm_name]:<somewhere_on_the_vm>
213
Luca Invernizzi

Il existe en réalité une solution beaucoup plus simple. Voir https://Gist.github.com/colindean/5213685/#comment-882885 :

"Veuillez noter que, sauf si vous souhaitez spécifiquement scp pour une raison quelconque, le moyen le plus simple de transférer des fichiers de l'hôte vers VM consiste simplement à les placer dans le même répertoire que le fichier Vagrant - ce répertoire est automatiquement monté sous/vagrant. dans la VM pour que vous puissiez les copier ou les utiliser directement à partir de la VM. "

131
Eric P

Par défaut, la première instance vide utilise le port ssh 2222 et son adresse ip est 127.0.0.1 (vous devrez peut-être ajuster le port avec un 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 vagabonde. le mot de passe est le même que le nom d'utilisateur, qui est vagrant.

scp -P 2222 your_file [email protected]:.

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

scp -P 2222 [email protected]:/PATH/filename .
86
BMW

Voici mon approche du problème:

Étape 1 - Recherchez la clé privée, le port ssh et l'adresse 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 [email protected]:~

J'espère que ça aide,

49
alfredocambera

Ce que j'ai fini par faire est de garder le fichier dans mon répertoire vagrant (automatiquement monté en tant que/vagrant /) et de le copier avec un approvisionneur Shell:

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

Si vous ne souhaitez pas que les fichiers se trouvent 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 changer /File/To/Copy pour le ou les fichiers que vous souhaitez copier, puis /Where/To/Put/File correspond à l'emplacement sur la VM dans laquelle vous souhaitez copier les fichiers.

Si vous créez ce fichier et que vous l'appelez copyToServer.sh, vous pouvez ensuite exécuter la commande sh pour envoyer ces fichiers.

sh ./copyToServer.sh

Pour terminer, vous ne pouvez pas exécuter ce code en tant que provisioner car il s’exécute sur le serveur invité alors que ce code s’exécute à partir de l’hôte.

18
geedew

Vagrant offre un moyen d'exécuter une commande sur ssh au lieu de se connecter. Par conséquent, 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'

  • d'invité à hôte:

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

Pas besoin de plugins ou de recharges d'invités. Assurez-vous simplement de fournir un identifiant de boîte à vagrant à 'vagrant ssh' si vous ne vous trouvez pas dans le même répertoire que Vagrantfile. Testé sur Vagrant v1.8.1.

9
user7962684

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 le simplescp file vagrant:/path/. Vous pouvez trouver le chemin d'accès au fichier d'identité à l'aide de la commande vagrant ssh-config.

9
chf

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

vagrant plugin install vagrant-scp

il existe un autre moyen:

Commencez par vagabonder 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 pouvez avoir des machines virtuelles dans votre projet. Il suffit donc de trouver votre machine principale (en général, ce VM a le port 2222), et ne faites pas attention aux informations des autres machines.

écrivez la commande pour faire la copie:

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

A ce raide, vous devrez mettre un mot de passe vagabond: Par défaut c'est "vagabond"

après cela, si vous regardez les fichiers de votre machine virtuelle: 

vagrant ssh xxVirtualMachineNamexx
pwd
ls

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

6
slideWXY
vagrant upload localfile

qui mettra localfile dans le répertoire principal de l'utilisateur du vagabond 

https://www.vagrantup.com/docs/cli/upload.html

5
jouell

Allez dans le répertoire où vous avez votre Vagrantfile
Ensuite, éditez 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ée (machine vagabonde).

Copiez les fichiers que vous devez envoyer sur la machine invitée dans le dossier où se trouve votre Vagrantfile Ouvrez ensuite Git Bash et cd dans le répertoire où vous avez votre Vagrantfile et tapez:

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

où XXXXXXX est votre nom vm . Vous pouvez obtenir votre nom de vm en lançant 

vagrant global-status
5
akshaynagpal

vagrant scp plugin fonctionne si vous connaissez le nom de votre boîte de vagabond . vérifiez vagrant global-status qui fournira le nom de votre boîte pour pouvoir lancer:

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

vagrant scp ~/foobar "nom dans mon cas, valeur par défaut":/home/"utilisateur" /

4
Bálint Szigeti

Si quelqu'un souhaite transférer un fichier de Windows Host vers vagrant, cette solution a fonctionné pour moi.

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.

Vous devriez pouvoir voir des répertoires dans votre machine à vagabond.

1
Lufy

Essayez ceci .. vagabond Ubuntu 14.04 Cela a fonctionné pour moi.

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

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

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é sur plusieurs obus. Mais comme cela n’est pas pris en charge par Bash, nous devons recourir à cette solution de contournement.

0
Gurjeet Singh

Cela peut être une amélioration pour de bonnes réponses ici

1) Oui installer vagrant-scp

 vagrant plugin install vagrant-scp

2) [nom_mv] est facultatif

vagrant scp thisFileExamle.txt :/this/dirVagrant/dir/

3) pas besoin de -r en cas de dir

vagrant scp thisDir :/this/dirVagrant/dir/

4) cela fonctionne dans l'autre sens pour télécharger des fichiers de Vagrant

vagrant scp :/somefile.txt  thisLocalDir 
0
mebada