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

时间:2013-05-23 01:07:08

标签: vagrant

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

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

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

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

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

19 个答案:

答案 0 :(得分:222)

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

通过以下方式安装:

vagrant plugin install vagrant-scp

像这样使用它:

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

答案 1 :(得分:133)

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

  

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

答案 2 :(得分:89)

您可以使用Vagrant file provisioner而不是使用shell配置程序来复制文件。

  

供应商名称: "file"

     

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

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

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

答案 3 :(得分:89)

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

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

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

scp -P 2222 your_file vagrant@127.0.0.1:.

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

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

答案 4 :(得分:51)

以下是解决问题的方法:

步骤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:~

我希望它有所帮助,

答案 5 :(得分:27)

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

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

答案 6 :(得分: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

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

如果您创建此文件并将其命名为copyToServer.sh,则可以运行sh命令来推送这些文件。

sh ./copyToServer.sh

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

答案 7 :(得分: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上测试。

答案 8 :(得分: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命令找到身份文件的路径。

答案 9 :(得分:8)

vagrant upload localfile

这会将localfile放入无业游民的用户的主目录中

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

答案 10 :(得分:6)

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

vagrant plugin install vagrant-scp

还有另一种方式:

首先流浪 yourVagrantProject ,然后写入终端:

vagrant ssh-config

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

在某些情况下,您可以在项目中安装一些虚拟机。所以只需找到你的主机(通常,这个VM有端口2222),不要注意其他机器的信息。

编写命令以制作副本:

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

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

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

vagrant ssh xxVirtualMachineNamexx
pwd
ls

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

答案 11 :(得分:5)

转到您Vagrantfile的目录 然后,修改您的Vagrantfile并添加以下内容:

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

&#34;。&#34; 表示您当前位于主机上的目录 &#34; / vagrant&#34; 指&#34; / home / vagrant&#34;在来宾机(Vagrant机器)。

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

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

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

获取您的虚拟机名称
vagrant global-status

答案 12 :(得分:4)

如果你知道你的流浪盒名称,

vagrant scp插件就可以了。 检查vagrant global-status,它将提供您的盒子名称,然后您可以运行:

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

vagrant scp~ / foobar&#34;在我的情况下默认为&#34;:/ home /&#34; user&#34; /

答案 13 :(得分: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) ...在所有shell中都可以使用,则该函数不是必需的。但是,由于Bash不支持此操作,因此我们必须采用此替代方法。

答案 14 :(得分: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.

您应该能够在无所事事的机器中查看目录。

答案 15 :(得分:0)

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

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

答案 16 :(得分:0)

对我来说,最好的办法是将文件/目录(要复制)写入流浪者文件目录,现在,存在的任何文件都可以在流浪者/ vagrant中找到。

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

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

答案 17 :(得分:0)

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

    $vagrant upload ~/Desktop/file.sh host1

这将在/ home / xxxx下复制〜/ Desktop / file.sh,其中xxx是host1下的无业游民用户

答案 18 :(得分:-3)

将文件从本地复制到流浪者的最佳方法,无需编写任何代码或任何内容或任何配置更改。 1-首先上流浪者(流浪汉) 2-开放的cygwin 3- cygwin:转到你的文件夹,在那里是vagrantfile或你从哪里启动流浪者 4- ssh vagrant 5-现在它将像普通系统一样工作。