Самый простой способ скопировать один файл с хоста на Vagrant guest?
У меня есть прецедент, когда я иногда хочу скопировать один файл с моей хост-машины на бродячего гостя.
Я не хочу делать это с помощью традиционных провизионов (кукла / шеф-повар), потому что это часто одноразовый-я просто хочу что-то быстро добавить к моему Vagrantfile.
Я не хочу делиться целым каталогом, возможно, потому, что я хочу перезаписать существующий файл, не уничтожая весь каталог на гостевой.
Это тоже кажется немного излишне писать сценарий подготовки оболочки и иметь дело с потенциальным экранированием, когда все, что я хочу сделать, это скопировать файл.
Итак, какой самый простой способ скопировать один файл с хоста на гостевой?
15 ответов:
вместо того, чтобы использовать оболочку provisioner для копирования файла, вы также можете использовать Vagrant file provisioner.
поставщица имя:
"file"программа подготовки файлов позволяет загрузить файл с хост-компьютера на гостевой компьютер.
Vagrant.configure("2") do |config| # ... other configuration config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig" end
Так как вы просите самый простой способ, я предлагаю использовать vagrant-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 [email protected]:.вы также можете скопировать файл на локальный хост.
scp -P 2222 [email protected]:/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 [email protected]:~надеюсь, это поможет,
то, что я в конечном итоге сделал, это сохранить файл в моем каталоге vagrant (автоматически монтируется как /vagrant/) и скопировать его с помощью оболочки provisioner:
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вы будете иметь информацию о "имя хоста" и "порт" вашей виртуальной машины.
в некоторых случаях, вы могли бы иметь некоторые виртуальные машины в вашем проекте. Поэтому просто найдите свою мастер-машину (в общем, эта виртуальная машина имеет порт 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/где ХХХХХХХ - имя виртуальной машины. Вы можете получить имя виртуальной машины, выполнив
vagrant global-status
плагин vagrant scp работает, если вы знаете свое имя Vagrant box. проверьте vagrant global-status, который предоставит ваше имя коробки, то вы можете запустить:
vagrant global-statusid name provider state directory ------------------------------------------------------------------------ 13e680d **default** virtualbox running /home/userбродяга УПП ~/фрагментик "имя в моем случае по умолчанию":/главная/"пользователь"/
попробуйте это.. бродяга ubuntu 14.04 Это сработало для меня.
scp -r -P 2222 vagrant@localhost:/home .
альтернативный способ сделать это без установки (
vagrant-scpetc.) Обратите внимание, что имя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 vagrant 5 - теперь она будет работать как обычная система.
Comments