Cara termudah untuk menyalin satu file dari host ke tamu Vagrant?

241

Saya memiliki kasus penggunaan di mana saya kadang-kadang ingin menyalin satu file dari mesin host saya ke tamu Vagrant.

Saya tidak ingin melakukannya melalui pemasok tradisional (Boneka / Koki) karena ini sering kali saja - Saya hanya ingin sesuatu yang cepat ditambahkan ke Vagrantfile saya.

Saya tidak ingin berbagi seluruh direktori, mungkin karena saya ingin menimpa file yang ada tanpa nuking seluruh direktori pada tamu.

Tampaknya juga agak berlebihan untuk menulis skrip provisi shell, dan berurusan dengan kemungkinan melarikan diri, ketika semua yang ingin saya lakukan adalah menyalin file.

Jadi, apa cara termudah untuk menyalin satu file dari host ke tamu?

LeeXGreen
sumber
perhatikan bahwa jawaban yang diterima didasarkan pada Vagrant 1.x - menggunakan penyedia file adalah pendekatan standar Vagrant 2 , meskipun mengubah titik mount /vagrant seperti yang disebutkan di sini juga bisa menjadi pilihan yang baik
STW
3
Jawaban dari @jouell benar-benar layak mendapat lebih banyak suara untuk kasus penggunaan sederhana dari satu salinan file tunggal: vagrant upload /path/to/my/file...
dat
vagrant scp file.txt :~/.
AlikElzin-kilaka

Jawaban:

107

Alih-alih menggunakan penyedia shell untuk menyalin file, Anda juga dapat menggunakan penyedia file Vagrant .

Nama penyedia: "file"

Penyedia file memungkinkan Anda untuk mengunggah file dari mesin host ke mesin tamu.

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

  config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig"
end
lynnaloo
sumber
3
Ini jelas merupakan cara terbaik untuk melakukan ini di Vagrant 2! Namun, Vagrant 2 tidak tersedia pada saat saya perlu melakukan ini ... :)
LeeXGreen
4
Solusi ini kedengarannya bagus, tetapi saya tidak dapat menyalin file apa pun karena kesalahan izin.
orbatschow
@orbatschow Saya memiliki masalah yang sama, tetapi tidak jika saya menyalinnya ke/tmp
Ben
6
ini bukan yang diminta OP. pertanyaannya adalah bagaimana cara sesekali mentransfer file; harus menjalankan provisi terlalu banyak.
axd
253

Karena Anda meminta cara termudah, saya sarankan menggunakan vagrant-scp . Itu menambahkan perintah scp ke gelandangan, sehingga Anda dapat menyalin file ke VM Anda seperti yang biasanya Anda lakukan dengan scp.

Instal melalui:

vagrant plugin install vagrant-scp

Gunakan seperti ini:

vagrant scp <some_local_file_or_dir> [vm_name]:<somewhere_on_the_vm>
Luca Invernizzi
sumber
1
Ini tidak berhasil untuk saya. Saya menginstal plugin, tetapi terus mendapatkan kesalahan yang mengatakan "Plugin" vagrant-scp "tidak dapat ditemukan. Pastikan itu diinstal dengan benar melalui vagrant plugin."
rockerston
6
Hai Rod, vagrant-scp bekerja dengan Vagrant 1.7+. Dari bug yang Anda buka, Anda menjalankan 1.4.3. Jika Anda memerlukan plugin ini, saya khawatir Anda harus memutakhirkan (yang cepat dan tidak menyakitkan).
Luca Invernizzi
1
Saya mencoba perintah ini untuk menyalin file tetapi tidak berhasil dan memberikan kesalahan vagrant scp /vagrant/www/koushik.php ubuntu/trusty64:/usr/share/nginx/htmlsaya mencoba menyalin file ke direktori root nginx. Dikatakan, The machine with the name 'C' was not found configured for this Vagrant environment. Direktori dan semuanya baik-baik saja.
Koushik Das
3
Satu hal yang perlu ditambahkan: Anda harus menggunakan ID mesin yang bisa Anda dapatkan dengan status global gelandangan di kolom pertama. Nontheless, ini adalah solusi terbaik.
min hundje
1
@KoushikDas Tidak berfungsi di luar kotak pada windows. Anda harus mengaktifkan subsistem Ubuntu di windows 10, dan alih-alih meletakkan C: / .. untuk path ke file, Anda meletakkan / mnt / c / ... Dan berfungsi hore! Perhatikan juga komentar lainnya, gunakan gelrant status global untuk mendapatkan id dari mesin gelandangan.
Andrew
141

Sebenarnya ada solusi yang jauh lebih sederhana. Lihat https://gist.github.com/colindean/5213685/#comment-882885 :

"harap dicatat bahwa kecuali Anda secara spesifik menginginkan scp karena suatu alasan, cara termudah untuk mentransfer file dari host ke VM adalah dengan meletakkannya di direktori yang sama dengan Vagrantfile - direktori tersebut secara otomatis dipasang di bawah / gelandangan di VM sehingga Anda dapat menyalin atau menggunakannya langsung dari VM. "

Eric P.
sumber
3
Inilah tepatnya jawaban saya ... menjalankan pencadangan shell untuk menyalin file dari / vagrant /.
LeeXGreen
2
Lebih baik menggunakan ketentuan gelandangan seperti yang digunakan LeexGreen.
tokhi
4
Pastikan itu config.vm.synced_folder ".", "/vagrant", disabled: falsedan kemudianvagrant reload
Christopher Markieta
ini tidak berfungsi pada centos/7kotak gelandangan jika mencoba melakukan operasi terbalik (kotak gelandangan ke mesin lokal).
ryantuck
Ini berfungsi dengan baik bagi saya ketika menyalin file dari Ubuntu 14 vagrant VM saya ke host saya. Terima kasih!!
XtraSimplicity
98

Sebagai default, instance gelandangan pertama menggunakan port ssh sebagai 2222, dan alamat ip-nya adalah 127.0.0.1 (Anda mungkin perlu menyesuaikan port dengan host virtual nyata)

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

Jadi Anda dapat menjalankan perintah di bawah ini untuk menyalin file lokal Anda ke instance gelandangan. kata sandi sama dengan nama pengguna yaitu vagrant.

scp -P 2222 your_file [email protected]:.

Anda juga dapat menyalin file kembali ke host lokal Anda.

scp -P 2222 [email protected]:/PATH/filename .
BMW
sumber
3
Saya harus melakukan ini dan menonaktifkan pemeriksaan kunci yang ketat:scp -P 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no my-file.txt [email protected]:/tmp
Matt
Saya akan merekomendasikan untuk menambahkan opsi ssh ini ~/.ssh/configsebagai default, yang saya lakukan di lingkungan saya:StrictHostKeyChecking no
BMW
1
+1 + Jika seseorang memiliki lebih dari satu mesin virtual, nilai port harus diambil dari UI Oracle VM VirtualBox Manager - pilih vm di sebelah kiri, pengaturan, jaringan, penerusan port
Yordan Georgiev
1
Ini lebih baik daripada jawaban yang diterima. Direktori / gelandangan tidak selalu ada di sana.
jimm101
Mengejutkan betapa sulitnya rsyncuntuk bekerja dalam kasus ini dibandingkan dengan scp, mengingat deskripsi rsync sebagai "pengganti yang lebih cepat dan fleksibel untuk rcp."
Wildcard
56

Inilah pendekatan saya terhadap masalah:

Langkah 1 - Temukan kunci pribadi, ssh port dan 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

Langkah 2 - Transfer file menggunakan port dan kunci pribadi sebagai parameter untuk scp:

  scp -P 2222 -i /root/.vagrant.d/insecure_private_key \
  someFileName.txt [email protected]:~

Saya harap ini membantu,

alfredocambera
sumber
4
Ini adalah cara paling sederhana. Terima kasih.
elmonkeylp
2
Menggunakan kunci memungkinkan saya untuk mentransfer file. Jawaban yang lebih tinggi tanpa informasi ini tidak berfungsi, jadi terima kasih!
inostia
1
Solusi mudah dan lengkap.
Tao Starbow
27

Apa yang akhirnya saya lakukan adalah menyimpan file dalam direktori gelandangan saya (secara otomatis dipasang sebagai / gelrant /) dan menyalinnya dengan penyedia shell:

command = "cp #{File.join('/vagrant/', path_within_repo)} #{remote_file}"
config.vm.provision :shell, :inline => command
LeeXGreen
sumber
4
Saya akan merekomendasikan menggunakan coreutils installmisalnya install -D -m644 -C ...src dest. alih-alih cp, karena Anda dapat melakukan hal-hal seperti menentukan izin, kepemilikan, secara otomatis membuat direktori terkemuka, hanya melakukan salinan jika file perlu diperbarui, dll ... alih-alih cp, yang sederhana dan baik-baik saja jika hanya itu yang Anda inginkan perlu dilakukan.
xenoterracide
@LeeXGreen. Saya mencoba untuk melakukan hal yang sama seperti yang Anda coba lakukan tetapi saya tidak mendapatkan jawaban Anda. Apakah Anda mengetikkan baris kode di terminal? Di mana tepatnya Anda menempatkan itu?
Dan Rubio
Cuplikan kode dari jawaban saya sesuai Vagrantfiledengan ketentuan Anda yang lain. Anda harus mengganti path_within_repodan remote_filedengan hal-hal yang masuk akal, untuk aplikasi Anda, tentu saja :)
LeeXGreen
Bekerja tetapi saya mendapatkan "default: stdin: is not a tty" error
radtek
25
vagrant upload localfile

yang akan menempatkan file lokal di direktori home pengguna gelandangan

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

jell
sumber
2
Ini tampaknya sesuai dengan permintaan OPs untuk penggunaan sekali pakai yang mudah dengan sempurna.
dardub
20

Jika Anda tidak memiliki file dalam direktori Anda, Anda dapat menjalankan kode ini dalam file skrip dari mesin Host.

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

scp ${OPTIONS} /File/To/Copy vagrant@YourServer:/Where/To/Put/File

Dalam pengaturan ini, Anda hanya perlu mengubah /File/To/Copyke file atau file yang ingin Anda salin dan kemudian /Where/To/Put/Fileadalah lokasi di VM yang ingin Anda salin file.

Jika Anda membuat file ini dan menyebutnya, copyToServer.shAnda kemudian dapat menjalankan shperintah untuk mendorong file-file itu.

sh ./copyToServer.sh

Sebagai catatan akhir, Anda tidak dapat menjalankan kode ini provisionerkarena itu berjalan di server Tamu, sementara kode ini dijalankan dari Host.

Geedew
sumber
1
Ini mungkin solusi terbaik di luar menginstal plugin vagrant-scp. Ia menggunakan konfigurasi SSH yang digunakan Vagrant sehingga dapat menangani berbagai pengaturan jaringan yang disediakan oleh penyedia yang berbeda.
Sandy Chapman
1
Bagus! Saya sarankan Anda juga mencatat bahwa orang hanya dapat mengambil output vagrant ssh-configdan menempelkannya ke file ~ / .ssh / config mereka, untuk membuat ini lebih mudah di masa depan. Yaitu menggabungkan ini dengan jawaban chf
nealmcb
2
Saya merasa perlu untuk melewatkan baris pertama dari output ssh-config untuk menghindari kesalahan "Perintah host tidak didukung sebagai opsi baris perintah" - disebabkan oleh header untuk bagian ssh-config: "Host default". Jadi, skrip saya OPTIONS=`vagrant ssh-config | tail -n +2 | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`harus menghilangkan menggunakan baris pertama dari output ssh-config.
troyfolger
1
Atau, untuk menghapus kesalahan "Instruksi host tidak didukung", Anda dapat menggunakan OPTIONS=`vagrant ssh-config | grep -v '^Host ' | awk -v ORS=' ' 'NF{print "-o " $1 "=" $2}'`seperti yang didokumentasikan di sini: gist.github.com/geedew/11289350
user783836
10

Vagrant menyediakan cara untuk mengeksekusi perintah alih ssh alih-alih masuk, jadi untuk host dan tamu Linux Anda dapat menggunakan:

  • dari tuan rumah ke tamu:

cat ~/file_on_host.txt | vagrant ssh -c 'cat - > ~/file_on_guest.txt'

  • dari tamu ke tuan rumah:

vagrant ssh -c 'cat ~/file_on_guest.txt' > ~/file_on_host.txt

Tidak perlu plugin atau isi ulang tamu. Pastikan untuk memberikan ID kotak gelandangan untuk 'gelandangan ssh' jika Anda tidak berada dalam direktori yang sama dengan Vagrantfile. Diuji pada Vagrant v1.8.1.

pengguna7962684
sumber
Dari pendekatan guest to host tidak menyimpan simbol khusus dalam file
Dr.X
9

Anda dapat menambahkan entri di ~/.ssh/config:

Host vagrant
    User vagrant
    HostName localhost
    Port 2222
    IdentityFile /home/user_name/.vagrant.d/insecure_private_key

dan yang sederhana scp file vagrant:/path/. Anda dapat menemukan path ke file identitas menggunakan vagrant ssh-configperintah.

chf
sumber
1
Sangat membantu, dan membantu memperjelas apa yang sedang terjadi. Ini memungkinkan Anda menyalin kedua arah, melakukan salinan rekursif, dll. Dan memanfaatkan pengetahuan scp / ssh yang ada dengan baik
nealmcb
1
Saya baru saja membaca kembali jawaban di atas dan menemukan dengan memainkan jawaban weed geedew yang vagrant ssh-configmemberi Anda konfigurasi yang lebih lengkap dan nyaman yang dapat Anda masukkan ke ~ / .ssh / config Anda. Tapi terima kasih lagi!
nealmcb
7

Buka direktori tempat Anda memiliki Vagrantfile
Kemudian, edit Vagrantfiledan tambahkan yang berikut ini:

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

"." berarti direktori tempat Anda berada saat ini di mesin host
"/ gelandangan" mengacu pada "/ rumah / gelandangan" pada mesin tamu (mesin Vagrant).

Salin file yang Anda perlu kirim ke mesin tamu ke folder di mana Anda memiliki Vagrantfile Kemudian buka Git Bash Anda dan cdke direktori di mana Anda memiliki Vagrantfiledan ketik:

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

di mana XXXXXXX adalah nama vm Anda . Anda bisa mendapatkan nama vm Anda dengan menjalankan

vagrant global-status
akshaynagpal
sumber
7

jika karena alasan tertentu Anda tidak memiliki izin untuk menggunakan

vagrant plugin install vagrant-scp

ada cara alternatif:

Pertama, naikkan proyek Anda , lalu tulis di terminal:

vagrant ssh-config

Anda akan memiliki informasi tentang "HostName" dan "Port" dari mesin virtual Anda.

Dalam beberapa kasus, Anda dapat memiliki beberapa mesin virtual di proyek Anda. Jadi temukan saja mesin-master Anda (secara umum, VM ini memiliki port 2222), dan tidak memperhatikan informasi mesin lain.

tulis perintah untuk membuat salinan:

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

Pada curam ini Anda harus meletakkan kata sandi gelandangan: secara default itu "gelandangan"

setelah itu jika Anda melihat file di mesin virtual Anda:

vagrant ssh xxVirtualMachineNamexx
pwd
ls

Anda akan memiliki "file.txt" di direktori mesin virtual Anda

slideWXY
sumber
setelah memasukkan kata sandi gelandangan saya mendapatkan "Izin ditolak"
user2568374
2
tapi ini karena izin pada direktori target. Saya menyalin ke / home / gelandangan dan itu berhasil.
user2568374
4

plugin vagrant scp bekerja jika Anda tahu nama kotak gelandangan Anda. periksa status global gelandangan yang akan memberikan nama kotak Anda maka Anda dapat menjalankan:

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

vagrant scp ~ / foobar "name in my case default": / home / "user" /

Bálint Szigeti
sumber
1
ini berhasil untuk saya. sunting juga membantu, saya juga akan memasukkan perintah untuk menginstal plugin vagrant scp.
WhyAyala
1

Coba ini .. vagrant ubuntu 14.04 Ini bekerja untuk saya.

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

Cara alternatif untuk melakukan ini tanpa menginstal apa pun ( vagrant-scpdll.) Perhatikan bahwa nama defaultharus digunakan apa adanya, karena vagrant ssh-configmemancarkannya.

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

Fungsi ini tidak perlu jika scp -F =(vagrant ssh-config) ...akan bekerja di shell. Tapi karena ini tidak didukung oleh Bash, kita harus menggunakan solusi ini.

Gurjeet Singh
sumber
1

Jika seseorang ingin mentransfer file dari host windows ke gelandangan, maka solusi ini berhasil untuk saya.

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.

Anda harus dapat melihat direktori di mesin gelandangan Anda.

Lufy
sumber
-3

Cara terbaik untuk menyalin file dari lokal ke gelandangan, Tidak perlu menulis kode apa pun atau perubahan konfigurasi apa pun. 1- Pertama naikkan gelandangan ( gelandangan ) 2- buka cygwin 3- cygwin: buka folder Anda di mana vagrantfile atau dari mana Anda meluncurkan gelandangan 4- ssh gelandangan 5- sekarang ini akan berfungsi seperti sistem normal.

D-2020365
sumber
Satu masalah yang saya temukan dengan pendekatan ini: jika gelandangan perlu mengonfigurasi Penambahan Tamu Anda, direktori / gelran mungkin tidak benar-benar dipasang ketika penyedia file berjalan.
Torenware Networks