282

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

我不想通过传统的供应商(Puppet / Chef)这样做,因为这通常是一次性的——我只想快速添加一些东西到我的 Vagrantfile 中。

我不想共享整个目录,可能是因为我想覆盖现有文件而不在来宾上删除整个目录。

当我只想复制一个文件时,编写一个 shell 配置脚本并处理潜在的转义似乎也有点矫枉过正。

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

4

19 回答 19

284

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

通过以下方式安装:

vagrant plugin install vagrant-scp

像这样使用它:

vagrant scp <some_local_file_or_dir> [vm_name]:<somewhere_on_the_vm>
于 2015-02-06T05:57:42.010 回答
155

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

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

于 2014-03-21T15:33:24.550 回答
126

除了使用 shell 配置器来复制文件,您还可以使用 Vagrant文件配置器

供应商名称: "file"

文件配置器允许您将文件从主机上传到客户机。

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

  config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig"
end
于 2014-04-25T20:15:09.397 回答
108

默认情况下,第一个 vagrant 实例使用 ssh 端口为 2222,其 ip 地址为 127.0.0.1(如果创建了多个虚拟主机,可能需要调整端口)

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

因此,您可以运行以下命令将本地文件复制到 vagrant 实例中,而不仅仅是复制到/vagrant。密码与用户名相同,即vagrant.

scp -P 2222 your_file vagrant@127.0.0.1:.

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

scp -P 2222 vagrant@127.0.0.1:/PATH/filename .
于 2014-10-14T03:32:17.707 回答
61

这是我解决问题的方法:

第 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:~

我希望它有所帮助,

于 2015-08-01T18:10:55.233 回答
58
vagrant upload localfile

这会将 localfile 放在 vagrant 用户的主目录中

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

于 2018-12-24T01:35:08.417 回答
27

我最终做的是将文件保存在我的 vagrant 目录中(自动挂载为 /vagrant/)并使用 shell 配置程序将其复制:

command = "cp #{File.join('/vagrant/', path_within_repo)} #{remote_file}"
config.vm.provision :shell, :inline => command
于 2013-05-23T05:03:30.840 回答
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

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

于 2014-04-24T20:43:01.553 回答
11

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 上测试。

于 2017-05-04T10:53:37.350 回答
10

以上所有答案都可能有效。但下面是对我有用的。我有多个流浪主机:host1,host2。我想将文件从 ~/Desktop/file.sh 复制到主机:host1 我做了:

    $vagrant upload ~/Desktop/file.sh host1

这将在 /home/xxxx 下复制 ~/Desktop/file.sh,其中 xxx 是您在 host1 下的流浪用户

于 2020-10-25T17:54:36.237 回答
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您可以使用该命令找到身份文件的路径。

于 2015-01-30T13:26:40.103 回答
7

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

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

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

将您需要发送到来宾计算机的文件复制到您拥有Vagrantfile 然后打开Git Bash的文件夹,然后复制到您拥有cd的目录Vagrantfile并键入:

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

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

vagrant global-status
于 2016-11-03T18:59:16.467 回答
7

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

vagrant plugin install vagrant-scp

还有另一种方法:

首先 vagrant up yourVagrantProject,然后在终端中写入:

vagrant ssh-config

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

在某些情况下,您的项目中可能有一些虚拟机。所以只要找到你的master机器(一般来说,这个VM有端口 2222 ),不要关注其他机器的信息。

编写命令以进行复制:

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

在这个陡峭的地方,你将不得不输入一个 vagrant 密码:默认情况下它是“vagrant”

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

vagrant ssh xxVirtualMachineNamexx
pwd
ls

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

于 2017-03-03T11:02:33.340 回答
5

如果您知道您的 vagrant box 名称,则 vagrant scp 插件可以工作。检查 vagrant global-status 它将提供您的盒子名称,然后您可以运行:

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

vagrant scp ~/foobar "我的默认名字":/home/"user"/

于 2016-08-11T08:25:19.683 回答
1

如果有人想将文件从 Windows 主机传输到 vagrant,那么这个解决方案对我有用。

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.

您应该能够在您的 vagrant 机器中看到目录。

于 2018-10-25T23:32:52.867 回答
1

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

scp -r -P 2222 vagrant@localhost:/home .
于 2017-12-06T17:58:44.870 回答
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 不支持这一点,我们不得不求助于这种解决方法。

于 2018-07-20T16:55:30.970 回答
0

对我来说最好的答案是将文件 / 目录(要复制)写入 vagrant 文件目录,现在存在于路径 /vagrant 中的任何文件都可用于 vagrant。

就是这样,不需要 scp 或任何其他方法,

同样,您可以通过粘贴 /vagrant 目录将任何文件从 VM 复制到主机。

于 2020-08-03T08:11:32.903 回答
-3

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

于 2017-08-10T11:02:11.167 回答