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 -o
Optionen zu scp
anstelle von hinzufügen .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“.
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 remotePath
Computer server2
direkt 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 -W
Option 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.
%h
und %p
sind Platzhalter für Host und Port.