从主机复制单个文件到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-现在它将像一个正常的系统工作。