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


241

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

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

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

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

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


обратите внимание, что принятый ответ основан на Vagrant 1.x - использование поставщика файлов является стандартным подходом Vagrant 2 , хотя изменение точки монтирования, /vagrant как упомянуто здесь, также может быть хорошим вариантом
STW

3
Ответ от @jouell действительно заслуживаете более голосов за простое использование при одноразовой копии одного файла: vagrant upload /path/to/my/file...
Даты

vagrant scp file.txt :~/.
АликЭльзин-килака

Ответы:


107

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

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

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

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

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

3
Это определенно лучший способ сделать это в Vagrant 2! Тем не менее, Vagrant 2 не был доступен в то время, когда мне нужно было сделать это ... :)
LeeXGreen

4
Это решение звучит хорошо, но я не могу скопировать файл из-за ошибок разрешения.
orbatschow

@orbatschow У меня была такая же проблема, но не тогда, когда я ее скопировал/tmp
Бен

6
это не то, что спросил ОП. вопрос заключался в том, как иногда передавать файлы; необходимость запустить выделение ресурсов - это излишне.
AXD

253

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

Установить через:

vagrant plugin install vagrant-scp

Используйте это так:

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

1
Это не сработало для меня. Я установил плагин, но постоянно получал сообщение об ошибке «Плагин« vagrant-scp »не найден. Пожалуйста, убедитесь, что он правильно установлен через vagrant plugin».
Рокерстон

6
Привет Род, vagrant-scp работает с Vagrant 1.7+. Из ошибки, которую вы открыли, вы работаете 1.4.3. Если вам нужен этот плагин, боюсь, вам придется обновить его (это быстро и безболезненно).
Лука Инвернизци

1
Я попробовал эту команду для копирования файлов, но не сработал и выдает ошибку. vagrant scp /vagrant/www/koushik.php ubuntu/trusty64:/usr/share/nginx/htmlЯ пытаюсь скопировать файлы в корневой каталог nginx. The machine with the name 'C' was not found configured for this Vagrant environment. Там написано : каталог и все нормально.
Кушик дас

3
Одна вещь, которую нужно добавить: вы должны использовать ID машины, который вы можете получить с помощью vagrant global-status в первом столбце. Тем не менее, это лучшее решение imho.
Мин Hundje

1
@KoushikDas Не работает из коробки на окнах. Вы должны включить подсистему Ubuntu в Windows 10, а затем вместо C: / .. для пути к файлу, вы поставите / mnt / c / ... И работает ура! Также обратите внимание на другой комментарий, используйте vagrant global-status для получения идентификатора vagrant-машины.
Андрей

141

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

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


3
Это именно то, что делает мой ответ ... он запускает оболочку для копирования файла из / vagrant /.
LeeXGreen

2
Лучше использовать Vagrant Provisioning, как LeexGreen.
Тохи

4
Убедитесь, что config.vm.synced_folder ".", "/vagrant", disabled: falseи тогдаvagrant reload
Кристофер Маркиета

это не работает с centos/7бродячей коробкой, если вы пытаетесь выполнить обратную операцию (бродячая коробка с локальной машиной).
ryantuck

Это прекрасно работает для меня при копировании файла с моей виртуальной машины Ubuntu 14 на мой хост. Спасибо!!
XtraSimplicity

98

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

3
Я должен был сделать это и отключить строгую проверку ключей:scp -P 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no my-file.txt matt@127.0.0.1:/tmp
Мэтт

Я порекомендую добавить эти опции ssh ~/.ssh/configпо умолчанию, что я и сделал в моей среде:StrictHostKeyChecking no
BMW

1
+1 + Если у вас есть более одной виртуальной машины, значение порта следует взять из пользовательского интерфейса Oracle VM VirtualBox Manager - выберите vm слева, настройки, сеть, переадресация портов
Йордан Георгиев

1
Это лучше, чем принятый ответ. Каталог / vagrant не всегда существует.
jimm101

Удивительно, насколько труднее получить rsyncработу в этом случае по сравнению с scpприведенным описанием rsync как «более быстрой и гибкой заменой rcp».
Wildcard

56

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

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

Я надеюсь, что это помогает,


4
Это самый простой способ. Спасибо.
elmonkeylp

2
Использование ключа позволило мне передать файл. Более высокий ответ без этой информации не сработал, так что спасибо!
Иностия

1
Простое и полное решение.
Тао Старбоу

27

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

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

4
Я бы рекомендовал использовать coreutils, installнапример, install -D -m644 -C ...src dest. вместо cp, потому что вы можете делать такие вещи, как указание прав доступа, владение, автоматическое создание ведущих каталогов, копировать только в том случае, если необходимо обновить файл и т. д. ... вместо cp, что просто и хорошо, если это все, что вам нужно нужно сделать.
ксенотеррацид

@LeeXGreen. Я пытаюсь сделать то же самое, что вы пытались сделать, но я не совсем понимаю ваш ответ. Вы набрали эту строку кода в терминале? Где именно вы это разместили?
Дэн Рубио

Фрагмент кода из моего ответа идет Vagrantfileвместе с другими вашими провайдерами. Вам нужно будет заменить path_within_repoи remote_fileвещами, которые имеют смысл, для вашего приложения, конечно :)
LeeXGreen

Работает, но я получаю ошибку "default: stdin: is tty"
radtek 20.01.15


20

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

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


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

1
Ницца! Я также предлагаю вам заметить, что люди могут просто взять вывод vagrant ssh-configи вставить его в свой файл ~ / .ssh / config, чтобы сделать это еще проще в будущем. Т.е. объединяя это с ответом
ЧФ

2
Я обнаружил, что необходимо пропустить первую строку вывода ssh-config, чтобы избежать ошибки «Директива хоста не поддерживается как параметр командной строки», вызванной заголовком раздела ssh-config: «Host default». Итак, мой сценарий должен OPTIONS=`vagrant ssh-config | tail -n +2 | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`опустить использование первой строки вывода ssh-config.
Тройфолгер

1
Кроме того, чтобы удалить ошибку «Директива хоста не поддерживается», вы можете использовать ее, OPTIONS=`vagrant ssh-config | grep -v '^Host ' | awk -v ORS=' ' 'NF{print "-o " $1 "=" $2}'`как описано
user783836

10

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.


Подход от гостя к хосту не сохраняет специальные символы в файлах
Dr.X

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команду.


1
Очень полезно и помогает уточнить, что происходит. Это позволяет вам копировать оба направления, делать рекурсивные копии и т. Д. И красиво использовать имеющиеся знания о scp / ssh
nealmcb

1
Я просто перечитал ответы выше и обнаружил, играя с ответом geedew, который vagrant ssh-configдает вам еще более полный и удобный фрагмент конфигурации, который вы можете вставить в ~ / .ssh / config. Но еще раз спасибо!
nealmcb

7

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

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

"" означает, что каталог, в котором вы сейчас находитесь на хост-компьютере,
"/ vagrant" ссылается на "/ home / vagrant" на гостевой машине (Vagrant machine).

Скопируйте файлы, которые нужно отправить на гостевой компьютер, в папку, где у вас есть. Vagrantfile Затем откройте Git Bash и cdв каталог, где у вас есть, Vagrantfileи введите:

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

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

vagrant global-status

7

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

vagrant plugin install vagrant-scp

Есть альтернативный способ:

Сначала выпустите ваш vagrantProject , затем напишите в терминале:

vagrant ssh-config

у вас будет информация о «HostName» и «Port» вашей виртуальной машины.

В некоторых случаях в вашем проекте может быть несколько виртуальных машин. Так что просто найдите свою мастер-машину (как правило, эта виртуальная машина имеет порт 2222), и не обращайте внимания на информацию о других машинах.

напишите команду, чтобы сделать копию:

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

На этом круче вам придется поставить бродячий пароль: по умолчанию он "бродячий"

после этого, если вы посмотрите на файлы на вашей виртуальной машине:

vagrant ssh xxVirtualMachineNamexx
pwd
ls

у вас будет файл "file.txt" в каталоге вашей виртуальной машины


после ввода бродячего пароля я получаю «Отказано в
доступе

2
но это было связано с разрешениями на целевой каталог. Я скопировал в / home / vagrant, и это сработало.
user2568374

4

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

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

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


1
это сработало для меня. Редактирование также полезно, я бы также включил команду для установки плагина vagrant scp.
WhyAyala

1

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

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

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) ...бы работала через оболочки. Но поскольку Bash это не поддерживает, мы должны прибегнуть к этому обходному пути.


1

Если кто-то хочет перенести файл с хоста 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.

Вы должны быть в состоянии видеть каталоги на своем бродячем компьютере.


-3

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


Одна проблема, которую я обнаружил при таком подходе: если vagrant необходимо настроить ваши гостевые дополнения, каталог / vagrant может фактически не монтироваться при запуске поставщика файлов.
Torenware Networks
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.