Frage Wie mache ich Multihop SCP Transfers?


Ich möchte eine Datei von meinem Computer A auf Server C kopieren, habe aber nur Zugriff auf Server C über Server B.

Anstatt zuerst auf Server B zu wechseln, einzuloggen und dann auf Server C zu übertragen, ist es möglich, die Datei direkt mit SCP oder ähnlichen Programmen zu übertragen?

(Emacs Tramp-Modus verfügt über diese Funktion zum Remote-Bearbeiten von Dateien).


76
2017-07-08 12:09


Ursprung




Antworten:


Unter der Annahme, OpenSSH, fügen Sie zu Ihrer SSH-Konfiguration in .ssh / config

Host distant
ProxyCommand ssh near nc distant 22

Dies wird dazu führen, dass SSH "direkt" mit der Maschine verbunden werden kann, die als entfernt bezeichnet wird. Es kann dann Anwendungen wie scp und sftp zur entfernten Maschine verwenden.

Damit dies funktioniert, benötigen Sie 'nc' aka netcat, das auf dem Computer in der Nähe installiert ist. Aber viele moderne Systeme werden es schon haben.

towo's Teer-Lösung ist effektiver für One-Shot-Probleme, vorausgesetzt, Sie haben sich die Syntax und die Regeln des Tars auswendig gelernt.


43
2017-07-08 12:25



Dies ist die gleiche Methode, die ich verwende ... In diesem Beispiel wäre "ferne" Server C und "nahe" wäre Server B zur Klärung ... - Jeremy Bouse
Viele moderne Maschinen haben kein 'nc': Es ist normalerweise nur für Linux-Maschinen und nur auf Anfrage verfügbar (nicht Teil der Standardinstallation). - Mei
ssh hat nun die Option -W, das macht das automatisch ohne 'nc', aber ich frage mich, warum es nicht scp -W gibt - kubanczyk
Für den Fall, dass ich nicht der einzige bin, war das nicht offensichtlich: wenn der Benutzername auf near ist anders als der Benutzername auf distant, geht der nahe Benutzer hinein ProxyCommand ssh nearuser@near...und der entfernte Benutzer geht in ein separates User distantuser Linie. - Mu Mind
Geben Sie einfach ssh multi hope ein und drücken Sie Google. Ich fühle mich glücklich - chandank


Du kannst hinzufügen -o Optionen zu scp anstatt .ssh/config.

scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path

$jump_host ist in diesem Fall Ihr "Server B".


41
2018-01-11 17:30



Dies ist meine bevorzugte Art, dies zu tun. Das Versenden von .ssh / config für Multihopping ist nicht die beste Lösung, wenn Sie von einem Gateway und direkt auf denselben Host zugreifen. - GabrieleV
toller Schnipsel ... Danke ... - Paul T.
Wie wäre das mit anderen / benutzerdefinierten Benutzernamen und Ports? - Pablo Bianchi


Mit neueren Versionen von ssh auf dem Server in der Nähe von (B) Maschine funktioniert das Folgende ohne Netcat:

Host distant
    ProxyCommand ssh near -W distant:22

Es erfordert jedoch, dass AllowTcpForwarding auf dem nahen (B) Computer "Ja" (der Standardwert) ist

edit: benötigt OpenSSH 5.4+ auf B


19
2018-03-20 01:04



klappt wunderbar :) - gongzhitaao
Und ab OpenSSH 7.4p1 gibt es einen "ProxyJump" -Befehl, in dem man nur jeden user @ host: port durch Kommas getrennt auflisten muss. Nett! - hmijail
ProxyJump ist nett, aber es hat nicht die Benutzer und IdentityFile aus der Konfigurationsdatei genommen. ProxyCommand -W tut dies und arbeitet auch mit scp. - rickfoosusa


Sie können ssh auf Server B mit etwas wie

ssh -L 5022:<server C IP>:22 <user_serverB>@<server B IP>

Dann können Sie ssh auf Server C verwenden

ssh -p 5022 <user_serverC>@localhost 

Ähnlich würde scp arbeiten mit

scp -P 5022 foo.txt <user_serverc>@localhost:

Denken Sie daran, den korrekten Fall von p mit scp und ssh zu verwenden


15
2017-07-08 13:02





Wenn du wirklich böse sein willst, könntest du ssh und tar verketten tar c mydir | ssh server "ssh otherserver | tar x", aber das kann in alle Hände von Problemen laufen.

Der einfachere Weg wäre, nur einen SSH-Tunnel mit den eingebauten Methoden von SSH aufzubauen; schaue auf die -D Schalten Sie die Manpage ein und leiten Sie einfach einen Port zum ssh-Port des anderen Servers weiter.


3
2017-07-08 12:16





Dies ist möglich und relativ einfach, auch wenn Sie Zertifikate für die Authentifizierung verwenden müssen (typisch in AWS-Umgebungen).

Der folgende Befehl kopiert Dateien von a remotePath auf server2 direkt in Ihre Maschine bei localPath. Intern wird die scp-Anfrage per Proxy weitergeleitet server1.

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

Umgekehrt funktioniert das auch (Upload-Datei):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>

Wenn Sie stattdessen die Kennwortauthentifizierung verwenden, versuchen Sie es mit

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

Wenn Sie auf beiden Servern dieselben Benutzeranmeldeinformationen verwenden:

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>

2
2017-10-08 01:24





Sie können dies auch umgekehrt und ist vielleicht einfacher.

Angenommen, Sie haben eine SSH-Sitzung mit dem Computer geöffnet, an den Sie die Datei senden möchten. Dieser am weitesten entfernte Hop-PC nennen wir Hop2. Ihr "Proxy" -Host wird hop1 sein. Der PC, der Datei-Ursprung ist, nennen wir diesen Ursprung.

origin:~/asdf.txt  --> hop1 --> hop2:~/asdf.txt

Sie können Tunnel erstellen, die einen lokalen Port auf einem Remote-PC verfügbar machen. Wir definieren damit einen Port, der auf dem Remote-PC geöffnet werden soll. Dieser wird an den Port weitergeleitet, den Sie beim Erstellen des Tunnels mitgenommen haben.

Auf Hop2:

ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
#this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555

In dieser geöffneten Tunnelsitzung können Sie das Gleiche von hop1 bis file_origin tun.

Auf Hop1:

ssh -R 6666:127.0.0.1:5555 <origin_user>@<origin_IP>
#this has the effect of building a tunnel from hop1 to origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on origin as port 6666.

Sie werden jetzt von Hop2 zu Hop1 zum Ursprung getunnelt. Zufälligerweise sind jetzt sowohl Port 5555 als auch Port 6666 auf Ursprung offen, die zu hop2-Port 22 umgeleitet werden. In dieser Sitzung sind beide der folgenden gültigen scp-Routen zu hop2:

Auf herkunft:

scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt

Auf diese Weise können Sie eine beliebige Anzahl von Hops dazwischen haben, und es ist einfacher, mit der Verkettung von mehr als zwei Hops zu arbeiten.


2
2017-11-18 20:22





Versuchen Sie, das folgende Beispiel openssh config für ein Setup anzupassen, das für mehrere Hosts verwendet werden kann:

Host uat-*
     ProxyCommand ssh bastion-uat nc %h %p

Dies setzt eine Reihe von Servern voraus, die mit "uat-" beginnen und nur über den Jumpbox / Gateway-Server "bastion-uat" erreichbar sind. Sie möchten wahrscheinlich auch hinzufügen ForwardAgent yes wenn Sie sich mit einem Schlüssel anmelden.


1
2018-06-25 10:33



Benutze es nicht ForwardAgent yes dafür. Die Weiterleitung von Agenten ist in diesem Fall nicht erforderlich, da kein SSH-Client in der Bastion ausgeführt wird und die Weiterleitung eines Agenten, wenn dieser nicht benötigt wird, die Sicherheit verringert. Und ich denke ssh fehlt von deinem Befehl. Wenn ein kürzlich ssh Version wird verwendet, die Sie nicht benötigen nc, du kannst Tippen ssh -W %h:%p bastion-uat stattdessen. - kasperd
@ kasperd Bearbeitet, um ssh einzuschließen. Re ForwardAgent; Ein ssh-Client wird ausgeführt, um den nc-Befehl selbst auszuführen. Vielleicht beziehst du dich auf die Schale? - Benjamin Goodacre


Dies ist nicht scp (was OP angefordert), aber ich fand es super einfach zu bedienen rsync Kopieren von lokal nach remote über einen einzelnen Hop mit:

rsync -v -e 'ssh -A -t user@jumpserver ssh -A -t user@destinationserver' /path/to/sourcefile :/path/to/destination

Quelle: http://mjbright.blogspot.com/2012/09/using-rsync-over-multi-hop-ssh.html

Ich hatte den -o ProxyPass-Vorschlag oben versucht und wollte die Konfiguration nicht für meine wechselnden Bedürfnisse ändern. Wie der Autor im obigen Link feststellt, ist die Zieldatei vor dem Doppelpunkt (:) wichtig, um anzuzeigen, dass sich der angegebene Pfad auf dem Zielserver befindet. Mit rsync hast du außerdem die Möglichkeit, Daten zu vergleichen, Ordner zu synchronisieren usw. Ich hoffe, das hilft jemandem!


1
2017-12-21 17:07