Самый простой способ скопировать один файл с хоста на 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-теперь он будет работать как нормальная система.