Wie mache ich Multihop SCP-Übertragungen?

85

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 übertragen, melden Sie sich an und übertragen Sie dann auf Server C. Ist es möglich, die Datei direkt mit SCP oder ähnlichen Programmen zu übertragen?

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

sverrejoh
quelle

Antworten:

48

Sie können hinzufügen -oOptionen scpstatt .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".

John Tantalo
quelle
Dies ist mein bevorzugter Weg, um dies zu tun. Das Verspielen von .ssh / config für Multihopping ist nicht die beste Lösung, wenn Sie über ein Gateway und direkt auf denselben Host zugreifen.
GabrieleV
Wie wäre das mit anderen / benutzerdefinierten Benutzernamen und Ports?
Pablo A
Ich versuche dies und muss das Passwort eingeben. Wie kann ich das beheben? Vielen Dank.
1.
44

Nehmen Sie an, dass OpenSSH zu Ihrer SSH-Konfiguration in .ssh / config hinzugefügt wird

Host distant
ProxyCommand ssh near nc distant 22

Dies bewirkt, dass SSH "direkt" eine Verbindung zu dem als entfernt bezeichneten Computer herstellen kann, indem Proxys über den als nahe bezeichneten Computer ausgeführt werden. Es kann dann Anwendungen wie scp und sftp für die entfernte Maschine verwenden.

Damit dies funktioniert, muss 'nc' aka netcat auf dem Computer mit dem Namen near installiert sein. Aber viele moderne Systeme werden es bereits haben.

Die tar-Lösung von towo ist effektiver bei One-Shot-Problemen, vorausgesetzt, Sie haben die Syntax und die Betriebsregeln von tar auswendig gelernt.

Tialaramex
quelle
Dies ist die gleiche Methode, die ich verwende ... In diesem Beispiel wäre "Fern" Server C und "Nah" wäre Server B zur Verdeutlichung ...
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
1
ssh hat jetzt die Option -W, das geht automatisch ohne 'nc', aber ich frage mich, warum es kein scp -W gibt
kubanczyk
3
Falls ich nicht der einzige bin, für den dies nicht offensichtlich war: Wenn sich der Benutzername nearvon dem Benutzernamen unterscheidet, wird der Benutzer in distantder Nähe ProxyCommand ssh nearuser@near...und der entfernte Benutzer in eine separate User distantuserZeile eingegeben.
Mu Mind
Tippe
19

Mit neueren Versionen von ssh auf dem Server in der Nähe von (B) funktionieren die folgenden ohne Netcat:

Host distant
    ProxyCommand ssh near -W distant:22

Es wird jedoch vorausgesetzt, dass AllowTcpForwarding auf dem Near-Rechner (B) yes ist (Standardeinstellung)

edit: benötigt OpenSSH 5.4+ auf B

danblack
quelle
funktioniert wie ein Zauber :)
Gongzhitaao
1
Und zumindest ab OpenSSH 7.4p1 gibt es einen "ProxyJump" -Befehl, bei dem nur jeder Benutzer @ Host: Port durch Kommas getrennt aufgeführt werden muss. Nett!
Hmijail
ProxyJump ist nett, aber es hat User und IdentityFile nicht aus der Konfigurationsdatei genommen. ProxyCommand -W macht das und funktioniert auch mit scp.
Rickfoosusa
18

Sie können mit etwas wie ssh zu Server B

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

Dann können Sie mit ssh zu Server C gehen

ssh -p 5022 <user_serverC>@localhost 

Ähnlich würde scp mit arbeiten

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

Denken Sie daran, für scp und ssh den korrekten Fall von p zu verwenden

Saurabh Barjatiya
quelle
5

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

Der folgende Befehl kopiert Dateien von a remotePathauf server2direkt auf Ihren Computer unter localPath. Intern wird die scp-Anfrage über weitergeleitet server1.

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

Der umgekehrte Weg funktioniert auch (Datei hochladen):

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>
Donhector
quelle
3

Wenn Sie wirklich böse sein wollen, können Sie ssh und tar verketten, so etwas wie tar c mydir | ssh server "ssh otherserver | tar x", aber dies kann in alle Hände von Problemen geraten.

Am einfachsten wäre es, einen SSH-Tunnel mit den integrierten Methoden von SSH einzurichten. Schauen Sie sich den -DSwitch in der Manpage an und leiten Sie einen Port an den SSH-Port des anderen Servers weiter.

towo
quelle
2

Sie können dies auch in umgekehrter Richtung tun und es ist vielleicht einfacher.

Angenommen, Sie haben eine SSH-Sitzung mit dem Computer geöffnet, an den Sie die Datei senden möchten. Diesen am weitesten entfernten PC nennen wir hop2. Ihr "Proxy" -Host ist hop1. Den PC, von dem die Datei stammt, nennen wir diesen Ursprung.

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

Sie können Tunnel erstellen, um einen lokalen Port auf einem Remote-PC verfügbar zu machen. Damit definieren wir einen Port, der auf dem Remote-PC geöffnet werden soll. Dies ist eine Weiterleitung zu dem Port, den Sie beim Bau des Tunnels mitgezogen 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

Jetzt können Sie in dieser geöffneten Tunnelsitzung dasselbe 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 nun von Hop2 zu Hop1 zum Ursprung getunnelt. Zufälligerweise sind nun beide Ports 5555 und 6666 für Origin geöffnet, die zu Port 22 von hop2 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 Sprüngen dazwischen haben, und es ist einfacher, mit mehr als zwei Sprüngen zu arbeiten.

SYANIDE
quelle
1

Versuchen Sie, das folgende Beispiel anzupassen: openssh config für ein Setup, 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 yeswenn Sie einen Schlüssel zum Anmelden verwenden.

Benjamin Goodacre
quelle
Verwenden Sie nicht ForwardAgent yesdafür. Eine Agentenweiterleitung ist in diesem Fall nicht erforderlich, da auf der Bastion kein SSH-Client ausgeführt wird und die Weiterleitung eines Agenten, wenn er nicht benötigt wird, nur die Sicherheit verringert. Und ich denke, sshes fehlt in Ihrem Befehl. Wenn eine neuere sshVersion verwendet wird, die Sie nicht benötigen nc, können Sie ssh -W %h:%p bastion-uatstattdessen eingeben.
Kasperd
@kasperd Bearbeitet, um ssh einzuschließen. Re ForwardAgent; Ein SSH-Client wird ausgeführt, um den Befehl nc selbst auszuführen. Vielleicht beziehen Sie sich auf die Shell?
Benjamin Goodacre
1

Dies ist kein SCP (welches OP angefordert hat), aber ich fand es super einfach, rsyncdas Kopieren von lokal nach remote über einen einzigen 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 obigen -o ProxyPass-Vorschlag ausprobiert und wollte die Konfiguration nicht an meine veränderten Anforderungen anpassen. Wie der Autor im obigen Link angibt, ist die Zieldatei vor dem Doppelpunkt (:) wichtig, um anzugeben, dass sich der angegebene Pfad auf dem Zielserver befindet. Außerdem haben Sie mit rsync die Möglichkeit, Daten zu vergleichen, Ordner zu synchronisieren usw. Ich hoffe, dies hilft jemandem!

Texas-Bronius
quelle
-2

scp -o 'ProxyJump jumpboxname' somefilename.txt finaldestinationhost: / tmp /.

Ich und
quelle
3
Geben Sie hier nicht nur ein bisschen unerklärlichen Code ab. Es gibt viele gute Antworten auf diese Frage, und Sie müssen den vorhandenen einen Mehrwert hinzufügen - dies ist nicht der Fall.
Sven