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


241

ホストマシンからVagrantゲストに1つのファイルをコピーしたい場合があります。

これは1回限りの場合が多いため、従来のプロビジョナー(Puppet / Chef)を使用したくないのですが、Vagrantfileにすばやく追加したいだけです。

ゲスト全体のディレクトリ全体をnukedせずに既存のファイルを上書きしたいので、ディレクトリ全体を共有したくありません。

また、シェルプロビジョニングスクリプトを作成して、潜在的なエスケープに対処するのは、ファイルをコピーするだけの場合は少しやり過ぎに思えます。

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


受け入れ答えがベイグラント1.x--に基づいていることに注目すべきファイルプロビジョニングを使用して、標準的なベイグラント2のアプローチで、変更がのマウントポイント/vagrant 、ここで述べたようにも良いオプションすることができ
STW

3
@jouellからの回答は、単一のファイルの1回限りのコピーの単純な使用例に対してより多くの投票に値します:vagrant upload /path/to/my/file...
dat

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

回答:


107

シェルプロビジョナーを使用してファイルをコピーする代わりに、Vagrant ファイルプロビジョナーを使用することもできます

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

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

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

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

3
これは間違いなくVagrant 2でこれを行うための最良の方法です!ただし、Vagrant 2は、私がこれを行う必要があった時点では利用できませんでした... :)
LeeXGreen '26 / 07/26

4
このソリューションは良さそうに聞こえますが、権限エラーのためにファイルをコピーできません。
orbatschow 2016

@orbatschow同じ問題がありましたが、コピーした場合は問題ありません/tmp
Ben

6
これはOPが要求したものではありません。問題は、時々ファイルを転送する方法でした。プロビジョニングを実行する必要があるのはやり過ぎです。
axd

253

最も簡単な方法を求めているので、vagrant-scpを使用することをお勧めします。scapコマンドをvagrantに追加するので、scpで通常行うように、ファイルをVMにコピーできます。

インストール方法:

vagrant plugin install vagrant-scp

次のように使用します。

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

1
これは私にはうまくいきませんでした。私は、プラグインをインストールしたのですが、「プラグイン『浮浪者-SCPが言ったエラー取得保管』が見つかりませんでした。それは正しく経由でインストールされていることを確認してくださいをvagrant plugin。」
ロッカーストン

6
こんにちはロッド、vagrant-scpはVagrant 1.7以降で動作します。開いたバグから、1.4.3を実行しています。このプラグインが必要な場合は、アップグレードする必要があります(迅速で簡単です)。
Luca Invernizzi

1
ファイルをコピーするためにこのコマンドを試してみましたが、機能せずvagrant scp /vagrant/www/koushik.php ubuntu/trusty64:/usr/share/nginx/html、nginxルートディレクトリにファイルをコピーしようとしてエラーが発生しました。それは言う、The machine with the name 'C' was not found configured for this Vagrant environment. ディレクトリとすべてが大丈夫です。
Koushik Das 2016

3
追加することの1つ:最初の列のvagrant global-statusで取得できるマシンのIDを使用する必要があります。それにもかかわらず、これは私にとって最高のソリューションです。
min hundje 2017年

1
@KoushikDas Windowsのボックスでは機能しません。Windows 10でUbuntuサブシステムを有効にする必要があります。次に、ファイルへのパスにC:/ ..を指定する代わりに、/ mnt / c / ...を指定します。他のコメントにも注意してください。vagrantglobal-statusを使用してvagrantマシンのIDを取得します。
Andrew

141

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

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


3
これがまさに私の答えです...シェルプロビジョニングツールを実行して、/ vagrant /からファイルをコピーします。
LeeXGreen 2014

2
LeexGreenが使用しているように、Vagrantプロビジョニングを使用することをお勧めします。
tokhi 2014年

4
ことを確認config.vm.synced_folder ".", "/vagrant", disabled: falseしてからvagrant reload
クリストファーMarkieta

これは、逆の操作(ローカルマシンへのバガントボックス)を実行しようとする場合、バガントボックスで機能しませcentos/7
Ryan Tuck

これは、Ubuntu 14 vagrant VMからホストにファイルをコピーするときに完全に機能します。ありがとう!!
XtraSimplicity 2017年

98

デフォルトでは、最初のvagrantインスタンスは2222としてsshポートを使用し、その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 .

3
私はこれをしなければならなかったし、無効に厳格なキーのチェック:scp -P 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no my-file.txt matt@127.0.0.1:/tmp
マット

私はこれらのsshオプションを~/.ssh/configデフォルトとしてに追加することをお勧めします。これは私の環境で行いました:StrictHostKeyChecking no
BMW

1
+1 +複数の仮想マシンがある場合、ポートの値はOracle VM VirtualBox ManagerのUIから取得する必要があります-左側でvmを選択し、設定、ネットワーク、ポート転送
Yordan Georgiev

1
これは受け入れられた答えよりも優れています。/ vagrantディレクトリは常に存在するわけではありません。
jimm101

rsyncの説明が「rcpのより高速で柔軟な置き換え」であるrsyncとするとscp、この場合に比べて、この場合の作業がどれほど難しいかは驚くべきことです。
ワイルドカード2017

56

これが私の問題へのアプローチです:

手順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:~

それが役に立てば幸い


4
これが最も簡単な方法です。ありがとうございました。
elmonkeylp 2015年

2
キーを使用して、ファイルを転送することができました。この情報なしのより高い回答は機能しなかったので、ありがとうございます!
イノスティア

1
簡単で完全なソリューション。
Tao Starbow

27

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

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

4
coreutils、installたとえばinstall -D -m644 -C ...src destの使用をお勧めします。cpの代わりに、アクセス許可、所有権の指定、先頭のディレクトリの自動作成、ファイルの更新が必要な場合にのみコピーを行うなどの操作を実行できるため、cpの代わりに、単純で問題ありません。する必要があります。
xenoterracide 2014年

@LeeXGreen。私はあなたがやろうとしていたことと同じことをやろうとしていますが、あなたの答えはまったくわかりません。端末にそのコード行を入力しましたか?どこに配置したのですか?
Dan Rubio 2014

私の回答のコードスニペットは、Vagrantfile他のプロビジョニング担当者と一緒にあなたの中に行きます。あなたは交換する必要がありますpath_within_repoし、remote_file:)もちろん、あなたのアプリケーションのために、意味をなすものをと
LeeXGreen

動作しますが、「デフォルト:stdin:はttyではありません」というエラーが表示されます
radtek


20

ディレクトリにファイルを配置できない場合は、ホストマシンからスクリプトファイルでこのコードを実行できます。

#!/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に、このコードはホストから実行されますが、ゲストサーバーで実行されるため、このコードをとして実行することはできません。


1
これは、vagrant-scpプラグインをインストールする以外のおそらく最善の解決策です。Vagrantが使用するSSH構成を使用するため、さまざまなプロバイダーによって提供されるさまざまなネットワーク設定を処理できます。
Sandy Chapman

1
いいね!また、人々がの出力を取得vagrant ssh-configして〜/ .ssh / configファイルに貼り付けるだけで、これを将来さらに簡単にすることができることにも注意してください。
つまり

2
「ホストディレクティブはコマンドラインオプションとしてサポートされていません」というエラーを回避するには、ssh-configセクションのヘッダー「ホストのデフォルト」が原因で、ssh-config出力の最初の行をスキップする必要があることがわかりました。したがって、私のスクリプトではOPTIONS=`vagrant ssh-config | tail -n +2 | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`、ssh-config出力の最初の行の使用を省略しなければなりません。
troyfolger 2016

1
または、「ホストディレクティブはサポートされていません」エラーを削除するには、OPTIONS=`vagrant ssh-config | grep -v '^Host ' | awk -v ORS=' ' 'NF{print "-o " $1 "=" $2}'`ここに記載されているように使用できます:gist.github.com/geedew/11289350
user783836

10

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 box IDを「vagrant ssh」に指定してください。Vagrant v1.8.1でテスト済み。


ゲストからホストへのアプローチは、ファイル内の特別なシンボルを保持しません
Dr.X

9

にエントリを追加できます~/.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-configコマンドを使用して、IDファイルへのパスを見つけることができます。


1
非常に役立ち、何が起こっているのかを明確にするのに役立ちます。これにより、双方向のコピー、再帰的なコピーなどが可能になり、scp / sshの既存の知識をうまく活用できます
nealmcb

1
上記の回答を読み直し、geedewの回答を再生することで発見しました。これによりvagrant ssh-config、〜/ .ssh / configに配置できる、より完全で便利な構成を省略できます。しかし、もう一度ありがとう!
nealmcb 2015

7

Vagrantfile
Then があるディレクトリに移動し、Thenを編集してVagrantfile以下を追加します。

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

「」ホストマシンの現在のディレクトリ
「/ vagrant」は、ゲストマシン(Vagrantマシン)の「/ home / vagrant」を意味します。

ゲストマシンに送信する必要があるファイルを、Git BashVagrantfile 開いているフォルダーにコピーし、次のように入力します。cdVagrantfile

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

ここで、XXXXXXXはVM名です。次のコマンドを実行すると、VM名を取得できます

vagrant global-status

7

何らかの理由で使用する権限がない場合

vagrant plugin install vagrant-scp

別の方法があります:

最初にyourVagrantProjectをvagrantし、次にターミナルに書き込みます。

vagrant ssh-config

仮想マシンの「ホスト名」と「ポート」に関する情報が表示されます。

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

コピーを作成するコマンドを記述します。

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

この急勾配では、迷惑なパスワードを入力する必要があります:デフォルトでは「迷惑」です

その後、仮想マシンのファイルを確認すると、次のようになります。

vagrant ssh xxVirtualMachineNamexx
pwd
ls

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


迷惑なパスワードを入力した後、「アクセスが拒否されました」という
メッセージが表示

2
しかし、これはターゲットディレクトリの権限によるものでした。/ home / vagrantにコピーしましたが、うまくいきました。
user2568374 2017年

4

vagrant scpプラグインは、vagrantボックス名がわかっている場合に機能します。ボックス名を提供するvagrant global-statusを確認すると、次のコマンドを実行できます。

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

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


1
これでうまくいきました。編集も役に立ちます。私はvagrant scpプラグインをインストールするコマンドも含めます。
WhyAyala 2017年

1

これを試してください.. vagrant ubuntu 14.04これは私にとってはうまくいきました。

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

1

何もインストールせずにこれを行う別の方法(vagrant-scpなど)は、名前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

誰かが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.

迷惑なマシンのディレクトリを見ることができるはずです。


-3

ローカルからvagrantにファイルをコピーするための最良の方法。コードや何か、設定の変更を記述する必要はありません。1-最初にvagrant(vagrant up)2- open cygwin 3- cygwin:vagrantfileがあるフォルダーに移動するか、vagrantを起動する場所に移動します4- ssh vagrant 5-これで通常のシステムのように動作します。


このアプローチで私が発見した1つの問題:vagrantがGuest Additionsを構成する必要がある場合、ファイルプロビジョナーの実行時に/ vagrantディレクトリが実際にマウントされないことがあります。
Torenware Networks 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.