web-dev-qa-db-ja.com

ホストからVagrantゲストに単一のファイルをコピーする最も簡単な方法は?

ホストマシンからVagrantゲストに単一のファイルをコピーしたいというユースケースがあります。

これは1回限りの作業であることが多いため、私は従来のプロビジョニングプログラム(Puppet/Chef)を介してそのようにしたくはありません。

ゲスト上のディレクトリ全体を無効にすることなく既存のファイルを上書きしたいため、ディレクトリ全体を共有したくないのです。

シェルプロビジョニングスクリプトを作成し、ファイルをコピーすることだけが必要な場合に潜在的なエスケープ処理を行うのはやややり過ぎです。

では、ホストからゲストに単一のファイルをコピーする最も簡単な方法は何ですか?

215
LeeXGreen

ファイルをコピーするためにシェルプロビジョニングツールを使用する代わりに、Vagrant ファイルプロビジョニングツール を使用することもできます。

プロビジョニング担当者名:"file"

ファイルプロビジョニングツールを使用すると、ホストマシンからゲストマシンにファイルをアップロードできます。

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

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

あなたが最も簡単な方法を尋ねるので、私は vagrant-scp を使うことを勧めます。 scpコマンドがvagrantに追加されているので、通常はscpで行うのと同じようにVMにファイルをコピーできます。

経由でインストールします。

vagrant plugin install vagrant-scp

そのようにそれを使ってください:

vagrant scp <some_local_file_or_dir> [vm_name]:<somewhere_on_the_vm>
223
Luca Invernizzi

実際にはもっと単純な解決策があります。 https://Gist.github.com/colindean/5213685/#comment-882885 を参照してください。

「何らかの理由でscpが特に必要な場合を除き、ファイルをホストからVMに転送する最も簡単な方法は、ファイルをVagrantfileと同じディレクトリに配置することです。このディレクトリは自動的に次のディレクトリにマウントされます。/[vagrantをVMに追加すると、VMから直接コピーまたは使用できます。 "

133
Eric P

デフォルトでは、最初のvagrantインスタンスはSSHポート2222を使用し、そのIPアドレスは127.0.0.1です(実際の仮想ホストでポートを調整する必要があるかもしれません)。

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

そのため、下記のコマンドを実行してローカルファイルをvagrantインスタンスにコピーすることができます。 passwordはvagrantであるusernameと同じです。

scp -P 2222 your_file [email protected]:.

ファイルをローカルホストにコピーして戻すこともできます。

scp -P 2222 [email protected]:/PATH/filename .
90
BMW

これが私の問題への取り組みです。

ステップ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]:~

それが役立つことを願っています、

51
alfredocambera

私がやってしまったのは私のvagrantディレクトリ(自動的に/ vagrant /としてマウントされている)の中にファイルを保存してシェルプロビジョニングツールでそれをコピーすることでした:

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

ファイルを自分のディレクトリに置くことが制限されている場合は、ホストマシンのスクリプトファイルでこのコードを実行できます。

#!/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はファイルをコピーしたいVM上の場所です。

このファイルを作成してcopyToServer.shと呼ぶと、shコマンドを実行してそれらのファイルをプッシュできます。

sh ./copyToServer.sh

最後の注意として、このコードをprovisionerとして実行することはできません。なぜなら、このコードはHostから実行されるのに対し、Guestサーバー上で実行されるからです。

18
geedew

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

プラグインやゲストのリロードは不要です。 Vagrantfileと同じディレクトリにいない場合は、必ずvagrantボックスIDを 'vagrant ssh'に指定してください。 Vagrant v1.8.1でテスト済み。

10
user7962684

~/.ssh/configにエントリを追加することができます。

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

そしてsimplescp file vagrant:/path/vagrant ssh-configコマンドを使用してIDファイルへのパスを見つけることができます。

9
chf
vagrant upload localfile

それはvagrantユーザーのホームディレクトリにlocalfileを置きます

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

8
jouell

何らかの理由であなたが使用許可を得ていない場合

vagrant plugin install vagrant-scp

別の方法があります。

まず yourVagrantProject をvagrantしてから、ターミナルに書き込みます。

vagrant ssh-config

仮想マシンの "HostName"と "Port"に関する情報があります。

場合によっては、プロジェクトにいくつかの仮想マシンを含めることができます。ですから、あなたのマスターマシンを見つけて(一般に、このVMにはポート2222があります)、他のマシンの情報には注意を払わないでください。

コピーするためのコマンドを書く:

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

この急勾配であなたはvagrantパスワードを入れなければならないでしょう:デフォルトでそれは "vagrant"です

その後、仮想マシンのファイルを見てください。

vagrant ssh xxVirtualMachineNamexx
pwd
ls

仮想マシンのディレクトリに "file.txt"があります。

6
slideWXY

Vagrantfileがあるディレクトリに移動します
次に、あなたのVagrantfileを編集して、以下を追加してください:

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

"."はあなたのホストマシン上の現在のディレクトリを意味します
"/ vagrant" は、ゲストマシン(Vagrantマシン)の "/ home/vagrant"を表します。

あなたがあなたのVagrantfileを持っているディレクトリにあなたのcdを持っているフォルダにゲストマシンに送る必要があるファイルをコピーしてくださいそしてそれから Git Bash そしてVagrantfileをタイプしてください:

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

xXXXXXXはあなたの vm名です。あなたは、実行することによってあなたのvm名を得ることができます

vagrant global-status
5
akshaynagpal

あなたのvagrantボックス名を知っていればvagrant scpプラグインは動作します。あなたのボックス名を提供するvagrant global-statusをチェックしてください。

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

vagrant scp〜/ foobar "私の場合のデフォルト":/ home/"user" /

4
Bálint Szigeti

誰かがWindowsホストからvagrantにファイルを転送したい場合は、この解決策は私のために働いた。

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.

あなたはあなたのvagrantマシンの中のディレクトリを見ることができるはずです。

1
Lufy

何もインストールせずにこれを行う別の方法(vagrant-scpなど)vagrant ssh-configはそれを生成するので、defaultという名前をそのまま使用する必要があることに注意してください。

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
Gurjeet Singh

これを試してみてください。vagrant ubuntu 14.04これは私のために働いた。

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

これは良い答えをここで強化することができます

1)はいvagrant-scpをインストール

 vagrant plugin install vagrant-scp

2)[vm_name]はオプションです

vagrant scp thisFileExamle.txt :/this/dirVagrant/dir/

3)dirの場合は-rは不要

vagrant scp thisDir :/this/dirVagrant/dir/

4)それはVagrantからファイルをダウンロードするための他の方法を働きます

vagrant scp :/somefile.txt  thisLocalDir 
0
mebada