SCP-Dateien über Zwischenhost


85

Ich habe Zugriff auf 3 Computer, A, B und C. Die einzigen möglichen (ssh) Verbindungen sind:

A -> B
B <-> C

Ich muss Dateien von A nach C holen, damit ich die Dateien von A nach B scannen und sie dann von B nach C scannen kann. B hat jedoch nicht viel Speicherplatz, daher ist dies keine Option. Gibt es eine Möglichkeit, Dateien von A nach C über B zu scpen? Hinweis: Ich habe auf keinem der Computer Root-Zugriff. Ich kann also keine dauerhaften Tunnel einrichten, aber korrigiere mich, wenn ich falsch liege!


6
Ich weiß, dass dies die Frage nicht beantwortet, aber für diejenigen, die nicht über Rsync Bescheid wissen oder nicht wissen, wie man damit durch einen Host springt, könnte dies ein nützlicher Tipp sein: Verwenden Sie die Option '-e' mit rsync wie A$ rsync <options> -e 'ssh B ssh' source C:destination
folgt

Antworten:


108

ProxyJump

Neu in OpenSSH 7.3:

A$ scp -oProxyJump=B thefile C:destination

(Hinter den Kulissen werden nur ProxyCommand und verwendet ssh -W.)

ProxyCommand

Aktualisiert, um -W von anderen Antworten einzuschließen:

A$ scp -oProxyCommand="ssh -W %h:%p B" thefile C:destination

Wenn in A ein sehr alter SSH-Client installiert ist (ohne -WUnterstützung) oder in B die TCP-Weiterleitung nicht zugelassen ist (Shell-Befehle jedoch weiterhin zulässig sind), verwenden Sie folgende Alternativen:

A$ scp -oProxyCommand="ssh B socat stdio tcp:%h:%p" thefile C:destination
A$ scp -oProxyCommand="ssh B nc %h %p" thefile C:destination

Rohre

A$ tar cf - thefile anotherfile | ssh B "ssh C \"cd destination && tar xvf -\""
A$ (echo thefile; echo anotherfile) | cpio -o | ssh B "ssh C \"cd destination && cpio -i\""

Für nur eine Datei:

A$ ssh B "ssh C \"cd destination && cat > thefile\"" < thefile

"Tunnel" durch B

A$ ssh -f -N -L 4567:C:22 B
(continues running in background)

A$ scp -P 4567 thefile localhost:destinationPath

Wenn Sie fertig sind, vergessen Sie nicht, den zuvor gestarteten sshProzess abzubrechen (der aufgrund von in den Hintergrund gefallen ist -f -N).

  • -fFordert ssh auf, kurz vor der Befehlsausführung in den Hintergrund zu wechseln. Dies ist nützlich, wenn ssh nach Passwörtern oder Passphrasen fragt, der Benutzer dies jedoch im Hintergrund wünscht. Dies impliziert -n.
  • -NFühren Sie keinen Remote-Befehl aus. Dies ist nützlich, um nur Ports weiterzuleiten.

"Tunnel" durch B nach A umkehren

Funktioniert aber nicht immer:

A$ ssh -f -N -R 4567:localhost:22 B
(now you can reach A from B, by using localhost:4567)

B$ scp -P 4567 localhost:thefile C:destination
  • -R Gibt an, dass Verbindungen zu dem angegebenen TCP-Port oder Unix-Socket auf dem Remote-Host (Server) an den angegebenen Host und Port oder Unix-Socket auf der lokalen Seite weitergeleitet werden sollen.

Vielen Dank für diese Beispiele @grawity. Eine Frage - ist es möglich, `tar c thefile anotherfile | umzukehren? ssh B "ssh C \" cd Ziel && tar xv \ "´, um den Download von C nach A (auf A) zu
kopieren

@dmeu: Ja, das ist möglich.
Grawity

Wie kann ich den zuvor gestarteten ssh-Prozess "beenden", wenn ich ein MacOS verwende?
Aero Windwalker

Hinweis: Wie üblich , wenn Sie wollen scp von C, obwohl B zu A, die Sie tun können A$ scp -oProxyJump=B C:destination thefile.
Jvriesem

@Pablo Verwenden Sie besser -S, und -O beenden. Oder ... zumindest pkill -f.
Grawity

24

Versionen von scp ab Anfang 2011 und später haben möglicherweise die Option "-3":

 -3      Copies between two remote hosts are transferred through the local
         host.  Without this option the data is copied directly between
         the two remote hosts.  Note that this option disables the
         progress meter.

Wenn Sie dies haben, können Sie einfach ausführen:

B$ scp -3 A:file C:file

In meinem Fall war Host A nur von B aus erreichbar (der über VPN verbunden war). Host C befand sich im selben LAN wie B. Ich wollte eine Datei von A nach C bekommen und scp -3 löste sie hervorragend.
Joe

Ich hatte Probleme damit, als beide Hosts nach einem Passwort fragten. Es scheint nach beiden gleichzeitig zu fragen (zwei Passwortabfragen wurden in derselben Zeile angezeigt) und dann konnte es mein Passwort nicht akzeptieren. Ich könnte es schließlich zum Laufen bringen, indem ich mein Passwort wiederholt eingebe (dasselbe Passwort auf beiden Hosts), aber es war schwer herauszufinden.
Colin D

8

Fast alles wurde bereits gesagt, aber hier ist mein letzter Cent: Ich verwende die ProxyCommand-Variante ohne ncnoch soc. Basierend auf OpenSSH Proxies und Jumphost Cookbook habe ich folgende Konfiguration erstellt:

  1. Wir haben also folgende Spieler:

    • HOME_HOST: Hier wird eine Datei auf den Zielhost kopiert
    • HOP_HOST: Wir kopieren über diesen Host (angemeldet als HOP_USER)
    • TARGET_HOST: es ist unser Ziel (authentifiziert als TARGET_USER)
  2. Zuerst fügte ich meinen lokalen öffentlichen Schlüssel von meinem Heimat-Host .ssh/id_dsa.pub zu .ssh/authorized_keyssowohl Hop- als auch Ziel-Hosts hinzu. Ja, derselbe öffentliche Schlüssel vom Home-Host für beide. Normalerweise ist dies der öffentliche HOP-Schlüssel, den Sie dem TARGET-Schlüssel hinzufügen müssen.

  3. Dann habe ich .ssh/configein wenig optimiert, indem ich folgenden Eintrag hinzugefügt habe:

    Host TARGET_HOST
       User TARGET_USER
       ProxyCommand ssh -W %h:%p HOP_USER@HOP_HOST
    
  4. Danach wird der Kopiervorgang ist so einfach wie: scp FILE TARGET_HOST:. Es werden doppelte Banner sowohl vom Hop- als auch vom Zielknoten angezeigt, aber es funktioniert.

Natürlich können Sie oben verwenden , um direkt auf das Ziel ssh: ssh TARGET_HOST. Es funktioniert mit scp und ssh.

Eine weitere allgemeinere Option könnte das Dienstprogramm sshuttle sein, bei dem es sich anscheinend um eine Art transparenten Proxy handelt (vpn über ssh). In Ihrem Fall von A-> B <-> C können Sie eine Verbindung zu jedem Knoten im Netzwerk von C herstellen: A-> B- [CDEFG]. Es braucht keinen Administrator, aber es benötigt Python 2.7 (3.5 auch OK), was nicht immer das ist, was wir haben. Es lohnt sich, es zu versuchen.


7
ssh -L 4321:hostC:22 youruser@hostB

in einer anderen Schale:

scp -P 4321 localfile youruser@127.0.0.1

Dies verwendet die Portweiterleitung. Die einzige Einschränkung hier ist, dass Host B konfiguriert werden muss, um die Portweiterleitung zuzulassen. Ansonsten sollte dies gut funktionieren.

In der Art der Erklärung, -Lund -Rermöglichen es Ihnen, Ports weiterzuleiten. In -Lwird als erster Port angegeben, dass der Port ssh auf dem Ursprungscomputer (Host A) zu lauschen beginnt und über Ihre SSH-Verbindung alles, was er auf diesem Port empfängt, an Host B weiterleitet und dann an Port 22 an Host C weiterleitet.

bearbeiten

Ich habe die Syntax ein wenig durcheinander gebracht. Es richtet eine Weiterleitung auf Ihrem LOCAL-Computer ein.


@astrofrog - Wenn eine unserer Antworten Ihren Anforderungen entspricht, sollten Sie wahrscheinlich eine davon akzeptieren.
Brian Vandenberg

2

Die ProxyCommand-Antwort von Grawity hat bei mir funktioniert, aber da ich mit SSH weniger vertraut bin, waren einige Experimente erforderlich. Ich dachte, ich würde Grawitys Antwort nur ausführlicher formulieren, um anderen Neulingen wie mir bei SSH zu helfen. Hier sind die Definitionen für eine explizitere Notation:

Maschine A: Die Maschine, auf der Sie sich befinden

Server B: userB@ip.address.for.B (der Sprunghost oder der mittlere Server)

Server C: userC@ip.address.for.C (der Remote-Server, auf den Sie kopieren möchten)

ProxyCommnad

    A$ scp -oProxyCommand="ssh -W %h:%p userB@ip.address.for.B" thefile userC@ip.address.for.C:destination

Konkretes Beispiel

Nehmen wir als konkretes Beispiel an, Sie haben Zugriff auf einen Server mit IP 0.0.1.2mit einem Benutzerkonto mit dem Namen bar(Server C). Dazu müssen Sie sich jedoch zuerst bei einem Server mit der IP-Adresse 0.0.1.1mit dem Benutzerkonto foo(Server B) anmelden . Jetzt wollen Sie Datei kopieren , baz.txtauf dem aktuellen Maschine (Machine A) zu Server befindet 0.0.1.2‚s - /home/bar/Verzeichnis. Um den obigen ProxyCommand für dieses Beispiel zu verwenden, führen Sie Folgendes aus:

    A$ scp -oProxyCommand="ssh -W %h:%p foo@0.0.1.1" baz.txt bar@0.0.1.2:/home/bar/

Sie können eine Datei auch genauso einfach von Server C kopieren, indem Sie die Reihenfolge der Datei und des Ziels ändern. Wenn Sie sich zum Beispiel baz.txtbereits auf dem Server 0.0.1.2befunden haben, können /home/bar/Sie ihn auf Ihren Computer kopieren, indem Sie Folgendes verwenden:

    A$ scp -oProxyCommand="ssh -W %h:%p foo@0.0.1.1" bar@0.0.1.2:/home/bar/baz.txt /destination/path/on/A

Hoffe, dies hilft Menschen, die Dinge brauchen, die für sie ein bisschen mehr als andere formuliert sind.

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.