我有一个用例,我偶尔想从我的主机复制一个文件到Vagrant客户机。

我不想这样做通过传统的供应(木偶/厨师),因为这往往是一次性的-我只是想快速添加到我的Vagrantfile。

我不想共享整个目录,可能是因为我想覆盖现有文件,而不破坏客户机上的整个目录。

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

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


当前回答

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

    $vagrant upload ~/Desktop/file.sh host1

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

其他回答

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

缺省情况下,第一个流浪实例使用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 .
vagrant upload localfile

这将把localfile放在流浪者用户的主目录

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

另一种不安装任何东西的方法(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不支持这一点,所以我们必须采用这种解决方法。

如果您的目录中不能包含这些文件,则可以在主机的脚本文件中运行此代码。

#!/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是您希望将文件复制到的虚拟机上的位置。

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

sh ./copyToServer.sh

最后需要注意的是,您不能将此代码作为配置程序运行,因为它运行在Guest服务器上,而此代码则从主机运行。