scp von einem Remote-Server zu einem anderen Remote-Server

15

Ich habe eine große Datei auf dem Server oneund ich möchte es Server kopieren twoverwenden scp. Ich habe die Schlüssel richtig eingerichtet und kann von meinem Desktop aus ssh / scp auf beide Server übertragen.

Die zu kopierende Datei ist größer als der freie Speicherplatz auf der Festplatte meiner Workstation. Deshalb wollte ich Folgendes tun:

scp one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz

aber ich habe:

ssh: Could not resolve hostname one: Name or service not known

Wir haben hier kein DNS (fragen Sie mich nicht warum), also habe ich dies in meiner ~ / .ssh / config:

Host one
    Hostname        <IP address of server one>
    User            jspurny

Host two
    Hostname        <IP address of server two>
    User            jspurny

Wenn ich es mit einer kleineren Datei versuche und sie von onemeiner Workstation auf die Workstation übertrage two, funktioniert es einwandfrei:

scp one:/opt/smallerfile.tar.gz .
scp smallerfile.tar.gz two:/opt/

Bei der Verwendung von IP-Adressen direkt, wie im Kommentar vorgeschlagen, habe ich Folgendes erhalten:

$ scp jspurny@<one's IP>:bigfile.tar.gz jspurny@<two's ip>:bigfile.tar.gz
Host key verification failed.
lost connection

Kein Problem:

Die Größe ist hier kein Problem - es war nur ein "Auslöser" für dieses Problem, da es keine Möglichkeit gab, bigfile.tar.gzauf meiner Workstation zu speichern . Das Problem tritt unabhängig von der Dateigröße auf.

Frage:

Warum macht der Befehl:

scp oneremote:file secondremote:file

wirft ein Fehler, egal ob mit .ssh/configAliasen oder direkt mit IP-Adressen?

Gelöst - irgendwie - immer noch auf der Suche nach Erklärungen - habe ich die große Datei in kleinere Dateien aufgeteilt und sie einzeln über meine Workstation übertragen. Ich frage mich immer noch, warum es nicht funktioniert hat. Deshalb würde ich mich immer noch über eine Erklärung freuen, was falsch war.

Fand einen Grund, warum es fehlschlägt: Es scheint, ich war dumm. Ich dachte, dass der Befehl

scp one:file two:file

stellte zwei Verbindungen zu jedem Server her und empfing dann Daten von einem und sendete sie sofort an zwei und wirkte so wie ein Relais.

Dies ist eindeutig nicht der Fall, da eine einfache -vOption offenbarte, dass sie tatsächlich nur eine Verbindung zu einer herstellt und von einer versucht, eine Verbindung zu zwei herzustellen . Was natürlich nicht möglich ist, weil Server eins keine Verbindung zu zwei herstellen soll .

Jan Spurny
quelle
Haben Sie versucht, einfach Ihren scp-Befehl so zu ändern, dass stattdessen die IP-Adressen verwendet werden, z. B. "scp jspurny @ ip_address_server_one: /opt/bigfile.tar.gz"?
@tchester: Ich habe es jetzt getan, aber es gibt nur einen anderen Fehler (siehe bearbeitete Frage)
Jan Spurny
@slm nein ich habe keine probleme mit der größe.
Jan Spurny
Da ich die Erklärung der Fehler gefunden habe, wollte ich sie als meine eigene Antwort hinzufügen / akzeptieren, aber es scheint mir ein bisschen unfair, da es das Problem tatsächlich nicht löst. Meinen Sie, ich sollte die Frage umformulieren in: Wie kopiere ich eine Datei von Server eins auf Server zwei, wobei ich meine Workstation als Relais verwende? oder sollte ich meine Erklärung hinzufügen, dass ich die Option --verbose nicht als Antwort verwenden kann, und sie akzeptieren?
Jan Spurny

Antworten:

6

Einfaches Rohr

Versuche dies:

ssh one 'cat file' | ssh two 'cat > file'

Der erste sollte den Dateiinhalt an Ihren Computer senden, während der zweite den Inhalt an den zweiten Computer senden sollte. Ich würde an beiden Enden nach der Übertragung eine Prüfsumme berechnen, um sicherzustellen, dass auf dem Weg nichts verloren ging oder verstümmelte.

Durchdachte Tunnel

Für komplexere Anwendungen können Sie SSH-Tunnel verwenden. Sie könnten beispielsweise Folgendes versuchen:

ssh -R 5001:127.0.0.1:5002 one
ssh -L 5002:127.0.0.1:22 two

Dann können Sie eine Verbindung öffnen auf onezu Maschine localhostPort 5001und es wird zweimal weitergeleitet und als Verbindung am Ende twozu localhostPort 22. Dies ist der ssh-Port, sodass Sie diesen für einen weiteren scp oder für rsync oder was auch immer verwenden können. Sie können auch einen rsyncServer auf twoPort 873 anstelle von 22 starten und weiterleiten. Oder Sie können ncauf beiden Seiten Rohdaten über eine beliebige Portnummer übertragen.

Der Hauptvorteil des obigen Ansatzes besteht darin, dass Sie eine bidirektionale TCP-Verbindung zwischen den beiden Maschinen haben, anstatt nur eine einseitige Pipe. Auf diese Weise können die beiden Parteien Informationen austauschen, was in diesem rsyncFall besonders wichtig ist.

MvG
quelle
1
Vielen Dank! Das macht nicht genau das, was ich wollte , aber was ich eigentlich brauchte , das ist toll.
Jan Spurny
16

Der volle Kredit für diese Antwort geht an /superuser//a/602436/142948

Sie benötigen die -3Option für scp:

scp -3 one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz

-3: Kopien zwischen zwei Remote-Hosts werden über den lokalen Host übertragen. Ohne diese Option werden die Daten direkt zwischen den beiden Remote-Hosts kopiert.

http://www.openbsd.org/cgi-bin/man.cgi?query=scp&sektion=1

Andernfalls wird der 2. Alias ​​"zwei" auf Host "eins" aufgelöst , der möglicherweise nicht vorhanden ist.

Kunstvollroboter
quelle
Leider scheint diese Option noch relativ neu und auf alle Distributionen übertragbar zu sein.
Whereswalden
2

Da Sie den Benutzerzugriff auf dem Quellserver (eins) , warum nicht einloggen und führen Sie Ihre scp Befehl auf dem Server direkt haben ... Wenn Sie befürchten , dass es zu lange dauern wird, dann den Befehl starten innerhalb einer screendann vom Bildschirm lösen mit Ctrl+a dund lass es laufen

Wenn Sie dies jedoch von Ihrer Workstation aus tun müssen und die SSH-Schlüssel vom Quell- zum Zielserver einwandfrei funktionieren, senden Sie den scpBefehl als Parameter eines sshBefehls wie folgt:

ssh user@source 'scp /path/to/file user@destination:/path/to/file'
Marios Zindilis
quelle
Danke, das würde auf jeden Fall funktionieren, außer dass auf diesen Servern PasswordAuthentication deaktiviert ist und ich keine Schlüssel von einem zum anderen hinzufügen kann - sie sollten keine Verbindung miteinander herstellen können.
Jan Spurny
0

Nach der Fehlermeldung suchen: "Überprüfung des Hostschlüssels fehlgeschlagen." scheint das einfachste zu sein, was man hier machen kann. Ich fand diese Frage & Antwort auf askubuntu mit dem Titel: SSH-Verbindungsproblem mit dem Fehler "Host-Schlüsselüberprüfung fehlgeschlagen ..." .

Eine der Antworten auf diese Fragen und Antworten deutete darauf hin, dass das Problem mit einem widersprüchlichen Eintrag in Ihrer ~/.ssh/known_hostsDatei zusammenhängt. Sie können die problematischen Einträge entweder mit einem beliebigen Texteditor aus dieser Datei löschen oder mit dem folgenden Befehl Einträge entfernen:

$ ssh-keygen -R hostname

Wo hostnameist entweder die IP-Adresse oder der Name des Servers, von dem aus Sie eine Verbindung herstellen möchten? Das alles wäre übrigens auf Host Two .

slm
quelle
Ich bin mir nicht sicher, ob ich das verstehe. Ich kann ssh oneund twovon meinem Arbeitsplatz ohne Probleme Server .. Das Problem beginnt , wenn ich laufe scp one:file two:filevon der Workstation. Und es gibt known_hostsweder eine noch zwei Dateien . Ich habe gerade versucht, zwei Schlüssel auf meiner Workstation zu entfernen (sogar einen , um sicherzugehen), aber nichts hat sich geändert (außer, dass Sie sicher sind, dass Sie sich sicher sind).
Jan Spurny
@JanSpurny - Ihr Verweis auf Ihre Workstation war in dieser Frage zumindest für mich etwas verwirrend. Wenn Sie sagen, dass Sie Ihren Laptop / Desktop meinen. Also machst du so etwas, wenn du sagst, dass es "funktioniert": scp workstation:file one:fileund workstation:file two:file? Offensichtlich müssen Sie nicht "workstation: file" sagen. Ich sage es nur explizit, um die Konversation zu führen.
SLM
Nun, ich erwähne, dass ich alle Befehle von meiner Workstation ausgeführt habe. Also war es eher so: workstation$ scp one:file fileund workstation$ scp file two:file. Wie auch immer, ich denke, ich habe es gelöst. Ich werde es als meine eigene Antwort hinzufügen.
Jan Spurny
@ JanSpurny - OK, ich bin froh, dass du es herausgefunden hast. Danke für die Frage übrigens!
slm