Wie kann ich eine große scp-Dateiübertragung fortsetzen, wenn ich die Portweiterleitung verwende?


9

Ich habe ein paar Schritte von einem Computer entfernt und muss die Portweiterleitung einrichten, um Dateien übertragen zu können.

Bearbeiten: Um klar zu sein, werden mehrere Hops benötigt, um auf den Remote-Computer zuzugreifen. Von meinem Computer aus habe ich ein VPN eingerichtet, auf das ich auf 10.255.xx zugreifen kann - dies ist der einzige Computer, mit dem ich über das VPN eine Verbindung herstellen kann. Sobald ich bei .xx angemeldet bin, kann ich eine Verbindung zu anderen Computern herstellen - .yy ist einer davon.

Von meiner Maschine:

ssh -L 4567:localhost:4567 me@10.255.x.x

Dann von dieser Maschine:

ssh -L 4567:localhost:22 me@10.255.y.y

Ich kann dann

scp -P 4567 me@localhost:/path/to/large/file.gz .

Ich habe diese Übernachtung laufen lassen, nur um festzustellen, dass die Übertragung irgendwann gestorben ist.

Ich habe einige Vorschläge zur Verwendung von rsync über ssh gesehen, um die Übertragung fortzusetzen, aber ich bin mir nicht sicher, wie ich das einrichten soll. Ist das möglich?


Wofür sind all diese Hopfen? Würden Sie nicht scp me@10.255.x.x:/path/to/large/file.gz .genau das Gleiche erreichen? Welche Version von scp (ssh) ist auf Client und Server installiert?
Dennis

@Dennis: scp unterstützt die Wiederaufnahme einer Übertragung nicht - was Sie vorschlagen, startet den Download neu.
Chris

Einige Versionen tun dies (der scp meines Laptops funktioniert, der meines VPS nicht). Der Grund, den ich frage, ist, dass mir der Hopfen unnötig erscheint und das Synchronisieren ohne Hopfen viel einfacher ist.
Dennis

Diese Antwort könnte Ihnen auch helfen: unix.stackexchange.com/a/43097/14084
Bernhard

Antworten:


9

Bei einigen Versionen von scp (die Version auf dem Quellcomputer scheint der Schlüssel zu sein) reicht es aus, den Befehl scp erneut auszuführen, um die Übertragung fortzusetzen. Aber sei vorsichtig! Wenn Ihre Version keine Teilübertragungen unterstützt, wird die Teildatei einfach überschrieben.

Die folgenden rsync-Schalter sind praktisch, um eine unterbrochene Übertragung fortzusetzen, wenn scp dies nicht unterstützt:

     --append                append data onto shorter files
     --append-verify         like --append, but with old data in file checksum
 -e, --rsh=COMMAND           specify the remote shell to use
     --progress              show progress during transfer

Der Befehl

rsync --append-verify --progress --rsh="ssh -p 4567" me@localhost:/path/to/large/file.gz .

sollte den gewünschten Effekt haben. Beachten Sie, dass der -pSchalter für ssh in Kleinbuchstaben geschrieben sein muss.


Die Hops werden aufgrund der Konfiguration des Netzwerks auf dem Zielserver benötigt. Das Problem bei der Verwendung von rsync über ssh ist, dass ich den lokalen Port 4567 verwenden muss. Die Datei ist auf dem 10.255.xx-Server nicht vorhanden.
Chris

Mein Fehler. Ich nahm an, dass dies 10.255.y.yder Client-Computer war.
Dennis

Ich habe meine Antwort aktualisiert.
Dennis

und was tun, wenn rsync nicht verwendet werden kann? In meinem Fall habe ich nur FTP auf dem Remote-Host verfügbar.
dr.dimitru

@Enzo Weil, wie ich im ersten Absatz sagte, nicht alle Versionen von scp dies unterstützen. (Dies kann 5 Jahre später weniger problematisch sein.) Auch, weil ich davon ausgegangen bin, dass es dem OP mehr darum ging, den Download fortzusetzen, als ein bestimmtes Tool dafür zu verwenden.
Dennis

1

rsync verwendet standardmäßig ssh. Möglicherweise müssen Sie den genauen Befehl ssh mit dem Schalter -e von rsync angeben. Es hat auch ein --partial, das die unvollständige Datei behalten sollte, damit es die Übertragung fortsetzen kann.


1

Verwenden Sie sftp anstelle von scp

In Ihrem Fall:

sftp -a -P 4567 me@localhost:/path/to/large/file.gz .

Von der SFTP-Manpage:

-a      Attempt to continue interrupted downloads rather than overwriting existing partial or complete copies of files.  If the remote file contents differ from the partial local copy then the resultant file is likely to be corrupt.

-1

Ich kann nicht wirklich erkennen, wozu Ihre Tunnel gut sind. So würde ich Ihr Problem lösen:

ssh -R $tunnelPort:localhost:$localSSHPort $remoteUser@$remoteHost -p $remoteSSHPort

Dadurch wird ein umgekehrter Tunnel vom lokalen Computer (localhost) zum Remote-Computer (remotehost) geöffnet. $ tunnelPort ist der Port, an dem sich der Tunnel auf remotehost befindet. $ localSSHPort ist der Port, auf dem der lokale sshd ausgeführt wird, und $ remoteSSHPort ist der Ort, an dem der sshd von remotehost abgehört wird.

Jetzt, wo Sie sich im (umgekehrten!) Tunnel befinden, können Sie mehr oder weniger das tun, was Dennis vorgeschlagen hat:

rsync --apend-verify -az -e 'ssh -p $tunnelPort' /path/to/large/file $user@localhost:/destination

Die Flags -a und -z werden in der Manpage von rsync erläutert, daher werde ich nicht näher darauf eingehen. Was jetzt passiert, ist, dass wenn Sie rsync auf remotehost wie oben ausführen, alle Daten in Port $ tunnelPort übertragen werden, der dann an den sshd $ localSSHPort Ihres lokalen Hosts weitergeleitet wird.

Hoffe das hat geholfen.


@ingenous: Ich habe eine Erklärung für die Tunnel hinzugefügt.
Chris
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.