从主机复制单个文件到Vagrant客户的最简单的方法是什么?

我有一个用例,我偶尔想从主机上复制单个文件给stream浪客。

我不想通过传统提供者(木偶/厨师)这样做,因为这往往是一次性的 – 我只想快速添加到我的stream浪文件中。

我不想共享一个完整的目录,可能是因为我想覆盖现有的文件,而不需要在guest虚拟机上join整个目录。

编写一个shellconfiguration脚本似乎有些矫枉过正,当我想要做的只是复制一个文件时,处理潜在的转义。

那么,从主机复制单个文件到客户端的最简单方法是什么?

您可以使用Vagrant 文件调配程序来代替使用shell调配程序来复制文件 。

configuration程序名称: "file"

文件供应器允许您将文件从主机上传到客机。

 Vagrant.configure("2") do |config| # ... other configuration config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig" end 

既然你问最简单的方法,我build议使用vagrant-scp 。 它添加了一个scp命令vagrant,所以你可以复制文件到你的虚拟机,就像你通常用scp做的那样。

安装通过:

 vagrant plugin install vagrant-scp 

像这样使用它:

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

实际上有一个更简单的解决scheme。 见https://gist.github.com/colindean/5213685/#comment-882885

“请注意,除非由于某种原因特别需要scp,否则将文件从主机传输到虚拟机的最简单方法是将它们放在与Vagrant文​​件相同的目录中 – 该目录将自动挂载在虚拟机的/ vagrant下您可以直接从VM复制或使用它们。“

默认情况下,第一个vagrant实例使用ssh端口为2222,ip地址为127.0.0.1。 你需要用真正的虚拟主机来调整端口和IP。

所以你可以运行下面的命令将你的本地文件复制到stream浪的实例。 密码和vagrant用户名一样。

 scp -P 2222 your_file vagrant@127.0.0.1:. 

您也可以将文件复制回本地主机。

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

这是我的方法来解决这个问题:

步骤1 – find私钥,ssh端口和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 

第2步 – 使用端口和私钥作为scp的参数传输文件:

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

我希望它有帮助,

我最终做的是将文件保存在我的stream浪者目录中(自动挂载为/ vagrant /),并使用shell提供程序复制它:

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

如果您不能将文件保存在目录中,则可以通过主机中的脚本文件运行此代码。

 #!/bin/sh OPTIONS=`vagrant ssh-config | awk -v ORS=' ' '{print "-o " $1 "=" $2}'` scp ${OPTIONS} /File/To/Copy vagrant@YourServer:/Where/To/Put/File 

在这个设置中,你只需要改变/File/To/Copy到你想要复制的文件或文件,然后/Where/To/Put/File位置/Where/To/Put/File是你想要复制文件的虚拟机的位置。

如果你创build了这个文件并把它copyToServer.sh你可以运行sh命令来推送这些文件。

 sh ./copyToServer.sh 

作为最后一点,您不能将此代码作为provisioner程序运行,因为它在来宾服务器上运行,而此代码是从主机运行的。

你可以在~/.ssh/config添加条目:

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

和简单的scp file vagrant:/path/ 。 您可以使用vagrant ssh-config命令查找标识文件的path。

如果由于某些原因您无权使用

 vagrant plugin install vagrant-scp 

有一个替代方法:

首先将您的VagrantProject移除 ,然后在terminal中写入:

 vagrant ssh-config 

您将获得有关虚拟机“HostName”和“Port”的信息。

在某些情况下,您的项目中可能有一些虚拟机。 所以只要find你的主机(一般来说,这个虚拟机的端口是2222),不要关注别人的机器信息。

编写命令来复制:

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

在这个陡峭的地方,你将不得不放置一个stream浪密码:默认情况下它是“stream浪者”

之后,如果您查看虚拟机中的文件:

 vagrant ssh xxVirtualMachineNamexx pwd ls 

您的虚拟机目录中将包含“file.txt”

转到您有Vagrantfile的目录
然后,编辑您的Vagrantfile并添加以下内容:

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

“” 意味着你目前在主机上的目录
“/ vagrant”是指宾客机器 (stream浪者机器)上的“/ home / vagrant”。

将需要发送到客户机的文件复制到你有Vagrantfile的文件夹然后打开Git Bash ,然后进入你有Vagrantfile的目录并键入:

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

XXXXXXX是你的虚拟机名称 。 你可以通过运行得到你的虚拟机名称

 vagrant global-status 

Vagrant提供了一种通过ssh执行命令而不是login的方法,因此对于Linux主机和guest,您可以使用:

  • 从主机到客人:

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

  • 从客人到主持人:

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

无需插件或客人重新加载。 如果您不在stream浪文件的相同目录中,请确保提供vagrant box ID到'vagrant ssh'。 经过testingVagrant v1.8.1。

如果你知道你的stream浪者的名字,那么stream浪的scp插件就可以工作。 检查vagrant全局状态,这将提供您的箱子名称,然后您可以运行:

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

vagrant scp〜/ foobar“在我的情况下名字默认”:/ home /“user”/

将文件从本地复制到stream浪者的最佳方式,无需编写任何代码或任何事物或任何configuration更改。 1-首先stream浪汉( vagrant up )2-打开cygwin 3- cygwin:去你的文件夹那里vagrantfile或从你的地方启动stream浪汉4- ssh vagrant 5-现在它将像一个正常的系统工作。