Самый простой способ скопировать один файл с хоста на Vagrant guest?

У меня есть прецедент, когда я иногда хочу скопировать один файл с моей хост-машины на бродячего гостя.

Я не хочу делать это через традиционных поставщиков (кукла / шеф-повар), потому что это часто одноразовый-я просто хочу что-то быстро добавить к моему Vagrantfile.

Я не хочу делиться всей Директорией, возможно, потому, что я хочу перезаписать существующий файл, не сбросив всю директорию на гостя.

Это также кажется немного излишне писать сценарий подготовки оболочки и иметь дело с потенциальным побегом, когда все, что я хочу сделать, это скопировать файл.

Итак, какой самый простой способ скопировать один файл с хоста на гостя?

15 ответов


вместо того, чтобы использовать Shell provisioner для копирования файла, вы также можете использовать Vagrant файл provisioner.

поставщица имя: "file"

поставщик файлов позволяет загружать файл с хост-компьютера на гостевой компьютер.

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

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

поскольку вы просите самый простой способ, я предлагаю использовать бродяга-scp. Он добавляет команду scp в vagrant, поэтому вы можете копировать файлы на свою виртуальную машину, как обычно с scp.

установить с помощью:

vagrant plugin install vagrant-scp

используйте его так:

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

на самом деле есть более простое решение. См.https://gist.github.com/colindean/5213685/#comment-882885:

"обратите внимание, что если вы специально не хотите scp по какой - либо причине, самый простой способ передачи файлов с хоста на виртуальную машину-просто поместить их в тот же каталог, что и Vagrantfile-этот каталог автоматически монтируется под /vagrant в виртуальной машине, чтобы вы могли копировать или использовать их непосредственно с виртуальной машины."


по умолчанию первый экземпляр vagrant использует 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 .

вот мой подход к проблеме:

Шаг 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:~

надеюсь, это поможет,


в конечном итоге я сделал, чтобы сохранить файл в моем каталоге vagrant (автоматически монтируется как /vagrant/) и скопировать его с помощью оболочки:

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

если вы ограничены от наличия файлов в каталоге, вы можете запустить этот код в файле сценария с хост-компьютера.

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

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 потому что это работает на гостевом сервере, в то время как этот код выполняется с хоста.


вы можете добавить запись в ~/.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 вместо входа в систему, поэтому для хоста и гостя 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

не нужны плагины или гость перезаряжает. Просто убедитесь, что предоставите Vagrant box ID для "vagrant ssh", если вы не находитесь в том же каталоге, что и Vagrantfile. Протестировано на Vagrant v1.8.1.


если по каким-то причинам у вас нет разрешения на использование

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 ssh xxVirtualMachineNamexx
pwd
ls

вы получили файл".txt " в каталоге вашей виртуальной машины


перейдите в каталог, где у вас есть свой Vagrantfile
Затем отредактируйте свой Vagrantfile и добавить следующее:

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

"." означает каталог, в котором вы находитесь в настоящее время на вашем хоста
"/залет" относится к "/ home / vagrant " на гостевые машины(бродяги машина).

скопируйте файлы, которые необходимо отправить на гостевой машине в папку, где у вас есть ваш Vagrantfile Тогда открой Git Баш и cd в папку, где у вас есть свой Vagrantfile и

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

где XXXXXXX ваш имя виртуальной машины. Вы можете получить имя виртуальной машины, выполнив

vagrant global-status

плагин vagrant scp работает, если вы знаете свое имя коробки vagrant. проверьте vagrant global-status, который предоставит ваше имя коробки, то вы можете запустить:

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

vagrant scp ~ / foobar "имя в моем случае по умолчанию": / home/"пользователь"/


попробуйте это.. залет в Ubuntu 14.04 Это сработало для меня.

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

альтернативный способ сделать это без установки (vagrant-scp etc.) Обратите внимание, что имя 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, мы должны прибегнуть к этому обходному пути.


лучший способ скопировать файл из локального в бродягу, нет необходимости писать какой-либо код или что-либо или какие-либо изменения конфигурации. 1 - Первый бродяга (залет вверх) 2 - открытые с Cygwin 3-cygwin: перейдите в папку, где находится vagrantfile или откуда вы запускаете vagrant 4- ssh бродяга 5-теперь он будет работать как нормальная система.