将单个文件从主机复制到Vagrant guest的最简单方法?


241

我有一个用例,有时我想将一个文件从主机复制到Vagrant来宾。

我不想通过传统的资源调配人(Puppet / Chef)来这样做,因为这通常是一次性的-我只想快速添加一些到我的Vagrantfile中。

我不想共享整个目录,这可能是因为我想覆盖现有文件而不会在guest虚拟机上破坏整个目录。

当我要做的就是复制文件时,编写一个shell设置脚本并处理潜在的转义似乎也有些过头。

那么,将单个文件从主机复制到来宾的最简单方法是什么?


请注意,可接受的答案是基于Vagrant 1.x的- 使用文件配置程序是标准的Vagrant 2方法,尽管/vagrant 按此处所述更改挂载点也是一个不错的选择
STW 2015年

3
@jouell的答案确实值得一个文件的一次性副本的简单用例获得更多投票:vagrant upload /path/to/my/file...
dat

vagrant scp file.txt :~/.
AlikElzin-kilaka

Answers:


107

除了使用shell配置程序复制文件之外,您还可以使用Vagrant 文件配置程序

供应者名称: "file"

文件供应器允许您将文件从主机上载到来宾计算机。

Vagrant.configure("2") do |config|
  # ... other configuration

  config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig"
end

3
这绝对是在Vagrant 2中执行此操作的最佳方法!但是,在我需要执行此操作时,Vagrant 2尚不可用... :)
LeeXGreen 2014年

4
这个解决方案听起来不错,但是由于权限错误,我无法复制任何文件。
orbatschow '16

@orbatschow我有同样的问题,但是如果我将其复制到/tmp
Ben

6
这不是OP所要求的。问题是如何偶尔传输文件;不得不执行预配是过分的。
axd

253

由于您要求的是最简单的方法,因此我建议使用vagrant-scp。它向无业游民添加了一个scp命令,因此您可以像通常使用scp一样将文件复制到VM。

通过以下方式安装:

vagrant plugin install vagrant-scp

像这样使用它:

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

1
这对我不起作用。我安装了插件,但始终收到错误消息,指出“找不到插件“ vagrant-scp”。请确保通过正确安装了插件vagrant plugin。”
罗克斯顿2015年

6
嗨,罗德,vagrant-scp与Vagrant 1.7+兼容。从打开的错误中,您正在运行1.4.3。如果您需要此插件,恐怕您将必须进行升级(这既快捷又轻松)。
卡·因弗尼齐

1
我尝试使用此命令来复制文件,但是没有用,并给出错误消息,vagrant scp /vagrant/www/koushik.php ubuntu/trusty64:/usr/share/nginx/html我试图将文件复制到nginx根目录中。它说,The machine with the name 'C' was not found configured for this Vagrant environment. 目录和一切都很好。
Koushik Das

3
要添加的一件事:您必须在第一列中使用通过vagrant global-status获取的计算机的ID。但是,这是最好的解决方案。
min hundje

1
@KoushikDas在Windows上无法使用。您必须在Windows 10上启用Ubuntu子系统,然后将/ mnt / c / ...放到文件路径中,而不是将C:/ ..放进去,然后万岁!还要注意其他注释,使用vagrant global-status获取流浪者计算机的ID。
安德鲁

141

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

“请注意,除非出于某些原因特别想要scp,否则将文件从主机传输到VM的最简单方法是将它们放置在与Vagrantfile相同的目录中-该目录会自动挂载在VM的/ vagrant下,因此您可以直接从VM复制或使用它们。”


3
这正是我的答案。。。它运行shell配置程序以从/ vagrant /复制文件。
LeeXGreen 2014年

2
如LeexGreen所使用的,最好使用无用的资源调配。
tokhi 2014年

4
config.vm.synced_folder ".", "/vagrant", disabled: false然后确保vagrant reload
Christopher Markieta

这并没有在工作centos/7,如果试图做的反向操作(流浪汉框本地机器)流浪汉框。
瑞安·塔克

将文件从Ubuntu 14 vagrant VM复制到主机时,这对我来说非常理想。谢谢!!
XtraSimplicity

98

默认情况下,第一个流浪实例使用ssh端口作为2222,其ip地址为127.0.0.1(您可能需要使用真实的虚拟主机来调整端口)

==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)

因此,您可以运行以下命令将本地文件复制到流浪实例。密码与用户名相同vagrant

scp -P 2222 your_file vagrant@127.0.0.1:.

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

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

3
我必须这样做并禁用严格的密钥检查:scp -P 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no my-file.txt matt@127.0.0.1:/tmp
Matt

我建议将这些ssh选项添加~/.ssh/config为默认值,这是在我的环境中完成的:StrictHostKeyChecking no
BMW

1
+1 +如果一个或多个虚拟机,则应从Oracle VM VirtualBox Manager的UI中获取端口的值-选择左侧的vm,设置,网络,端口转发
Yordan Georgiev

1
这比公认的答案更好。/ vagrant目录并不总是存在。
jimm101 2015年

考虑到rsync将其描述为“更快,更灵活的rcp替代品”,rsync与这种情况相比scp,在这种情况下工作起来要困难得多。
通配符

56

这是我解决问题的方法:

步骤1-查找私钥,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:~

希望对您有所帮助


4
这是最简单的方法。谢谢。
elmonkeylp

2
使用密钥可以转移文件。没有这些信息的更高答案没有用,所以谢谢!
inostia

1
简单而完整的解决方案。
陶星弓

27

我最终要做的是将文件保留在我的vagrant目录(自动挂载为/ vagrant /)中,并使用Shell Provisioner复制该文件:

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

4
我建议使用coreutils,install例如install -D -m644 -C ...src dest。代替cp,因为您可以执行诸如指定权限,所有权,自动创建引导目录等操作,仅在文件需要更新时才执行复制操作,等等...代替cp,如果您就这么简单,那就好了需要做。
xenoterracide 2014年

@LeeXGreen。我正在尝试做与您想做的事情相同的事情,但我不太明白您的答案。您是否在终端中键入了该行代码?你到底把它放在哪里?
丹·卢比奥

我的答案中的代码段Vagrantfile与您的其他预配程序一起出现。你需要更换path_within_repo,并remote_file与事情,是有意义的,你的应用程序,当然:)
LeeXGreen

可以,但是我得到“默认值:stdin:不是tty”错误
radtek


20

如果您无法将文件保存在目录中,则可以从主机上的脚本文件中运行此代码。

#!/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是要将文件复制到的VM上的位置。

如果创建此文件并调用它copyToServer.sh,则可以运行sh命令来推送这些文件。

sh ./copyToServer.sh

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


1
这可能是安装vagrant-scp插件之外的最佳解决方案。它使用Vagrant使用的SSH配置,因此它可以处理由不同提供商提供的不同网络设置。
桑迪·查普曼

1
真好!我建议您还注意,人们可以简单地将的输出vagrant ssh-config粘贴到他们的〜/ .ssh / config文件中,以使其在将来变得更容易。即与瑞士法郎的答案结合起来
nealmcb

2
我发现有必要跳过ssh-config输出的第一行,以避免错误“ ssh-config部分的标题:“主机默认值”引起的错误“主机指令不支持作为命令行选项”。因此,我的脚本必须OPTIONS=`vagrant ssh-config | tail -n +2 | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`省略使用ssh-config输出的第一行。
troyfolger'3

1
另外,要消除“不支持Host指令”的错误,您可以OPTIONS=`vagrant ssh-config | grep -v '^Host ' | awk -v ORS=' ' 'NF{print "-o " $1 "=" $2}'`按照此处记录的方式使用:gist.github.com/geedew/11289350
user783836

10

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

  • 从主人到客人:

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

无需插件或来宾重新加载。如果您与Vagrantfile不在同一个目录中,只需确保将“ vagrant box ID”提供给“ vagrant ssh”。在Vagrant v1.8.1上测试。


从客人主机做法并不在文件中保存的特殊符号
Dr.X

9

您可以在添加条目~/.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命令找到身份文件的路径。


1
非常有帮助,并有助于弄清发生了什么。这使您可以复制两个方向,进行递归复制等,并很好地利用现有的scp / ssh知识
nealmcb,2015年

1
我只是重新阅读了上面的答案,并通过使用geedew的答案发现了这一发现,它vagrant ssh-config为您提供了一个更完整,更便捷的配置片段,您可以将其放入〜/ .ssh / config。但是再次感谢!
nealmcb 2015年

7

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

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

“。” 表示您当前在主机上的目录
“ / vagrant”是指来宾计算机(Vagrant机器)上的“ / home / vagrant” 。

将您需要发送到客户机的文件复制到您拥有文件的文件夹中,Vagrantfile 然后打开Git Bashcd拥有您的目录,Vagrantfile然后键入:

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

其中XXXXXXX是您的虚拟机名称。您可以通过运行获取虚拟机名称

vagrant global-status

7

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

vagrant plugin install vagrant-scp

有另一种方法:

首先对yourVagrantProject进行流浪,然后在终端中输入:

vagrant ssh-config

您将获得有关虚拟机的“主机名”和“端口”的信息。

在某些情况下,您的项目中可能会有一些虚拟机。因此,只需找到您的主机(通常,该VM的端口为2222),而不必注意其他机器的信息。

编写命令进行复制:

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

在这个陡峭的山坡上,您将必须输入一个无用的密码:默认情况下,它是“无用的”

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

vagrant ssh xxVirtualMachineNamexx
pwd
ls

您将在虚拟机目录中拥有“ file.txt”


输入流浪汉密码后,我得到“权限被拒绝”
user2568374

2
但这是由于对目标目录的权限。我复制到/ home / vagrant,并且确实起作用。
user2568374

4

如果您知道您的流浪者盒子名称,则可以使用流浪者scp插件。检查vagrant global-status,它将提供您的邮箱名称,然后您可以运行:

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

流浪的scp〜/ foobar“在我的情况下为默认名称”:/ home /“用户” /


1
这对我有用。该编辑也很有帮助,我还将包括安装vagrant scp插件的命令。
WhyAyala

1

试试这个.. vagrant ubuntu 14.04这对我有用。

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

1

另一种无需安装任何东西(vagrant-scp等)的方式。请注意,该名称default必须照原样使用,因为vagrant ssh-config会发出该名称。

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

如果scp -F =(vagrant ssh-config) ...可以跨外壳工作,则该功能不是必需的。但是,由于Bash不支持此方法,因此我们必须求助于此解决方法。


1

如果有人想将文件从Windows主机传输到无业游民,那么此解决方案对我有用。

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.

您应该能够在无业游民的计算机中看到目录。


-3

从本地复制文件到无业游民的最佳方法,无需编写任何代码或任何内容或配置更改。1-首先启动vagrant(vagrant up)2-打开cygwin 3- cygwin:转到文件夹vagrantfile或从其中启动vagrant的文件夹4- ssh vagrant 5-现在它将像正常系统一样工作。


我发现这种方法存在一个问题:如果vagrant需要配置来宾添加,则在文件配置程序运行时/ vagrant目录可能实际上未安装。
Torenware Networks
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.