Wie scp mit einem zweiten Remote-Host


82

Ich frage mich, ob es für mich eine Möglichkeit gibt, die Datei vom Remote2-Host direkt von meinem lokalen Computer aus über einen Remote1-Host zu scannen.

Die Netzwerke erlauben nur Verbindungen zum Remote2-Host vom Remote1-Host. Außerdem können weder Remote1-Host noch Remote2-Host auf meinen lokalen Computer übertragen.

Gibt es so etwas wie:

scp user1@remote1:user2@remote2:file .

Erstes Fenster: ssh remote1dann scp remot2:file ..

Zweite Schale: scp remote1:file .

Erstes Fenster: rm file; logout

Ich könnte ein Skript schreiben, um all diese Schritte auszuführen, aber wenn es einen direkten Weg gibt, würde ich es lieber verwenden.

Vielen Dank.

EDIT: Ich denke so etwas wie das Öffnen von SSH-Tunneln, aber ich bin verwirrt darüber, welchen Wert ich wo setzen soll.

Im Moment habe remote1ich für den Zugriff Folgendes $HOME/.ssh/configauf meinem lokalen Computer.

Host remote1
   User     user1
   Hostname localhost
   Port     45678

Einmal aktiviert remote1, um darauf zuzugreifen remote2, ist es das lokale Standard-DNS und der Standard-Port 22. Was soll ich aktivieren remote1und / oder ändern localhost?

Antworten:


94

Ich kenne keine Möglichkeit, die Datei direkt in einem einzigen Befehl zu kopieren, aber wenn Sie zugeben können, eine SSH-Instanz im Hintergrund auszuführen, um nur einen Portweiterleitungstunnel offen zu halten, können Sie die Datei in einem Befehl kopieren.

So was:

# First, open the tunnel
ssh -L 1234:remote2:22 -p 45678 user1@remote1
# Then, use the tunnel to copy the file directly from remote2
scp -P 1234 user2@localhost:file .

Beachten Sie, dass Sie eine Verbindung wie user2@localhostim eigentlichen scpBefehl herstellen, da sich die erste sshInstanz an Port 1234 auf localhost befindet, an den Weiterleitungsverbindungen abgehört werden remote2. Beachten Sie auch, dass Sie den ersten Befehl nicht für jede nachfolgende Dateikopie ausführen müssen. Sie können es einfach laufen lassen.


1
Danke, das scheint in der Nähe von dem zu sein, was ich brauche. Also habe ich den Tunnel erstellt, der Fingerabdruck stimmt mit dem des Servers überein, aber ich habe den Fehler "Berechtigung verweigert (öffentlicher Schlüssel)". Ich denke, ich muss mein Netzwerk / Systemadministrator fragen, warum es nicht funktioniert.
Danosaure

3
Vielen Dank! Ich musste wechseln -p 45678, -p 22da mein remote1 SSH Port 22
Montaro

Ich musste auch -p 22anstelle von verwenden -p 45678. Funktioniert auch scp -P 1234 ...nicht bei mir. Ich bekomme ssh: connect to host localhost port 1234: Connection refused. Wenn ich es versucht scp -P 22 ...habe, funktioniert es, aber es kopiert die Datei in remote 1und nicht auf meinem lokalen Computer ( remote2).
Sünder

Irgendein UI-Tool für dasselbe?
ExploringApple

70

Doppelt ssh

Selbst in Ihrem komplexen Fall können Sie die Dateiübertragung über eine einzige Befehlszeile einfach mit ssh;-) abwickeln
. Dies ist nützlich, wenn remote1keine Verbindung hergestellt werden kann mit localhost:

ssh user1@remote1 'ssh user2@remote2 "cat file"' > file

tar

Sie verlieren jedoch Dateieigenschaften (Besitz, Berechtigungen ...).

Ist tarIhr Freund jedoch, diese Dateieigenschaften beizubehalten:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar c file"' | tar x

Sie können auch komprimieren, um die Netzwerkbandbreite zu reduzieren:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj file"' | tar xj

Und tarkönnen Sie auch eine rekursive Verzeichnis durch grundlegende Übertragung ssh:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj ."' | tar xj

ionice

Wenn die Datei sehr groß ist und Sie andere wichtige Netzwerkanwendungen nicht stören möchten, verpassen Sie möglicherweise die von und Tools bereitgestellte Einschränkung des Netzwerkdurchsatzes (z. B. verwendet nicht mehr als 1 Mbit / s).scprsyncscp -l 1024 user@remote:file

Eine Problemumgehung verwendet jedoch ionice, um eine einzelne Befehlszeile beizubehalten:

ionice -c2 -n7 ssh u1@remote1 'ionice -c2 -n7 ssh u2@remote2 "cat file"' > file

Hinweis: Bei ionicealten Distributionen möglicherweise nicht verfügbar.


Vielen Dank für die Beschreibung, aber ich denke, die Lösung von Dolda2000 ist einfacher. Es war etwas, was ich versuchte, aber nicht herausfinden konnte.
Danosaure

5
Dies ist eine spektakulär gute Antwort und verdient mehr Stimmen. Auch ist es meiner Meinung nach viel einfacher als die akzeptierte Antwort.
Rik Smith-Unna

2
Ich bin damit einverstanden, dass dies eine bessere Lösung ist als die akzeptierte Antwort. Auf diese Weise wird die Verbindung automatisch bereinigt.
Doug

Danke, sehr schöne Antwort! Wie wäre es umgekehrt, wenn Sie von lokal nach remote kopieren?
DomTomCat

31

Dies wird den Trick machen:

scp -o 'Host remote2' -o 'ProxyCommand ssh user@remote1 nc %h %p' \ 
    user@remote2:path/to/file .

Um die Datei remote2direkt vom Host aus zu scannen , fügen Sie die beiden Optionen ( Hostund ProxyCommand) zu Ihrer ~ / .ssh / config-Datei hinzu (siehe auch diese Antwort im Superuser). Dann können Sie ausführen:

scp user@remote2:path/to/file .

von Ihrem lokalen Computer, ohne darüber nachdenken zu müssen remote1.


Netter Ansatz! Obwohl -o 'Host remote2'es nicht wirklich erforderlich zu sein scheint, wenn man von der Kommandozeile aus startet (dh einmal kopiert, ohne ~ / .ssh / config zu berühren)
Mike

Hier gilt das gleiche. Das funktioniert bei mir ohne -o 'Host remote2'. Vielen Dank.
Sünder

7

Mit openssh Version 7.3 und höher ist es einfach. Verwenden Sie die Option ProxyJump in der Konfigurationsdatei.

# Add to ~/.ssh/config 
Host bastion
    Hostname bastion.client.com
    User userForBastion
    IdentityFile ~/.ssh/bastion.pem

Host appMachine
    Hostname appMachine.internal.com
    User bastion
    ProxyJump bastion                   # openssh 7.3 version new feature ProxyJump
    IdentityFile ~/.ssh/appMachine.pem. #no need to copy pem file to bastion host  

Befehle zum Anmelden oder Kopieren

ssh appMachine   # no need to specify any tunnel. 
scp helloWorld.txt appMachine:.   # copy without intermediate jumphost/bastion host copy.** 

Natürlich können Sie den Bastion Jump Host mit der Option "-J" für den Befehl ssh angeben, wenn er nicht in der Konfigurationsdatei konfiguriert ist.

Hinweis scp ist nicht scheint „-J“ Flagge ab jetzt zu unterstützen. (Ich konnte nicht in Manpages finden. Allerdings funktioniert oben scp mit der Einstellung der Konfigurationsdatei)


1
Es ist nicht erforderlich, den Bastion-Server zur Konfigurationsdatei hinzuzufügen, wenn er nur für das Proxing verwendet wird (dh keine andere IdentityFile usw.). Fügen Sie einfach ProxyJump bastion.client.com zum Abschnitt appMachine hinzu.
Tomer Cohen

0

Diese Konfiguration funktioniert gut für mich:

Host jump
   User username
   Hostname jumphost.yourorg.intranet
Host production
   User username
   Hostname production.yourorg.intranet
   ProxyCommand ssh -q -W %h:%p jump

Dann der Befehl

scp myfile production:~

Kopiert myfile auf die Produktionsmaschine .


0

Es gibt eine neue Option scp, die kürzlich für genau denselben Job hinzugefügt wurde, der sehr praktisch ist -3.

TL; DR Führen Sie für den aktuellen Host, für den die Authentifizierung bereits in ssh-Konfigurationsdateien eingerichtet ist, einfach Folgendes aus:

scp -3 remote1:file remote2:file

Sie scpmüssen aus neueren Versionen stammen.

Bei allen anderen genannten Techniken müssen Sie die Authentifizierung von remote1 nach remote2 oder umgekehrt einrichten, was nicht immer eine gute Idee ist.
Argument -3bedeutet, dass Sie Dateien von zwei Remote-Hosts verschieben möchten, indem Sie den aktuellen Host als Vermittler verwenden. Dieser Host führt die Authentifizierung tatsächlich für beide Remote-Hosts durch, sodass diese keinen Zugriff aufeinander haben müssen.
Sie müssen nur die Authentifizierung in ssh-Konfigurationsdateien einrichten, was ziemlich einfach und gut dokumentiert ist, und dann einfach den Befehl in TL; DR ausführen

Die Quelle für diese Antwort ist https://superuser.com/a/686527/713762


0

Kleine Ergänzung zu Olibres Lösung hier, mit der ich unter Verwendung dieser Quelle gearbeitet habe.

So wie Sie die drei Möglichkeiten zum tarKopieren vom Remote-Host zum lokalen Host haben, funktioniert das Folgende für das Kopieren des lokalen Hosts zum Remote-Host in doppelten SSH-Situationen: (Führen Sie sie in dem Verzeichnis aus, aus dem die Dateien kopiert werden müssen, andernfalls verwenden Sie den vollständigen Pfad /Dateiname)

Einzelne Datei ohne Komprimierung übertragen:

tar c filename |  ssh user1@remote1 'ssh -Y user2@remote2 "path2 && tar x"'

Einzelne Datei mit Komprimierung übertragen:

tar cj filename |  ssh user1@remote1 'ssh -Y user2@remote2 "path2 && tar xj"'

Rekursive Verzeichnisübertragung:

tar cj . |  ssh user1@remote1 'ssh -Y user2@remote2 "path2 && tar xj"'

Das && hier verhindert, dass der Befehl ausgeführt wird, wenn die erste Hälfte des Befehls nicht funktioniert - beispielsweise wenn das Verzeichnis fehlt oder wenn ein Fehler in den Quell- / Zielpfadnamen vorliegt.

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.