Найпростіший спосіб скопіювати один файл з хоста до гостя Vagrant?


241

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

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

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

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

Отже, який найпростіший спосіб скопіювати один файл з хоста до гостя?


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

3
Відповідь від @jouell дійсно заслуговуєте більше голосів за просте використання при одноразової копії одного файлу: vagrant upload /path/to/my/file...
Дати

vagrant scp file.txt :~/.
AlikElzin-kilaka

Відповіді:


107

Замість того щоб використовувати Provisioner оболонки , щоб скопіювати файл, ви можете також використовувати Vagrant файл Provisioner .

Ім'я постачальника: "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 до бродячого, тому ви можете копіювати файли у свій VM так, як це робиться з 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
Ще одне, що потрібно додати: Ви повинні використовувати ідентифікатор машини, який ви можете отримати із бродячим глобальним статусом у першому стовпці. Тим не менш, це найкраще рішення.
хв хундже

1
@KoushikDas Не працює з вікна на вікнах. Вам потрібно включити підсистему Ubuntu у Windows 10, а потім замість того, щоб ставити C: / .. для шляху до файлу, ви ставите / mnt / c / ... І працює ура! Також зверніть увагу на інший коментар, використовуйте бродячий глобальний статус, щоб отримати ідентифікатор бродячої машини.
Андрій

141

Насправді існує набагато простіше рішення. Дивіться https://gist.github.com/colindean/5213685/#comment-882885 :

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


3
Це саме те, що робить моя відповідь ... він запускає захисника оболонки для копіювання файлу з / бродячого /.
LeeXGreen

2
Краще використовувати бродячі розробки, як використовували LeexGreen.
токі

4
Переконайтесь у тому, config.vm.synced_folder ".", "/vagrant", disabled: falseа потімvagrant reload
Крістофер Маркієта

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

Це прекрасно працює для мене при копіюванні файлу з мого бродячого VM Ubuntu 14 на мій хост. Дякую!!
XtraSimplicity

98

За замовчуванням перший екземпляр бродячого використовує порт ssh як 2222, а його ip-адреса - 127.0.0.1 (Можливо, вам потрібно буде налаштувати порт з реальним віртуальним хостом)

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

Таким чином, ви можете запустити команду нижче, щоб скопіювати свій локальний файл у бродячий екземпляр. пароль - це те саме, що ім'я користувача, яке є 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
Використання ключа дозволило мені перенести файл. Вища відповідь без цієї інформації не спрацювала, тому дякую!
inostia

1
Просте і повне рішення.
Дао Starbow

27

Що я в кінцевому підсумку робив, це зберігати файл у моєму бродячому каталозі (автоматично монтується як / 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

Працює, але я отримую помилку "за замовчуванням: stdin: це не tty"
radtek

25
vagrant upload localfile

який помістить файл локального файлу в домашньому режисері бродячого користувача

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


2
Це, здається, ідеально відповідає запиту на оперативні програми для простого одноразового використання.
Дардуб

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, щоб зробити це ще простіше у майбутньому. Тобто поєднуючи це з відповіддю
chf

2
Я вважав за необхідне пропустити перший рядок виводу ssh-config, щоб уникнути помилки "Директива про хост не підтримується як параметр командного рядка" - викликана заголовком для розділу ssh-config: "Хост за замовчуванням". Отже, мій сценарій OPTIONS=`vagrant ssh-config | tail -n +2 | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`повинен опустити, використовуючи той перший рядок виводу ssh-config.
troyfolger

1
Крім того, для видалення помилки "Хост-директива не підтримується" ви можете використовувати, OPTIONS=`vagrant ssh-config | grep -v '^Host ' | awk -v ORS=' ' 'NF{print "-o " $1 "=" $2}'`як тут задокументовано: gist.github.com/geedew/11289350
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 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 . Ви можете отримати своє ім'я vm, запустивши

vagrant global-status

7

якщо з якихось причин у вас немає дозволу на використання

vagrant plugin install vagrant-scp

є альтернативний спосіб:

Спочатку бродять вашVagrantProject , а потім напишіть у терміналі:

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" у вашому каталозі віртуальної машини


після введення бродячого пароля я отримую "Дозвіл відмовлено"
користувач2568374

2
але це було пов’язано з дозволами на цільовий реж. Я скопіював у / додому / бродягу, і це спрацювало.
користувач2568374

4

плагін бродячого scp працює, якщо ви знаєте своє ім'я бродячої скриньки. встановіть прапорець глобального статусу, який надасть ім'я вашого поля, тоді ви можете запустити:

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

vagrant scp ~ / foobar "ім'я в моєму випадку за замовчуванням": / home / "user" /


1
це працювало для мене. редагування також корисно, я також включав би команду встановити бродячий модуль scp.
ЧомуАяла

1

Спробуйте це .. бродячий 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) ...вона працювала в оболонках. Але оскільки це не підтримується Башем, ми мусимо вдатися до цього рішення.


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.

Ви повинні мати можливість бачити каталоги у вашій бродячі.


-3

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


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