Der einfachste Weg, eine einzelne Datei vom Host zum Vagrant-Gast zu kopieren?


241

Ich habe einen Anwendungsfall, in dem ich gelegentlich eine einzelne Datei von meinem Host-Computer auf den Vagrant-Gast kopieren möchte.

Ich möchte dies nicht über traditionelle Provisioner (Puppet / Chef) tun, da dies oft einmalig ist - ich möchte nur etwas schnelles zu meinem Vagrantfile hinzufügen.

Ich möchte nicht ein ganzes Verzeichnis freigeben, möglicherweise weil ich eine vorhandene Datei überschreiben möchte, ohne ein ganzes Verzeichnis auf dem Gast zu löschen.

Es scheint auch ein bisschen übertrieben zu sein, ein Shell-Bereitstellungsskript zu schreiben und sich mit potenziellem Escape zu befassen, wenn ich nur eine Datei kopieren möchte.

Was ist der einfachste Weg, um eine einzelne Datei vom Host zum Gast zu kopieren?


Beachten Sie, dass die akzeptierte Antwort auf Vagrant 1.x basiert. Die Verwendung eines Datei-Provisioners ist der Standardansatz von Vagrant 2 , obwohl das Ändern des /vagrant hier erwähnten Einhängepunkts auch eine gute Option sein kann
STW

3
Die Antwort von @jouell verdient wirklich mehr Stimmen für den einfachen Anwendungsfall einer einmaligen Kopie einer einzelnen Datei: vagrant upload /path/to/my/file...
Datum

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

Antworten:


107

Anstatt einen Shell-Provisioner zum Kopieren der Datei zu verwenden, können Sie auch einen Vagrant- File-Provisioner verwenden .

Name des Anbieters: "file"

Mit dem File Provisioner können Sie eine Datei vom Host-Computer auf den Gast-Computer hochladen.

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

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

3
Dies ist definitiv der beste Weg, dies in Vagrant 2 zu tun! Allerdings war Vagrant 2 zu dem Zeitpunkt, als ich dies tun musste, nicht verfügbar ... :)
LeeXGreen

4
Diese Lösung klingt gut, aber ich kann aufgrund von Berechtigungsfehlern keine Datei kopieren.
Orbatschow

@orbatschow Ich hatte das gleiche Problem, aber nicht, wenn ich es kopiert habe/tmp
Ben

6
Das hat das OP nicht gefragt. Die Frage war, wie man gelegentlich Dateien überträgt. Provisioning ausführen zu müssen ist übertrieben.
Axd

253

Da Sie nach dem einfachsten Weg fragen, schlage ich vor, vagrant-scp zu verwenden . Es fügt vagrant einen scp-Befehl hinzu, sodass Sie Dateien auf Ihre VM kopieren können, wie Sie es normalerweise mit scp tun würden.

Installation über:

vagrant plugin install vagrant-scp

Verwenden Sie es so:

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

1
Das hat bei mir nicht funktioniert. Ich habe das Plugin installiert, aber immer wieder die Fehlermeldung "Das Plugin" vagrant-scp "wurde nicht gefunden. Bitte stellen Sie sicher, dass es ordnungsgemäß über installiert wurde vagrant plugin."
Rockerston

6
Hallo Rod, vagrant-scp funktioniert mit Vagrant 1.7+. Von dem Fehler, den Sie geöffnet haben, führen Sie 1.4.3 aus. Wenn Sie dieses Plugin benötigen, müssen Sie leider ein Upgrade durchführen (was schnell und schmerzlos ist).
Luca Invernizzi

1
Ich habe diesen Befehl versucht, um Dateien zu kopieren, aber es hat nicht funktioniert und vagrant scp /vagrant/www/koushik.php ubuntu/trusty64:/usr/share/nginx/htmlich habe versucht, Dateien in das Nginx-Stammverzeichnis zu kopieren. Es heißt: The machine with the name 'C' was not found configured for this Vagrant environment. Das Verzeichnis und alles ist in Ordnung.
Koushik Das

3
Eine Sache, die Sie hinzufügen sollten: Sie müssen die ID des Computers verwenden, die Sie mit dem vagabundierenden globalen Status in der ersten Spalte erhalten können. Trotzdem ist dies imho die beste Lösung.
min hundje

1
@KoushikDas Funktioniert unter Windows nicht sofort. Sie müssen das Ubuntu-Subsystem unter Windows 10 aktivieren und dann anstelle von C: / .. für den Pfad zur Datei / mnt / c / ... eingeben. Und funktioniert Hurra! Beachten Sie auch den anderen Kommentar. Verwenden Sie den globalen Vagabundstatus, um die ID der Vagabundmaschine abzurufen.
Andrew

141

Es gibt tatsächlich eine viel einfachere Lösung. Siehe https://gist.github.com/colindean/5213685/#comment-882885 :

"Bitte beachten Sie, dass der einfachste Weg, Dateien vom Host auf die VM zu übertragen, darin besteht, Dateien einfach im selben Verzeichnis wie die Vagrant-Datei abzulegen, sofern Sie nicht aus irgendeinem Grund ausdrücklich scp möchten. Dieses Verzeichnis wird also automatisch unter / vagrant in der VM bereitgestellt Sie können sie direkt von der VM kopieren oder verwenden. "


3
Genau das macht meine Antwort ... es wird ein Shell-Provisioner ausgeführt, um die Datei aus / vagrant / zu kopieren.
LeeXGreen

2
Es ist besser, Vagrant Provisioning zu verwenden, wie es LeexGreen verwendet hat.
Tokhi

4
Stellen Sie sicher, dass config.vm.synced_folder ".", "/vagrant", disabled: falseund dannvagrant reload
Christopher Markieta

Dies funktioniert nicht auf der centos/7Vagabundbox, wenn versucht wird, den umgekehrten Vorgang auszuführen (Vagabundbox auf lokaler Maschine).
Ryan Tuck

Dies funktioniert perfekt für mich, wenn ich eine Datei von meiner vagabundierenden Ubuntu 14-VM auf meinen Host kopiere. Vielen Dank!!
XtraSimplicity

98

Standardmäßig verwendet die erste vagabundierende Instanz den SSH-Port als 2222 und die IP-Adresse lautet 127.0.0.1 (Möglicherweise müssen Sie den Port mit dem realen virtuellen Host anpassen.)

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

Sie können also den folgenden Befehl ausführen, um Ihre lokale Datei in eine vagabundierende Instanz zu kopieren. Passwort ist das gleiche wie Benutzername vagrant.

scp -P 2222 your_file vagrant@127.0.0.1:.

Sie können die Datei auch auf Ihren lokalen Host zurückkopieren.

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

3
Ich musste dies tun und die strikte Schlüsselüberprüfung deaktivieren:scp -P 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no my-file.txt matt@127.0.0.1:/tmp
Matt

Ich werde empfehlen, diese ssh-Optionen ~/.ssh/configals Standard hinzuzufügen , was ich in meiner Umgebung getan habe:StrictHostKeyChecking no
BMW

1
+1 + Wenn man mehr als eine virtuelle Maschine hat, sollte der Wert des Ports von der Benutzeroberfläche des Oracle VM VirtualBox Managers übernommen werden - wählen Sie links vm, Einstellungen, Netzwerk, Portweiterleitung
Yordan Georgiev

1
Dies ist besser als die akzeptierte Antwort. Das Verzeichnis / vagrant ist nicht immer vorhanden.
Jimmy101

Überraschend, wie viel schwieriger es ist, rsyncin diesem Fall zur Arbeit zu kommen , verglichen mit scpder Beschreibung von rsync als "schnellerer, flexibler Ersatz für rcp".
Wildcard

56

Hier ist meine Herangehensweise an das Problem:

Schritt 1 - Finden Sie den privaten Schlüssel, den SSH-Port und die 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

Schritt 2 - Übertragen Sie die Datei mit dem Port und dem privaten Schlüssel als Parameter für scp:

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

Ich hoffe, es hilft,


4
Dies ist der einfachste Weg. Danke dir.
Elmonkeylp

2
Mit dem Schlüssel konnte ich die Datei übertragen. Die höhere Antwort ohne diese Informationen hat nicht funktioniert, also danke!
Inostia

1
Einfache und vollständige Lösung.
Tao Starbow

27

Am Ende habe ich die Datei in meinem Vagrant-Verzeichnis (automatisch als / vagrant / bereitgestellt) aufbewahrt und mit einem Shell-Provisioner kopiert:

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

4
Ich würde empfehlen, coreutils zu verwenden, installz install -D -m644 -C .... B. src dest. Anstelle von cp, da Sie beispielsweise die Berechtigungen und den Besitz angeben, automatisch führende Verzeichnisse erstellen, die Kopie nur ausführen können, wenn die Datei aktualisiert werden muss, usw. ... anstelle von cp, was einfach und in Ordnung ist, wenn Sie das alles sind tun müssen.
Xenoterracide

@ LeeXGreen. Ich versuche das Gleiche zu tun, was Sie versucht haben, aber ich verstehe Ihre Antwort nicht ganz. Haben Sie diese Codezeile in das Terminal eingegeben? Wo genau hast du das platziert?
Dan Rubio

Das Code-Snippet aus meiner Antwort geht Vagrantfileneben Ihren anderen Provisionern in Ihre . Sie müssen ersetzen path_within_repound remote_filedurch Dinge, die für Ihre Anwendung natürlich Sinn machen :)
LeeXGreen

Funktioniert, aber ich erhalte den Fehler "default: stdin: is not tty"
radtek


20

Wenn Sie die Dateien nicht in Ihrem Verzeichnis haben, können Sie diesen Code in einer Skriptdatei auf dem Host-Computer ausführen.

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

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

In diesem Setup müssen Sie nur /File/To/Copyzu der Datei oder den Dateien wechseln , die Sie kopieren möchten. Dies /Where/To/Put/Fileist der Speicherort auf der VM, auf den die Dateien kopiert werden sollen.

Wenn Sie diese Datei erstellen und aufrufen, können copyToServer.shSie den shBefehl ausführen , um diese Dateien zu übertragen.

sh ./copyToServer.sh

Abschließend können Sie diesen Code nicht als ausführen, provisionerda dieser auf dem Gastserver ausgeführt wird, während dieser Code vom Host ausgeführt wird.


1
Dies ist wahrscheinlich die beste Lösung außerhalb der Installation des Vagrant-SCP-Plugins. Es verwendet die von Vagrant verwendete SSH-Konfiguration, um die verschiedenen Netzwerkeinstellungen von verschiedenen Anbietern verarbeiten zu können.
Sandy Chapman

1
Nett! Ich schlage vor, Sie beachten auch, dass die vagrant ssh-configBenutzer die Ausgabe einfach in ihre ~ / .ssh / config-Datei einfügen können, um dies in Zukunft noch einfacher zu machen. Dh dies mit der Antwort von
chf

2
Ich habe festgestellt, dass es notwendig ist, die erste Zeile der ssh-config-Ausgabe zu überspringen, um den Fehler "Host-Direktive wird nicht als Befehlszeilenoption unterstützt" zu vermeiden - verursacht durch den Header für den Abschnitt ssh-config: "Host default". Daher muss mein Skript OPTIONS=`vagrant ssh-config | tail -n +2 | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`die Verwendung dieser ersten Zeile der ssh-config-Ausgabe weglassen.
Troy Follower

1
Um den Fehler "Host-Direktive nicht unterstützt" zu entfernen, können Sie ihn alternativOPTIONS=`vagrant ssh-config | grep -v '^Host ' | awk -v ORS=' ' 'NF{print "-o " $1 "=" $2}'` wie hier dokumentiert verwenden: gist.github.com/geedew/11289350
user783836

10

Vagrant bietet eine Möglichkeit, einen Befehl über ssh auszuführen, anstatt sich anzumelden. Für Linux-Host und -Gast können Sie also Folgendes verwenden:

  • vom Gastgeber zum Gast:

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

  • von Gast zu Gastgeber:

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

Keine Notwendigkeit für Plugins oder Gast-Reloads. Stellen Sie einfach sicher, dass Sie 'vagrant ssh' eine Vagrant-Box-ID geben, wenn Sie sich nicht im selben Verzeichnis wie die Vagrant-Datei befinden. Getestet auf Vagrant v1.8.1.


Vom Gast zum Host-Ansatz werden keine speziellen Symbole in Dateien
beibehalten

9

Sie können einen Eintrag hinzufügen in ~/.ssh/config:

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

und das einfache scp file vagrant:/path/. Mit dem vagrant ssh-configBefehl können Sie den Pfad zur Identitätsdatei finden .


1
Sehr hilfreich und hilft zu klären, was los ist. Auf diese Weise können Sie beide Richtungen kopieren, rekursive Kopien
erstellen

1
Ich habe gerade die obigen Antworten noch einmal gelesen und festgestellt, dass ich mit der Antwort von geedew gespielt habe, vagrant ssh-configdie Ihnen eine noch vollständigere und bequemere Konfiguration bietet, die Sie in Ihre ~ / .ssh / config einfügen können. Aber nochmals vielen Dank!
Nealmcb

7

Gehen Sie zu dem Verzeichnis, in dem Sie Ihr Vagrantfile
Dann haben, bearbeiten Sie Ihr Vagrantfileund fügen Sie Folgendes hinzu:

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

"." bedeutet, dass sich das Verzeichnis, in dem Sie sich derzeit auf Ihrem Host-Computer befinden,
"/ vagrant" auf "/ home / vagrant" auf dem Gastcomputer (Vagrant-Computer) bezieht .

Kopieren Sie die Dateien , die Sie brauchen , um Gastcomputer in den Ordner zu senden , wo Sie Ihre haben Vagrantfile dann geöffnet Git Bash und cdin das Verzeichnis , in dem Sie Ihre haben Vagrantfileund Typ:

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

Dabei ist XXXXXXX Ihr VM-Name . Sie können Ihren VM-Namen erhalten, indem Sie ausführen

vagrant global-status

7

wenn Sie aus bestimmten Gründen keine Berechtigung zur Verwendung haben

vagrant plugin install vagrant-scp

Es gibt einen alternativen Weg:

Zuerst vagrantiere deinVagrantProject , dann schreibe in das Terminal:

vagrant ssh-config

Sie erhalten Informationen zu "Hostname" und "Port" Ihrer virtuellen Maschine.

In einigen Fällen könnten einige virtuelle Maschinen in Ihrem Projekt vorhanden sein. Suchen Sie also einfach Ihren Master-Computer (im Allgemeinen hat diese VM den Port 2222) und achten Sie nicht auf die Informationen anderer Computer.

Schreiben Sie den Befehl zum Erstellen der Kopie:

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

An dieser Stelle müssen Sie ein Vagabund-Passwort eingeben: Standardmäßig ist es "Vagabund".

danach, wenn Sie sich Dateien in Ihrer virtuellen Maschine ansehen:

vagrant ssh xxVirtualMachineNamexx
pwd
ls

Sie haben die "file.txt" in Ihrem Verzeichnis der virtuellen Maschine


Nachdem ich ein vagabundierendes Passwort
eingegeben

2
Dies lag jedoch an den Berechtigungen für das Zielverzeichnis. Ich habe nach / home / vagrant kopiert und das hat funktioniert.
user2568374

4

Das Vagrant SCP Plugin funktioniert, wenn Sie den Namen Ihrer Vagrant Box kennen. Überprüfen Sie den globalen Vagabundstatus, der Ihren Boxnamen angibt, und führen Sie dann Folgendes aus:

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

vagrant scp ~ / foobar "Name in meinem Fall Standard": / home / "Benutzer" /


1
das hat bei mir funktioniert. Die Bearbeitung ist auch hilfreich, ich würde auch den Befehl zum Installieren des vagrant scp Plugins enthalten.
WhyAyala

1

Versuchen Sie dies .. vagrant ubuntu 14.04 Das hat bei mir funktioniert.

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

1

Eine alternative Möglichkeit, dies zu tun, ohne etwas zu installieren ( vagrant-scpusw.) Beachten Sie, dass der Name defaultunverändert verwendet werden muss, da dies vagrant ssh-configausgegeben wird.

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

Die Funktion wäre nicht notwendig, wenn scp -F =(vagrant ssh-config) ...sie über Shells hinweg funktioniert hätte . Da dies jedoch von Bash nicht unterstützt wird, müssen wir auf diese Problemumgehung zurückgreifen.


1

Wenn jemand Dateien vom Windows-Host auf Vagrant übertragen möchte, hat diese Lösung für mich funktioniert.

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.

Sie sollten in der Lage sein, Verzeichnisse in Ihrer Vagabundmaschine zu sehen.


-3

Der beste Weg, um eine Datei von lokal nach vagrant zu kopieren. Sie müssen keinen Code oder etwas schreiben oder Konfigurationsänderungen vornehmen. 1- Zuerst den Vagabund hoch ( Vagabund hoch ) 2- Cygwin öffnen 3- Cygwin: Gehen Sie zu Ihrem Ordner, in dem sich die Vagabunddatei befindet, oder von wo aus Sie den Vagabund 4- ssh-Vagabund starten. 5- Jetzt funktioniert es wie ein normales System.


Ein Problem, das ich bei diesem Ansatz entdeckt habe: Wenn Vagrant Ihre Guest Additions konfigurieren muss, wird das Verzeichnis / vagrant möglicherweise nicht tatsächlich bereitgestellt, wenn der Datei-Provisioner ausgeführt wird.
Torenware Networks
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.