Le moyen le plus simple de copier un seul fichier de l'hôte vers un invité Vagrant?

241

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

Je ne veux pas le faire via des provisionneurs traditionnels (Puppet / Chef) car il s'agit souvent d'une opération ponctuelle - 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 nuquer un répertoire entier sur l'invité.

Il semble également un peu exagéré d'écrire un script de provisionnement de shell et de gérer les échappements potentiels, lorsque tout ce que je veux faire est de copier un fichier.

Alors, quelle est la façon la plus simple de copier un seul fichier de l'hôte vers l'invité?

LeeXGreen
la source
notez que la réponse acceptée est basée sur Vagrant 1.x - l' utilisation d'un provisionneur de fichiers est l'approche standard de Vagrant 2 , bien que changer le point de montage /vagrant comme mentionné ici peut également être une bonne option
STW
3
La réponse de @jouell mérite vraiment plus de votes pour le cas d'utilisation simple d'une copie unique d'un seul fichier: vagrant upload /path/to/my/file...
dat
vagrant scp file.txt :~/.
AlikElzin-kilaka

Réponses:

107

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

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
lynnaloo
la source
3
C'est certainement la meilleure façon de le faire dans Vagrant 2! Cependant, Vagrant 2 n'était pas disponible au moment où je devais le faire ... :)
LeeXGreen
4
Cette solution semble agréable, mais je ne peux copier aucun fichier en raison d'erreurs d'autorisation.
orbatschow
@orbatschow J'ai eu le même problème, mais pas si je l'ai copié sur/tmp
Ben
6
ce n'est pas ce que le PO a demandé. la question était de savoir comment transférer occasionnellement des fichiers; avoir à exécuter le provisionnement est exagéré.
axd
253

Puisque vous demandez le moyen le plus simple, je suggère d'utiliser vagrant-scp . Il ajoute une commande scp à vagrant, vous pouvez donc 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>
Luca Invernizzi
la source
1
Ça n'a pas marché pour moi. J'ai installé le plugin, mais j'obtenais toujours une erreur disant "Le plugin" vagrant-scp "est introuvable. Veuillez vous assurer qu'il est correctement installé via vagrant plugin."
rockerston
6
Salut Rod, vagrant-scp fonctionne avec Vagrant 1.7+. Depuis le bogue que vous avez ouvert, vous exécutez 1.4.3. Si vous avez besoin de ce plugin, je crains que vous ne deviez mettre à niveau (ce qui est rapide et indolore).
Luca Invernizzi
1
J'ai essayé cette commande pour copier des fichiers mais n'ai pas fonctionné et donnant une erreur vagrant scp /vagrant/www/koushik.php ubuntu/trusty64:/usr/share/nginx/htmlJ'essaie de copier des fichiers dans le répertoire racine nginx. Il dit, The machine with the name 'C' was not found configured for this Vagrant environment. le répertoire et tout va bien.
Koushik Das
3
Une chose à ajouter: vous devez utiliser l'ID de la machine que vous pouvez obtenir avec le statut global vagabond dans la première colonne. Néanmoins, c'est la meilleure solution à mon humble avis.
min hundje
1
@KoushikDas Ne fonctionne pas par défaut sur Windows. Vous devez activer le sous-système Ubuntu sur Windows 10, puis au lieu de mettre C: / .. pour le chemin d'accès au fichier, vous mettez / mnt / c / ... Et ça marche! Notez également l'autre commentaire, utilisez vagrant global-status pour obtenir l'identifiant de la machine vagabonde.
Andrew
141

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 vouliez spécifiquement scp pour une raison quelconque, la façon la plus simple de transférer des fichiers de l'hôte vers la VM est de simplement les placer dans le même répertoire que le Vagrantfile - ce répertoire est automatiquement monté sous / vagrant dans la VM afin vous pouvez les copier ou les utiliser directement à partir de la machine virtuelle. "

Eric P
la source
3
C'est exactement ce que fait ma réponse ... il exécute un provisionneur shell pour copier le fichier depuis / vagrant /.
LeeXGreen
2
Il est préférable d'utiliser l'approvisionnement vagabond comme l'ont utilisé LeexGreen.
tokhi
4
Assurez-vous que config.vm.synced_folder ".", "/vagrant", disabled: falseet ensuitevagrant reload
Christopher Markieta
cela ne fonctionne pas sur la centos/7boîte vagabonde si vous essayez de faire l'opération inverse (boîte vagabonde vers la machine locale).
ryantuck
Cela fonctionne parfaitement pour moi lors de la copie d'un fichier de ma VM vagabonde Ubuntu 14 vers mon hôte. Merci!!
XtraSimplicity
98

Par défaut, la première instance vagabonde 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 vers l'instance vagabonde. le mot de passe est le même que le nom d'utilisateur 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 .
BMW
la source
3
J'ai dû faire cela et désactiver la vérification stricte des clés:scp -P 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no my-file.txt [email protected]:/tmp
Matt
Je recommanderai d'ajouter ces options ssh ~/.ssh/configpar défaut, ce que j'ai fait dans mon environnement:StrictHostKeyChecking no
BMW
1
+1 + Si l'on a plus d'une machine virtuelle, la valeur du port doit être prise dans l'interface utilisateur d'Oracle VM VirtualBox Manager - sélectionnez vm à gauche, paramètres, réseau, redirection de port
Yordan Georgiev
1
C'est mieux que la réponse acceptée. Le répertoire / vagrant n'est pas toujours là.
jimm101
Surprenant combien il est plus difficile de se mettre rsyncau travail dans ce cas par rapport à scp, étant donné la description de rsync comme "un remplacement plus rapide et flexible de rcp".
Wildcard
56

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érez 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,

Alfredocambera
la source
4
C'est le moyen le plus simple. Je vous remercie.
elmonkeylp
2
L'utilisation de la clé m'a permis de transférer le fichier. La réponse plus élevée sans ces informations n'a pas fonctionné, alors merci!
inostia
1
Solution simple et complète.
Tao Starbow
27

Ce que j'ai fini par faire était de garder le fichier dans mon répertoire vagrant (monté automatiquement sous / 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
LeeXGreen
la source
4
Je recommanderais d'utiliser coreutils, installpar exemple install -D -m644 -C ...src dest. au lieu de cp, car vous pouvez faire des choses comme spécifier les autorisations, la propriété, créer automatiquement des répertoires de tête, ne faire la copie que si le fichier doit être mis à jour, etc ... au lieu de cp, qui est simple et bien si c'est tout ce que vous besoin de faire.
xenoterracide
@LeeXGreen. J'essaie de faire la même chose que vous essayiez de faire, mais je n'ai pas tout à fait votre réponse. Avez-vous tapé cette ligne de code dans le terminal? Où avez-vous placé cela exactement?
Dan Rubio
L'extrait de code de ma réponse va dans votre Vagrantfileaux côtés de vos autres provisionneurs. Vous devrez remplacer path_within_repoet remote_filepar des choses qui ont du sens, pour votre application, bien sûr :)
LeeXGreen
Fonctionne mais j'obtiens l'erreur "default: stdin: is not a tty"
radtek
25
vagrant upload localfile

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

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

jouell
la source
2
Cela semble parfaitement correspondre à la demande des PO pour une utilisation unique et facile.
dardub
20

Si vous n'êtes pas autorisé à 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/Copyle ou les fichiers que vous souhaitez copier, puis /Where/To/Put/Filel'emplacement de la machine virtuelle sur laquelle vous souhaitez copier les fichiers.

Si vous créez ce fichier et l'appelez, copyToServer.shvous pouvez alors exécuter la shcommande pour envoyer ces fichiers.

sh ./copyToServer.sh

Enfin, vous ne pouvez pas exécuter ce code en tant que provisionercar il s'exécute sur le serveur invité, tandis que ce code s'exécute à partir de l'hôte.

geedew
la source
1
C'est probablement la meilleure solution en dehors de l'installation du plugin vagrant-scp. Il utilise la configuration SSH utilisée par Vagrant pour pouvoir gérer les différentes configurations réseau fournies par différents fournisseurs.
Sandy Chapman
1
Agréable! Je vous suggère également de noter que les gens peuvent simplement prendre la sortie de vagrant ssh-configet la coller dans leur fichier ~ / .ssh / config, pour rendre cela encore plus facile à l'avenir. C'est-à-dire en combinant cela avec la réponse de
chf
2
J'ai trouvé nécessaire de sauter la première ligne de la sortie ssh-config pour éviter l'erreur "Directive hôte non prise en charge comme option de ligne de commande" - causée par l'en-tête de la section ssh-config: "Host default". Donc, mon script doit OPTIONS=`vagrant ssh-config | tail -n +2 | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`omettre d'utiliser cette première ligne de sortie ssh-config.
troyfolger
1
Alternativement, pour supprimer l'erreur «Directive hôte non prise en charge», vous pouvez utiliser OPTIONS=`vagrant ssh-config | grep -v '^Host ' | awk -v ORS=' ' 'NF{print "-o " $1 "=" $2}'`comme indiqué
user783836
10

Vagrant fournit un moyen d'exécuter une commande sur 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 rechargements d'invités. Assurez-vous simplement de fournir l'ID de la boîte vagabonde à 'vagrant ssh' si vous n'êtes pas dans le même répertoire que le Vagrantfile. Testé sur Vagrant v1.8.1.

user7962684
la source
De l'approche de l'invité à l'hôte ne conserve pas les symboles spéciaux dans les fichiers
Dr.X
9

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

chf
la source
1
Très utile et aide à clarifier ce qui se passe. Cela vous permet de copier les deux directions, de faire des copies récursives, etc. et de tirer parti des connaissances existantes de scp / ssh
nealmcb
1
Je viens de relire les réponses ci-dessus et découvert en jouant avec la réponse de geedew qui vagrant ssh-configvous donne une configuration encore plus complète et pratique que vous pouvez mettre dans votre ~ / .ssh / config. Mais merci encore!
nealmcb
7

Allez dans le répertoire où vous avez votre Vagrantfile
Then, éditez votre Vagrantfileet ajoutez ce qui suit:

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

"." signifie que 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 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 cddans le répertoire où vous avez votre Vagrantfileet tapez:

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

où XXXXXXX est votre nom vm . Vous pouvez obtenir votre nom vm en exécutant

vagrant global-status
akshaynagpal
la source
7

si pour certaines raisons vous n'êtes pas autorisé à utiliser

vagrant plugin install vagrant-scp

il existe une alternative:

Commencez par vagabonder votre projet vaginal , 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 vous suffit donc de trouver votre machine maître (en général, cette 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 stade, 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 votre répertoire de machine virtuelle

slideWXY
la source
après avoir entré un mot de passe
errant,
2
mais cela était dû aux autorisations sur le répertoire cible. J'ai copié vers / home / vagabond et cela a fonctionné.
user2568374
4

Le plugin vagrant scp fonctionne si vous connaissez le nom de votre boîte vagabonde. vérifiez vagrant global-status qui fournira le nom de votre 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" /

Bálint Szigeti
la source
1
cela a fonctionné pour moi. l'édition est également utile, j'inclurais également la commande pour installer le plugin scp vagrant.
WhyAyala
1

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

scp -r -P 2222 vagrant@localhost:/home .
Caliari
la source
1

Une autre façon de faire cela sans installer quoi que ce soit ( vagrant-scpetc.) Notez que le nom defaultdoit être utilisé tel quel, car il 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) ...elle avait fonctionné sur plusieurs coques. Mais comme cela n'est pas pris en charge par Bash, nous devons recourir à cette solution de contournement.

Gurjeet Singh
la source
1

Si quelqu'un veut transférer un fichier de l'hôte Windows vers vagabond, 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 les répertoires de votre machine vagabonde.

Lufy
la source
-3

Meilleure façon de copier un fichier du local vers le vagabond, pas besoin d'écrire de code ou quoi que ce soit ou toute modification de configuration. 1- Tout d'abord le vagabond ( vagabond vers le haut ) 2- ouvrez cygwin 3- cygwin: allez dans votre dossier où se trouve vagrantfile ou d'où vous lancez le vagabond 4- ssh vagrant 5- maintenant cela fonctionnera comme un système normal.

D-2020365
la source
Un problème que j'ai découvert avec cette approche: si vagrant a besoin de configurer vos compléments d'invité, le répertoire / vagrant peut ne pas être monté lors de l'exécution du provisionneur de fichiers.
Torenware Networks