Wie führe ich Multihop-SCP-Übertragungen zwischen Maschinen durch?

Wie führe ich Multihop-SCP-Übertragungen zwischen Maschinen durch?

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

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

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

Antwort1

Sie können -oOptionen zu scpanstelle von hinzufügen .ssh/config.

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

$jump_hostist in diesem Fall Ihr „Server B“.

Antwort2

Wenn Sie OpenSSH verwenden, fügen Sie es Ihrer SSH-Konfiguration in .ssh/config hinzu

Host distant
ProxyCommand ssh near nc distant 22

Dadurch kann SSH eine „direkte“ Verbindung mit der Maschine namens „distant“ herstellen, indem es den Proxy über die Maschine namens „near“ verwendet. Es kann dann Anwendungen wie scp und sftp für die entfernte Maschine verwenden.

Damit dies funktioniert, muss „nc“, auch bekannt als Netcat, auf der Maschine namens near installiert sein. Viele moderne Systeme verfügen jedoch bereits über diese Funktion.

Die Tar-Lösung von towo ist für einmalige Probleme effektiver, vorausgesetzt, Sie haben die Syntax und Betriebsregeln von Tar auswendig gelernt.

Antwort3

Mit aktuelleren SSH-Versionen auf dem Server in der Nähe von Maschine (B) funktioniert Folgendes ohne Netcat:

Host distant
    ProxyCommand ssh near -W distant:22

Es ist jedoch erforderlich, dass AllowTcpForwarding auf der nahegelegenen Maschine (B) auf „Ja“ (Standard) gesetzt ist.

bearbeiten: erfordert OpenSSH 5.4+ auf B

Antwort4

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

Der folgende Befehl kopiert Dateien von einem remotePathComputer server2direkt auf Ihren Computer unter localPath. Intern wird die SCP-Anforderung ü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>

Die -WOption ist in neuere(re) Versionen von OpenSSH integriert, daher funktioniert sie nur auf Maschinen mit der Mindestversion (5.4, es sei denn, Ihre Distribution hat irgendwelche Funktionen zurückportiert; RHEL6 OpenSSH 5.3p1 enthält diese Funktion beispielsweise). Laut den Versionshinweisen:http://www.openssh.com/txt/release-5.4

Ein 'Netcat-Modus' wurde zu ssh(1) hinzugefügt: "ssh -W host:port ..." Dies verbindet stdio auf dem Client mit einer einzelnen Portweiterleitung auf dem Server. Dies ermöglicht beispielsweise die Verwendung von ssh als ProxyCommand, um Verbindungen über Zwischenserver zu routen.

%hund %psind Platzhalter für Host und Port.

verwandte Informationen