scp zwischen zwei Remote-Hosts von meinem (dritten) PC


136

Ich habe zwei Remote-Hosts.
host1-> 10.3.0.1
host2-> 10.3.0.2
Beide führen einen SSH-Server aus.

Der SSH-Server überwacht Port 22 in Host1 und Port 6969 in Host2. Jetzt muss ich auf meinem lokalen Computer etwas von host1 auf host2 kopieren, ohne mich über ssh bei host1 oder host2 anzumelden. So etwas wie,

scp user@10.3.0.1:/path/to/file user@10.3.0.2/path/to/file

Wie kann ich das tun, beachten Sie bitte, dass die beiden Hosts unterschiedliche Ports für ssh verwenden.


Fragen Sie, ob Sie von einem Remotehost zu einem Remotehost übertragen können, oder wie Sie dies tun können, ohne ein Kennwort eingeben zu müssen?
Glenn Jackman

Während das -PFlag vorhanden ist, um den zu verwendenden Port anzugeben, hat ssh im Fall einer Übertragung von Remote zu Remote kein definiertes Verhalten hinsichtlich der Angabe des Ports pro Host ...
mveroone

Antworten:


216

In der Vergangenheit war die Art und Weise, in der das Kopieren von Dateien zwischen Remote-Systemen scp( naiv ) aufgerufen wurde, sehr unpraktisch: wenn Sie beispielsweise geschrieben haben

    scp user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

scpwürde zuerst eine sshSitzung auf remote1 eröffnen und dann scpvon dort auf remote2 laufen. Damit dies funktioniert, müssen Sie die Berechtigungsnachweise für remote2 auf remote1 einrichten.

Die moderne Art, dies zu tun ("modern", weil es erst vor ein paar Jahren implementiert wurde und vielleicht nicht jeder ein -3-fähiges System hat scp), erfordert zwei Schritte. Der erste notwendige Schritt besteht darin ~/.ssh/config, alle Optionen für die Verbindung zu remote1 und remote2 wie folgt einzurichten:

    Host remote1.example.org
    Port 2222
    IdentityFile /path/to/host1-id_rsa

    Host remote2.example.org
    Port 6969
    IdentityFile /path/to/host2-id_rsa

Auf diese Weise ist es möglich, alle erforderlichen Optionen ohne Mehrdeutigkeiten an den Befehl zu übergeben : Wenn wir beispielsweise für die Befehlszeilenschnittstelle den Port 2222 ohne die obige Konfiguration verwendet hätten, wäre unklar gewesen, ob wir auf remote1 oder remote2 und verweisen ebenfalls für die datei mit den kryptografischen schlüsseln. Auf diese Weise bleibt die CLI übersichtlich und einfach.

Zweitens verwenden Sie die -3Option wie folgt:

    scp -3 user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

Die -3Option weist scpan, den Datenverkehr über den PC zu leiten, auf dem der Befehl ausgegeben wird, auch wenn er ein Dritter für die Übertragung ist. Auf diese Weise müssen sich die Berechtigungsnachweise nur auf dem ausstellenden PC, dem Drittanbieter, befinden.


6
Zum späteren Nachschlagen: Wenn Sie eine Datei zwischen zwei Hosts kopieren, die sich eine Identitätsdatei teilen (z. B. eine EC2-Instanz), benötigen Sie die Konfigurationsdatei nicht. Ein Argument -i reicht aus, um eine Verbindung zu beiden Hosts herzustellen.
Artur Czajka

1
Erwähnenswert ist auch, dass für Google Compute Engine das Hinzufügen zu Ihrer ~/.ssh/configDatei unterstützt wird: cloud.google.com/compute/docs/gcloud-compute, aber ich glaube nicht, dass AWS die gleiche Unterstützung hat
modulitos

1
Da Sie die Ausgabe nicht wie gewohnt sehen, sollten Sie den ausführlichen Modus mit aktivieren -v.
Holmberd

6

Als ich das letzte Mal versuchte, war scp nicht in der Lage, das zu tun. Ihre Befehlszeile sieht in Ordnung aus. Diese Problemumgehung funktioniert:

ssh -p port_on_machine1 user@machine1 "cat /path/to/file/one"|ssh -p port_on_machine2 user@machine2 "cat >/path/to/file/two"

meine scp man page sagt "Kopien zwischen zwei entfernten Hosts sind ebenfalls erlaubt."
Glenn Jackman

1
Danke, es ist gut zu hören. Scp kann man ein -P-Flag geben (es wurde von einigen BSD-Leuten geschrieben, weil die Handhabung der Argumente so tragisch ist :-(), aber es scheint, dass man auf den Remote-Hosts keine unterschiedlichen Ports angeben kann. Es tut mir leid, aber ich denke, nur diese Abhilfe Linken (oder es gibt eine Menge kniffliger Lösungen, mit ssh aber scp zu vermeiden - zum Beispiel, sftpfs, aber sie sind nicht die einfachste). dehnte ich meine Abhilfe mit den Port - Einstellungen.
user259412

4

In meinem Fall habe ich eine Remote-zu-Remote-Kopie ohne das -3Argument durchgeführt. Der mit dem Parameter '-P' angegebene Port funktioniert mit dem ersten Server, aber Port 22 wird mit dem zweiten Server verwendet.

ssh -P 1234 user@server1.mydomain.com user@server2.otherdomain.com

Die Lösung besteht darin, die /etc/ssh/ssh_configDatei zu bearbeiten server1und folgende Zeilen hinzuzufügen:

Host *.otherdomain.com
   Port  1234

Auf diese Weise wird der Port 1234 für beide verwendet. Es könnte auch anders sein.

Diese Lösung bietet einen besseren Durchsatz als frühere Lösungen, da die Kommunikation direkt erfolgt.


perez gibt es eine möglichkeit, scp über zwei verschiedene ports für die zwei verschiedenen remote-maschinen von der comman-leitung zu erreichen?
Rote Flasche

4

Die Quelle und das Ziel können als URI in der Form scp: // [user @] host [: port] [/ path] angegeben werden.

so kannst du laufen:

scp -3 scp://user@10.3.0.1:22/path/to/file scp://user@10.3.0.2:6969/path/to/file
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.