Cách dễ nhất để sao chép một tập tin từ máy chủ sang khách Vagrant?


241

Tôi có một trường hợp sử dụng khi thỉnh thoảng tôi muốn sao chép một tệp từ máy chủ của mình sang máy khách Vagrant.

Tôi không muốn làm như vậy thông qua các nhà cung cấp truyền thống (Puppet / Chef) bởi vì đây thường là một lần - tôi chỉ muốn một cái gì đó nhanh chóng để thêm vào Vagrantfile của tôi.

Tôi không muốn chia sẻ toàn bộ thư mục, có thể vì tôi muốn ghi đè lên một tệp hiện có mà không thu thập toàn bộ thư mục trên máy khách.

Cũng có vẻ hơi quá khi viết một kịch bản cung cấp shell và đối phó với khả năng thoát tiềm năng, khi tất cả những gì tôi muốn làm là sao chép một tệp.

Vì vậy, cách dễ nhất để sao chép một tập tin từ máy chủ sang khách là gì?


lưu ý rằng câu trả lời được chấp nhận dựa trên Vagrant 1.x-- sử dụng trình cung cấp tệp là cách tiếp cận Vagrant 2 tiêu chuẩn , mặc dù thay đổi điểm gắn kết /vagrant như đã đề cập ở đây cũng có thể là một lựa chọn tốt
STW

3
Câu trả lời từ @jouell thực sự đáng để bình chọn nhiều hơn cho trường hợp sử dụng đơn giản một bản sao một lần của một tệp: vagrant upload /path/to/my/file...
dat

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

Câu trả lời:


107

Thay vì sử dụng trình cung cấp shell để sao chép tệp, bạn cũng có thể sử dụng trình cung cấp tệp Vagrant .

Tên nhà cung cấp: "file"

Trình cung cấp tệp cho phép bạn tải tệp từ máy chủ lên máy khách.

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

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

3
Đây chắc chắn là cách tốt nhất để làm điều này trong Vagrant 2! Tuy nhiên, Vagrant 2 không có sẵn tại thời điểm tôi cần để làm điều này ... :)
LeeXGreen

4
Giải pháp này nghe có vẻ hay, nhưng tôi không thể sao chép bất kỳ tập tin nào do lỗi cấp phép.
orbatschow

@orbatschow Tôi gặp vấn đề tương tự, nhưng nếu tôi sao chép nó vào/tmp
Ben

6
Đây không phải là những gì OP yêu cầu. câu hỏi là làm thế nào để thỉnh thoảng chuyển tập tin; phải chạy dự phòng là quá mức cần thiết.
axd

253

Vì bạn hỏi cách dễ nhất, tôi khuyên bạn nên sử dụng vagrant-scp . Nó thêm một lệnh scp vào vagrant, vì vậy bạn có thể sao chép các tệp vào VM như bạn thường làm với scp.

Cài đặt qua:

vagrant plugin install vagrant-scp

Sử dụng nó như vậy:

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

1
Điều này đã không làm việc cho tôi. Tôi đã cài đặt plugin, nhưng liên tục gặp lỗi "Không thể tìm thấy plugin" vagrant-scp ". Vui lòng đảm bảo rằng nó được cài đặt đúng cách vagrant plugin."
rockerston

6
Xin chào Rod, vagrant-scp hoạt động với Vagrant 1.7+. Từ lỗi bạn đã mở, bạn đang chạy 1.4.3. Nếu bạn cần plugin này, tôi e rằng bạn sẽ phải nâng cấp (nhanh và không đau).
Luca Invernizzi

1
Tôi đã thử lệnh này để sao chép tệp nhưng không hoạt động và báo lỗi. vagrant scp /vagrant/www/koushik.php ubuntu/trusty64:/usr/share/nginx/htmlTôi đang cố sao chép tệp vào thư mục gốc nginx. Nó nói, The machine with the name 'C' was not found configured for this Vagrant environment. Thư mục và mọi thứ đều ổn.
Koushik Das

3
Một điều cần thêm: Bạn phải sử dụng ID của máy mà bạn có thể nhận được với trạng thái toàn cầu mơ hồ trong cột đầu tiên. Không cần, đây là giải pháp tốt nhất imho.
min hundje

1
@KoushikDas Không hoạt động ngoài hộp trên windows. Bạn phải kích hoạt hệ thống con Ubuntu trên windows 10, và sau đó thay vì đặt C: / .. cho đường dẫn đến tệp, bạn đặt / mnt / c / ... Và hoạt động hooray! Cũng lưu ý các nhận xét khác, sử dụng trạng thái toàn cầu mơ hồ để lấy id của máy vagrant.
Andrew

141

Thực sự có một giải pháp đơn giản hơn nhiều. Xem https://gist.github.com/colindean/5213685/#comment-882885 :

"xin lưu ý rằng trừ khi bạn đặc biệt muốn scp vì một số lý do, cách dễ nhất để chuyển tệp từ máy chủ sang VM là chỉ cần đặt chúng vào cùng thư mục với Vagrantfile - thư mục đó được tự động gắn vào / vagrant trong VM bạn có thể sao chép hoặc sử dụng chúng trực tiếp từ VM. "


3
Đây chính xác là những gì câu trả lời của tôi làm ... nó chạy một nhà cung cấp shell để sao chép tệp từ / vagrant /.
LeeXGreen

2
Nó tốt hơn để sử dụng cung cấp mơ hồ như LeexGreen đã sử dụng.
tokhi

4
Đảm bảo rằng config.vm.synced_folder ".", "/vagrant", disabled: falsevà sau đóvagrant reload
Christopher Markieta

điều này không hoạt động trên centos/7hộp vagrant nếu cố gắng thực hiện thao tác ngược lại (hộp vagrant vào máy cục bộ).
Ryan Tuck

Điều này hoạt động hoàn hảo với tôi khi sao chép một tệp từ máy ảo mơ hồ Ubuntu 14 của tôi vào máy chủ của tôi. Cảm ơn!!
XtraSimplility

98

Theo mặc định, phiên bản vagrant đầu tiên sử dụng cổng ssh là 2222 và địa chỉ IP của nó là 127.0.0.1 (Bạn có thể cần điều chỉnh cổng với máy chủ ảo thực)

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

Vì vậy, bạn có thể chạy lệnh dưới đây để sao chép tệp cục bộ của bạn sang thể hiện mơ hồ. mật khẩu giống như tên người dùng vagrant.

scp -P 2222 your_file vagrant@127.0.0.1:.

Bạn cũng có thể sao chép tệp trở lại máy chủ lưu trữ cục bộ của bạn.

scp -P 2222 vagrant@127.0.0.1:/PATH/filename .

3
Tôi đã phải làm điều này và vô hiệu hóa kiểm tra khóa nghiêm ngặt:scp -P 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no my-file.txt matt@127.0.0.1:/tmp
Matt

Tôi sẽ khuyên bạn nên thêm các tùy chọn ssh này vào ~/.ssh/configmặc định, điều mà tôi đã làm trong môi trường của mình:StrictHostKeyChecking no
BMW

1
+1 + Nếu một máy có nhiều máy ảo, giá trị của cổng phải được lấy từ UI của Trình quản lý VirtualBox của Oracle VM - chọn vm ở bên trái, cài đặt, mạng, chuyển tiếp cổng
Yordan Georgiev

1
Điều này là tốt hơn so với câu trả lời được chấp nhận. Thư mục / vagrant không phải lúc nào cũng có.
jimm101

Đáng ngạc nhiên là làm việc khó hơn bao nhiêu rsyncđể làm việc trong trường hợp này so với scp, mô tả của rsync là "sự thay thế linh hoạt, nhanh hơn cho RCp."
tự đại diện

56

Đây là cách tiếp cận vấn đề của tôi:

Bước 1 - Tìm khóa riêng, cổng ssh và 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

Bước 2 - Truyền tệp bằng cổng và khóa riêng làm tham số cho scp:

  scp -P 2222 -i /root/.vagrant.d/insecure_private_key \
  someFileName.txt vagrant@127.0.0.1:~

Tôi hy vọng nó sẽ giúp,


4
Đây là cách đơn giản nhất. Cảm ơn bạn.
elmonkeylp

2
Sử dụng khóa cho phép tôi chuyển tập tin. Câu trả lời cao hơn mà không có thông tin này không hoạt động, vì vậy cảm ơn bạn!
inostia

1
Giải pháp dễ dàng và đầy đủ.
Tao Starbow

27

Điều cuối cùng tôi làm là giữ tập tin trong thư mục vagrant của tôi (tự động được gắn kết là / vagrant /) và sao chép nó với một nhà cung cấp shell:

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

4
Tôi khuyên bạn nên sử dụng coreutils, installví dụ như install -D -m644 -C ...src mệnh. thay vì cp, bởi vì bạn có thể làm những việc như chỉ định quyền, quyền sở hữu, tự động tạo thư mục hàng đầu, chỉ thực hiện sao chép nếu tệp cần được cập nhật, v.v ... thay vì cp, đơn giản và tốt nếu đó là tất cả các bạn cần làm.
xenoterracide

@LeeXGreen. Tôi đang cố gắng làm điều tương tự mà bạn đang cố gắng thực hiện nhưng tôi không nhận được câu trả lời của bạn. Bạn đã gõ dòng mã đó trong thiết bị đầu cuối? Chính xác thì bạn đã đặt nó ở đâu?
Dan Rubio

Đoạn mã từ câu trả lời của tôi đi Vagrantfilecùng với các nhà cung cấp khác của bạn. Tất nhiên, bạn sẽ cần phải thay thế path_within_reporemote_filebằng những thứ có ý nghĩa, cho ứng dụng của bạn :)
LeeXGreen 26/07/14

Hoạt động nhưng tôi gặp lỗi "mặc định: stdin: không phải là lỗi"
radtek


20

Nếu bạn bị hạn chế không có các tệp trong thư mục của mình, bạn có thể chạy mã này trong tệp tập lệnh từ Máy chủ.

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

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

Trong thiết lập này, bạn chỉ cần thay đổi /File/To/Copytệp hoặc tệp bạn muốn sao chép và sau đó /Where/To/Put/Filelà vị trí trên VM mà bạn muốn sao chép tệp.

Nếu bạn tạo tệp này và gọi nó, copyToServer.shbạn có thể chạy shlệnh để đẩy các tệp đó.

sh ./copyToServer.sh

Lưu ý cuối cùng, bạn không thể chạy mã này provisionervì nó chạy trên máy chủ Khách, trong khi mã này chạy từ Máy chủ.


1
Đây có lẽ là giải pháp tốt nhất ngoài việc cài đặt plugin vagrant-scp. Nó sử dụng cấu hình SSH mà Vagrant sử dụng để có thể xử lý các thiết lập mạng khác nhau được cung cấp bởi các nhà cung cấp khác nhau.
Sandy Chapman

1
Đẹp! Tôi đề nghị bạn cũng lưu ý rằng mọi người chỉ cần lấy đầu ra vagrant ssh-configvà dán nó vào tệp ~ / .ssh / config của họ, để làm cho việc này thậm chí còn dễ dàng hơn trong tương lai. Tức là kết hợp điều này với câu trả lời của
chf

2
Tôi thấy cần phải bỏ qua dòng đầu tiên của đầu ra ssh-config để tránh lỗi "Chỉ thị máy chủ không được hỗ trợ dưới dạng tùy chọn dòng lệnh" - gây ra bởi tiêu đề cho phần ssh-config: "Mặc định máy chủ". Vì vậy, tập lệnh của tôi OPTIONS=`vagrant ssh-config | tail -n +2 | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`phải bỏ qua việc sử dụng dòng đầu ra ssh-config đầu tiên đó.
troyreasger 3/03/2016

1
Ngoài ra, để xóa lỗi "Chỉ thị máy chủ không được hỗ trợ", bạn có thể sử dụng OPTIONS=`vagrant ssh-config | grep -v '^Host ' | awk -v ORS=' ' 'NF{print "-o " $1 "=" $2}'`như được ghi lại ở đây: gist.github.com/geedew/11289350
user783836

10

Vagrant cung cấp một cách để thực thi lệnh trên ssh thay vì đăng nhập, vì vậy đối với máy chủ và khách Linux, bạn có thể sử dụng:

  • từ chủ đến khách:

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

  • từ khách đến chủ nhà:

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

Không cần plugin hoặc tải lại khách. Chỉ cần đảm bảo cung cấp ID hộp vagrant cho 'vagrant ssh' nếu bạn không ở cùng thư mục với Vagrantfile. Đã thử nghiệm trên Vagrant v1.8.1.


Từ khách đến tiếp cận máy chủ không lưu giữ các ký hiệu đặc biệt trong tệp
Dr.X

9

Bạn có thể thêm mục nhập trong ~/.ssh/config:

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

và đơn giản scp file vagrant:/path/. Bạn có thể tìm đường dẫn đến tệp nhận dạng bằng vagrant ssh-configlệnh.


1
Rất hữu ích, và giúp làm rõ những gì đang xảy ra. Điều này cho phép bạn sao chép cả hai hướng, thực hiện các bản sao đệ quy, v.v. và tận dụng kiến ​​thức hiện có về scp / ssh độc đáo
nealmcb

1
Tôi vừa đọc lại các câu trả lời ở trên và phát hiện ra bằng cách chơi câu trả lời của wiht geedew vagrant ssh-configcung cấp cho bạn một cấu hình hoàn chỉnh và tiện lợi hơn mà bạn có thể đặt trong ~ / .ssh / config. Nhưng cảm ơn một lần nữa!
nealmcb

7

Chuyển đến thư mục nơi bạn có Vagrantfile
Then, chỉnh sửa Vagrantfilevà thêm vào như sau:

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

"." có nghĩa là thư mục bạn hiện đang ở trên máy chủ của bạn
"/ vagrant" đề cập đến "/ home / vagrant" trên máy khách (Máy Vagrant).

Sao chép các tệp bạn cần gửi đến máy khách vào thư mục nơi bạn có Vagrantfile Sau đó mở Git Bashcdvào thư mục nơi bạn có Vagrantfilevà gõ:

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

trong đó XXXXXXX là tên vm của bạn . Bạn có thể lấy tên vm của bạn bằng cách chạy

vagrant global-status

7

nếu vì một số lý do bạn không được phép sử dụng

vagrant plugin install vagrant-scp

có một cách khác:

Đầu tiên hãy liệt kê yourVagrantProject , sau đó viết vào terminal:

vagrant ssh-config

bạn sẽ có thông tin về "HostName" và "Cổng" của máy ảo.

Trong một số trường hợp, bạn có thể có một số máy ảo trong dự án của bạn. Vì vậy, chỉ cần tìm máy chủ của bạn (nói chung, VM này có cổng 2222) và không chú ý đến các thông tin máy khác.

viết lệnh để tạo bản sao:

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

Ở độ dốc này, bạn sẽ phải đặt một mật khẩu mơ hồ: theo mặc định nó là "vagrant"

sau đó nếu bạn xem các tệp trong máy ảo của mình:

vagrant ssh xxVirtualMachineNamexx
pwd
ls

bạn sẽ có "file.txt" trong thư mục máy ảo của mình


sau khi nhập mật khẩu mơ hồ, tôi nhận được "Quyền bị từ chối"
user2568374

2
nhưng điều này là do quyền trên thư mục đích. Tôi đã sao chép vào / home / vagrant và điều đó đã làm việc.
dùng2568374

4

plugin scrant vagrant hoạt động nếu bạn biết tên hộp vagrant của bạn. kiểm tra trạng thái toàn cầu mơ hồ sẽ cung cấp tên hộp của bạn sau đó bạn có thể chạy:

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

scrant scp ~ / foobar "tên trong trường hợp của tôi mặc định": / home / "user" /


1
Điều này làm việc cho tôi. Chỉnh sửa cũng hữu ích, tôi cũng sẽ bao gồm lệnh để cài đặt plugin scp vagrant.
WhyAyala

1

Hãy thử cái này

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

1

Một cách khác để làm điều này mà không cần cài đặt bất cứ thứ gì ( vagrant-scpv.v.) Lưu ý rằng tên defaultcần phải được sử dụng, vì nó vagrant ssh-configphát ra điều đó.

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

Hàm này sẽ không cần thiết nếu scp -F =(vagrant ssh-config) ...có thể hoạt động trên các shell. Nhưng vì điều này không được Bash hỗ trợ, chúng tôi phải dùng đến cách giải quyết này.


1

Nếu ai đó muốn chuyển tập tin từ máy chủ windows sang vagrant, thì giải pháp này hiệu quả với tôi.

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.

Bạn sẽ có thể nhìn thấy các thư mục trong máy vagrant của bạn.


-3

Cách tốt nhất để sao chép tệp từ cục bộ sang vagrant, Không cần phải viết bất kỳ mã hoặc bất kỳ điều gì hoặc bất kỳ thay đổi cấu hình. 1- Đầu tiên là vagrant ( vagrant up ) 2- open cygwin 3- cygwin: đi đến thư mục của bạn, nơi vagrantfile hoặc từ nơi bạn khởi chạy vagrant 4- ssh vagrant 5- bây giờ nó sẽ hoạt động như một hệ thống bình thường.


Một vấn đề tôi đã phát hiện ra với cách tiếp cận này: nếu vagrant cần định cấu hình Bổ sung khách của bạn, thư mục / vagrant có thể không thực sự được gắn khi nhà cung cấp tệp chạy.
Mạng Torenware 15/03/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.