最简单的方法复制一个文件从主机到流浪者客人?

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

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

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

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

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

209054 次浏览

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

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

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

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

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

#!/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

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

你也可以使用Vagrant 文件粮食供应者,而不是使用shell提供程序来复制文件。

粮食供应者的名字: "file"

文件提供程序允许您将文件从主机上传到客户计算机。

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


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

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

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

所以你可以运行下面的命令将你的本地文件复制到vagrant实例中,而不仅仅是/的流浪汉。password与username相同,即vagrant

scp -P 2222 your_file vagrant@127.0.0.1:.

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

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

你可以在~/.ssh/config中添加条目:

Host vagrant
User vagrant
HostName localhost
Port 2222
IdentityFile /home/user_name/.vagrant.d/insecure_private_key

和simplescp file vagrant:/path/。你可以使用vagrant ssh-config命令找到身份文件的路径。

既然你要求最简单的方法,我建议使用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 -找到私钥,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:~

我希望这对你们有帮助,

流浪SCP插件工作,如果你知道你的流浪盒名称。 检查vagrant全局状态,它将提供您的盒子名称,然后您可以运行:

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

Vagrant SCP ~/foobar "name in my case default":/home/"user"/

进入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

如果出于某些原因,你没有被允许使用

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"

在那之后,如果你查看虚拟机中的文件:

vagrant ssh xxVirtualMachineNamexx
pwd
ls

在虚拟机目录中会有“file.txt”文件

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

最好的方式复制文件从本地到流浪,不需要写任何代码或任何东西或任何配置更改。 1-首先是流浪汉(流浪汉了) 2-打开cygwin 3- cygwin:去你的文件夹是vagrantfile或从哪里启动vagrant 4 - ssh的流浪汉 5-现在它将像一个正常的系统。< / p >

< p >试试. .流浪汉ubuntu 14.04

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

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

如果有人想将文件从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 upload localfile

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

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

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

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

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

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

    $vagrant upload ~/Desktop/file.sh host1

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

如果你"cd ."足够多的时间,你会发现流浪文件夹,其中包含所有的主机文件和文件夹