将单个文件从主机复制到Vagrant guest虚拟机的最简单方法是什么?

Lee*_*een 229 vagrant

我有一个用例,我偶尔会想要将一个文件从我的主机复制到Vagrant客户端.

我不希望通过传统的配置程序(Puppet/Chef)这样做,因为这通常是一次性的 - 我只想快速添加到我的Vagrantfile中.

我不想共享整个目录,可能是因为我想覆盖现有文件而不需要访问guest虚拟机上的整个目录.

编写shell配置脚本并处理潜在的转义似乎有点过分,当我想要做的就是复制文件.

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

Luc*_*zzi 235

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

安装途径:

vagrant plugin install vagrant-scp
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

vagrant scp <some_local_file_or_dir> [vm_name]:<somewhere_on_the_vm>
Run Code Online (Sandbox Code Playgroud)

  • 嗨Rod,vagrant-scp与Vagrant 1.7+一起使用.从你打开的bug,你运行1.4.3.如果你需要这个插件,我担心你必须升级(这是快速和无痛的). (6认同)
  • 要添加的一件事:您必须在第一列中使用可以通过vagrant global-status获得的计算机的ID.尽管如此,这是最好的解决方案. (3认同)
  • 我试过这个命令来复制文件,但没有用,并给出错误`vagrant scp /vagrant/www/koushik.php ubuntu/trusty64:/usr/share/nginx/html` 我正在尝试将文件复制到 nginx 根目录中. 它说,“没有找到为这个 Vagrant 环境配置的名为“C”的机器。`目录和一切都很好。 (2认同)

Eri*_*c P 138

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

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

  • 这正是我的答案所做的...它运行一个shell配置程序来从/ vagrant /复制文件. (3认同)
  • 确保`config.vm.synced_folder".","/ vagrant",禁用:false`然后`vagrant reload` (3认同)
  • 最好使用LeexGreen使用的流浪配置. (2认同)

小智 96

您也可以使用Vagrant 文件配置程序,而不是使用shell配置程序来复制文件.

供应商名称: "file"

文件配置器允许您将文件从主机上载到来宾计算机.

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

  config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig"
end
Run Code Online (Sandbox Code Playgroud)

  • 这不是OP所要求的.问题是如何_偶然地传输文件; 必须运行配置是过度的. (5认同)
  • 这个解决方案听起来不错,但由于权限错误,我无法复制任何文件. (4认同)
  • 这绝对是在Vagrant 2中做到这一点的最好方法!但是,当我需要这样做时,Vagrant 2不可用...... :) (3认同)

BMW*_*BMW 95

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

==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
Run Code Online (Sandbox Code Playgroud)

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

scp -P 2222 your_file vagrant@127.0.0.1:.
Run Code Online (Sandbox Code Playgroud)

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

scp -P 2222 vagrant@127.0.0.1:/PATH/filename .
Run Code Online (Sandbox Code Playgroud)

  • 我不得不这样做并禁用严格的密钥检查:`scp -P 2222 -o UserKnownHostsFile =/dev/null -o StrictHostKeyChecking = no my-file.txt matt@127.0.0.1:/tmp` (3认同)
  • 这比接受的答案要好。/vagrant 目录并不总是存在。 (2认同)

alf*_*era 53

这是我解决问题的方法:

第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
Run Code Online (Sandbox Code Playgroud)

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

  scp -P 2222 -i /root/.vagrant.d/insecure_private_key \
  someFileName.txt vagrant@127.0.0.1:~
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助,

  • 这是最简单的方法.谢谢. (4认同)
  • 使用密钥允许我传输文件.没有这些信息的更高答案没有用,谢谢! (2认同)

Lee*_*een 27

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

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

  • 我建议使用coreutils [`install`](http://www.gnu.org/software/coreutils/manual/html_node/install-invocation.html#install-invocation),例如`install -D -m644 -C. ..` src dest.而不是cp,因为你可以做一些事情,比如指定权限,所有权,自动创建前导目录,只做副本,如果文件需要更新等等...而不是cp,这很简单,如果这就是你的全部需要做. (4认同)

gee*_*dew 18

如果限制在目录中包含文件,则可以从主机中的脚本文件中运行此代码.

#!/bin/sh
OPTIONS=`vagrant ssh-config | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`

scp ${OPTIONS} /File/To/Copy vagrant@YourServer:/Where/To/Put/File
Run Code Online (Sandbox Code Playgroud)

在此设置中,您只需要更改/File/To/Copy要复制的文件,然后/Where/To/Put/File是要将文件复制到的VM上的位置.

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

sh ./copyToServer.sh
Run Code Online (Sandbox Code Playgroud)

最后一点,您不能将此代码作为a provisioner运行,因为它在Guest服务器上运行,而此代码从Host运行.

  • 我发现有必要跳过ssh-config输出的第一行,以避免错误"Host指令不支持作为命令行选项" - 由ssh-config部分的头引起:"Host default".所以,我的脚本有'OPTIONS = \`vagrant ssh-config | 尾巴-n +2 | awk -v ORS ='''{print"-o"$ 1"="$ 2}'\``省略使用第一行ssh-config输出. (2认同)
  • 或者,要删除“不支持主机指令”错误,您可以使用`OPTIONS=\`vagrant ssh-config | grep -v '^主机' | awk -v ORS=' ' 'NF{print "-o " $1 "=" $2}'\`` 如此处所述:https://gist.github.com/geedew/11289350 (2认同)

jou*_*ell 17

vagrant upload localfile
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这似乎完全符合 OP 对简单一次性使用的要求。 (3认同)

use*_*684 10

Vagrant提供了一种通过ssh执行命令而不是登录的方法,因此对于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

无需插件或客户端重新加载.如果您与Vagrantfile不在同一个目录中,请确保为'vagrant ssh'提供流浪盒ID.在Vagrant v1.8.1上测试过.


小智 9

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

Host vagrant
    User vagrant
    HostName localhost
    Port 2222
    IdentityFile /home/user_name/.vagrant.d/insecure_private_key
Run Code Online (Sandbox Code Playgroud)

而且简单scp file vagrant:/path/.您可以使用该vagrant ssh-config命令找到标识文件的路径.


小智 8

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

    $vagrant upload ~/Desktop/file.sh host1
Run Code Online (Sandbox Code Playgroud)

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


小智 7

如果由于某些原因您没有使用许可

vagrant plugin install vagrant-scp
Run Code Online (Sandbox Code Playgroud)

还有另一种方法:

首先流浪你的VagrantProject,然后写在终端:

vagrant ssh-config
Run Code Online (Sandbox Code Playgroud)

您将获得有关虚拟机的"HostName"和"Port"的信息.

在某些情况下,您可以在项目中安装一些虚拟机.因此,只需找到您的主机(通常,此VM具有端口2222),并且不要关注其他机器信息.

编写命令来制作副本:

scp -P xxPortxx  /Users/where/is/your/file.txt  vagrant@xxHostNamexx:/home/vagrant
Run Code Online (Sandbox Code Playgroud)

在这个陡峭的地方你必须输入一个流浪汉密码:默认情况下它是"流浪汉"

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

vagrant ssh xxVirtualMachineNamexx
pwd
ls
Run Code Online (Sandbox Code Playgroud)

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

  • 但这是由于对目标目录的权限。我复制到 /home/vagrant 并且确实有效。 (2认同)

小智 5

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

vagrant global-status
Run Code Online (Sandbox Code Playgroud)
id       name    provider   state   directory
------------------------------------------------------------------------
13e680d  **default** virtualbox running /home/user
Run Code Online (Sandbox Code Playgroud)

vagrant scp ~/foobar“在我的情况下默认名称”:/home/“用户”/


aks*_*pal 5

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

config.vm.synced_folder ".", "/vagrant", :mount_options => ['dmode=774','fmode=775']
Run Code Online (Sandbox Code Playgroud)

"" 表示您当前在主机上的目录
"/ vagrant"是指客户机(Vagrant机器)上的"/ home/vagrant" .

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

vagrant scp config.json XXXXXXX:/home/vagrant/
Run Code Online (Sandbox Code Playgroud)

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

vagrant global-status
Run Code Online (Sandbox Code Playgroud)