Wie kann ich eine Datei von einem Host herunterladen, zu dem ich nur über einen anderen Host SSH ausführen kann?

30

Ich möchte Dateien von meinem Bürocomputer auf meinen Laptop herunterladen.

Ich kann meinen Bürocomputer über SSH mit dem Organisationsserver und dann über SSH vom Server mit meinem Bürocomputer verbinden.

Die einzigen Befehle, die der Organisationsserver akzeptiert, sind ssh, ssh1 und ssh2.

Wie kann ich eine Datei von meinem Büro- (Remote-) Computer über den Server auf meinen Laptop- (lokalen) Computer herunterladen?

yochay magan
quelle
2
Verwenden Sie Reverse-SSH-Tunnel? Sehen Sie meine Antwort hier und passen Sie sie nach Bedarf an: superuser.com/questions/1186905/…
Darren
1
Multi-Hop-SSH?
McKenzm

Antworten:

37

In den vorherigen Antworten wird erwähnt, wie die ProxyJump-Direktive (hinzugefügt in OpenSSH 7.3) zum Herstellen einer Verbindung über einen Zwischenserver (normalerweise als Bastion-Host bezeichnet) verwendet wird, aber nur als Befehlszeilenargument.

Sofern es sich nicht um eine Maschine handelt, die Sie in Zukunft nicht mehr anschließen werden, ist es am besten, wenn Sie sie konfigurieren ~/.ssh/config.

Ich würde eine Datei wie:

Host office-machine
Hostname yochay-machine.internal.company.local
ProxyJump bastion-machine

Host bastion-machine
Hostname organization-server.company.com
...

Wenn Sie eine frühere Version von OpenSSH verwenden, die ProxyJump nicht unterstützt, ersetzen Sie diese durch die entsprechende Version:

ProxyCommand ssh -W %h:%p bastion-machine

und wenn Ihre lokale ssh-Version eine sehr alte war, die dies nicht unterstützte -W:

ssh bastion-machine nc %h %p

Dies setzt allerdings voraus, dass die Bastion-Maschine ncinstalliert ist.

Das Schöne an ssh ist, dass Sie jedes Ziel in der Datei konfigurieren können und sie sehr gut stapeln. Daher arbeiten Sie office-machinebei allen Tools (ssh, scp, sftp ...) als Hostnamen, da es sich um direkte Verbindungen handelte, und sie werden anhand von ssh_config herausfinden, wie eine Verbindung hergestellt werden kann. Sie können auch Platzhalter verwenden Host *.internal.company.local, um alle Hosts, die so enden, durch eine bestimmte Bastion zu führen. Dies gilt für alle Hosts. Einmal richtig konfiguriert, wären die einzigen Unterschiede zwischen One-Hop-Verbindungen und 20 die langsameren Verbindungszeiten.

Engel
quelle
36

Wenn Sie ein aktuelles OpenSSH (8.0) haben, können Sie den -J(Sprung-) Schalter verwenden :

scp -J user@intermediate user@target:/path

Mit älteren Versionen (mindestens jedoch 7.3) können Sie die ProxyJumpDirektive entweder über die Befehlszeile verwenden:

scp -o ProxyJump=user@intermediate user@target:/path

oder in ssh_configDatei, wie die Antwort von @ Ángel zeigt.


Es gibt andere Optionen wie ProxyCommandoder Portweiterleitung, die Sie auch für ältere Versionen von OpenSSH verwenden können. Diese werden in Wird die Multihop-Anmeldung von OpenSSH unterstützt?

Martin Prikryl
quelle
2
@yochaymaganssh -J userA@orgserv userB@officecomp cat remote/path > local/path
mosvy
4
Für scp wurde es in 7.10 hinzugefügt
Ángel
4
Auch wenn scpes nicht unterstützt wird -J, ist es möglicherweise neu genug, um die ProxyJumpOption zu unterstützen . Versuchen Sie eine der anderen Antworten, die diese Option explizit verwenden.
Gordon Davisson
2
Dies sollte die akzeptierte Antwort sein. Ich verachte alle Antworten auf sshFragen, die darauf hindeuten, Ihre configfür bestimmte Hosts zu ändern, wenn eine einfache Befehlszeilenoption ausreicht, um die Aufgabe zu erledigen.
Clemisch
2
"Verachten" scheint eine extreme Reaktion zu sein. Sicher, es gibt Fälle, in denen eine schnelle Änderung der Befehlszeile einfacher ist, als zuerst die Konfigurationsdatei zu ändern. Wenn Sie jedoch vorhaben, mehrmals eine Verbindung zu demselben Host herzustellen, würde ich meine Konfigurationsdatei mit Sicherheit lieber einmal aktualisieren, als sie -J user@intermediatejedes Mal zu verwenden, wenn eine Verbindung hergestellt werden muss.
Chepner
10

Manchmal können wir einfach die Pipeline benutzen. Diese Zeit ist heute.

ssh -A user@host1 ssh user@host2 cat filename > filename

Sie können auch hochladen

ssh -A user@host1 ssh user@host2 cat \\\> filename < filename

Ja, es gibt andere Lösungen, die Proxies usw. beinhalten, aber es ist nützlich zu wissen, wie man das macht.

Joshua
quelle
Nützliche Verwendung von cat!
Piskvor
Beachten Sie, dass jeder ausreichend privilegierte Benutzer des Zwischenhosts Zugriff auf Ihren ssh-Agenten und die Schlüssel erhält. Die Daten, die zwischen Ihrem Host und Host2 fließen, sind auch unverschlüsselt auf Host1 vorhanden. Die Methoden, die Proxys verwenden und darüber springen, vermeiden diese beiden Probleme.
James
@ James: Ich bin nicht ahnungslos. Bastion Gastgeber wie diese sind in der Regel sehr vertrauenswürdig.
Joshua
7

Verwenden Sie die ProxyJumpKonfiguration:

ProxyJump
Gibt einen oder mehrere Sprung-Proxys als [user @] host [: port] oder als ssh-URI an. Mehrere Proxys können durch Komma getrennt werden und werden nacheinander aufgerufen. Wenn Sie diese Option aktivieren, stellt ssh (1) eine Verbindung zum Zielhost her, indem Sie zuerst eine ssh (1) -Verbindung zum angegebenen ProxyJump-Host herstellen und von dort eine TCP-Weiterleitung zum endgültigen Ziel herstellen.

scp -o ProxyJump=user@intermediate user@target:/path
RalfFriedl
quelle
2

Es gibt ein altes Protokoll namens ZMODEM : Heutzutage wird es nur von wenigen Programmen unterstützt, aber wenn es funktioniert, kann es recht praktisch sein.

Überprüfen Sie zunächst, ob das Terminalprogramm Ihres Laptops ZMODEM unterstützt. (Beispielsweise können Sie iTerm2 (auf Mac) so konfigurieren, dass es ZMODEM unterstützt. Ein Beispielskript finden Sie hier .)

Führen Sie auf Ihrem Büromaschinen Folgendes aus: sudo apt install lrzsz

Jetzt müssen Sie nur noch ssh auf Ihren Büromaschinen ausführen sz (filename). Die Datei wird über Ihr Terminal heruntergeladen.

jick
quelle
1

Konfiguration unter SSH des Benutzers: ~/.ssh/config

Host *
    UserKnownHostsFile=/dev/null
    StrictHostKeyChecking=no
    ServerAliveInterval 300
    ServerAliveCountMax 2
    ForwardAgent yes


Host jump server
    HostName server.company.org
    User root

Host jump1 server1
    HostName server1.dmz.company.org
    User root
    ProxyJump jump

Host jump2 server2
    HostName server.dmz2.company.org
    User root
    ProxyJump jump1

Host *.intranet.company.org
    User user
    ProxyJump jump2

Sie können jetzt vom Intranetserver direkt über den 3- Jump-Server kopieren .

scp [email protected]:/home/user/ ./*

Ich bevorzuge dies, weil ich keine Jump-Server mehr mit scp angeben muss

Lukáš Viktora
quelle
0

Über SCP -3:

scp -3 user1@remote1:/root/file1.txt user2@remote2:/root/file1.txt
Wuseman
quelle
2
Die -3Option wird als "Kopien zwischen zwei Remote-Hosts werden über den lokalen Host übertragen" beschrieben. während ich glaube, dass diese Frage besagt, dass der lokale Host nicht auf "remote2" zugreifen konnte.
Jeff Schaller
2
@JeffSchaller: Sie an der Maschine in der Mitte verbinden, dann verwenden -3. Dies setzt jedoch voraus, dass Sie eine Verbindung von der mittleren zur ersten Maschine herstellen können.
Joe
Ich sehe keinen Vorteil gegenüber -J / JumpHost. Ganz im Gegenteil, da es die Einschränkung gibt, die @Joe erwähnt.
Martin Prikryl