it-swarm.com.de

SCP-Dateien über Zwischenhost

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 glaube also nicht, dass ich dauerhafte Tunnel einrichten kann, aber korrigieren Sie mich, wenn ich falsch liege!

74
astrofrog

ProxyJump

Neu in OpenSSH 7.3:

A$ scp -oProxyJump=B thefile C:destination

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

ProxyCommand

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

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

Wenn auf A ein sehr alter SSH-Client installiert ist (ohne -W-Unterstützung) oder in B die Weiterleitung von TCP nicht zulässig ist (Shell-Befehle jedoch weiterhin zulässig sind), verwenden Sie 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 ssh -Prozess abzubrechen (der aufgrund von -f -N in den Hintergrund gefallen ist).

  • -f Fordert 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.
  • -N Fü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 zum angegebenen TCP -Port oder Unix-Socket auf dem fernen (Server-) Host an den angegebenen Host und Port oder Unix-Socket auf der lokalen Seite weitergeleitet werden.
96
grawity

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
23
Dan Bloch

Fast alles wurde bereits gesagt, aber hier ist mein letzter Cent: Ich verwende die ProxyCommand-Variante ohne nc oder 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 durch diesen Host (angemeldet als HOP_USER)
    • TARGET_Host: es ist unser Ziel (authentifiziert als TARGET_USER)
  2. Zuerst habe ich meinen lokalen öffentlichen Schlüssel von meinem Heimat-Host .ssh/id_dsa.pub zu .ssh/authorized_keys auf Hop- und Ziel-Hosts hinzugefügt. Ja, derselbe öffentliche Schlüssel vom Home-Host für beide. Normalerweise ist dies der öffentliche HOP-Schlüssel, den Sie zum TARGET-Schlüssel hinzufügen müssen.

  3. Dann habe ich den .ssh/config ein wenig geändert, indem ich folgenden Eintrag hinzugefügt habe:

    Host TARGET_Host
       User TARGET_USER
       ProxyCommand ssh -W %h:%p [email protected]_Host
    
  4. Danach ist der Kopiervorgang 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 ssh verwenden, um direkt zum Ziel zu gelangen: 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 (vpn über ssh) handelt. In Ihrem Fall von A-> B <-> C können Sie also 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.

8
SQ9MCP
ssh -L 4321:hostC:22 [email protected]

in einer anderen Shell:

scp -P 4321 localfile [email protected]

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.

Zur Erklärung können Sie mit -L und -R Ports weiterleiten. In -L wird als erster Port angegeben, dass der Port ssh auf dem Ursprungscomputer (Host A) zu lauschen beginnt. Er leitet alle über diesen Port empfangenen Daten über Ihre SSH-Verbindung an Host B weiter und leitet sie dann an Port 22 an Host C weiter .

edit

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

7

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: [email protected] (der Sprunghost oder der mittlere Server)

Server C: [email protected] (der entfernte Server, auf den Sie kopieren möchten)

ProxyCommnad

    A$ scp -oProxyCommand="ssh -W %h:%p [email protected]" thefile [email protected]:destination

Konkretes Beispiel

Angenommen, Sie haben Zugriff auf einen Server mit der IP-Adresse 0.0.1.2 mit 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.1 mit dem Benutzerkonto foo (Server B) anmelden. Jetzt möchten Sie die Datei baz.txt, die sich auf Ihrem aktuellen Computer (Computer A) befindet, in das Verzeichnis 0.0.1.2 des Servers /home/bar/ kopieren. Um den obigen ProxyCommand für dieses Beispiel zu verwenden, würden Sie Folgendes ausführen:

    A$ scp -oProxyCommand="ssh -W %h:%p [email protected]" baz.txt [email protected]:/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 sich baz.txt beispielsweise bereits auf dem Server 0.0.1.2 unter /home/bar/ befand, können Sie ihn folgendermaßen auf Ihren Computer kopieren:

    A$ scp -oProxyCommand="ssh -W %h:%p [email protected]" [email protected]:/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.

1
Joseph Carmack