Wie kann ich scp mit teilweise kopierten Dateien fortsetzen? [geschlossen]

96

Ich benutze den Befehl scp shell, um einen riesigen Ordner mit Dateien zu kopieren.

Aber irgendwann musste ich den laufenden Befehl beenden (mit Strg + C oder töten).

Nach meinem Verständnis hat scp Dateien nacheinander kopiert, daher sollte es nur eine teilweise kopierte Datei geben.

Wie kann derselbe Befehl scp fortgesetzt werden, um erfolgreich kopierte Dateien nicht zu überschreiben und teilweise kopierte Dateien ordnungsgemäß zu behandeln?

PS Ich weiß, dass ich solche Sachen in rsync machen kann, aber scp ist aus irgendeinem Grund schneller für mich und ich benutze es stattdessen.

Bohdan
quelle
4
Ich vermute, dass rsync langsamer ist, weil es einige zusätzliche Zeit damit verbringt, Dinge zu tun, die es Ihnen ermöglichen, eine Übertragung neu zu starten. Sie können auch nur rsync verwenden, um die teilweise Übertragung abzuschließen.
Keith Thompson
2
Wenn Sie klug sein wollen, können Sie es immer ddmit einer richtigen skipVariablen versuchen und zu ssh:)
Mark Nunberg
1
Dies ist für SO kein Thema. Es gehört zu SuperUser und wurde dort tatsächlich gefragt .
Dan Dascalescu

Antworten:

182

Sie sollten rsyncüber verwendenssh

rsync -P -e ssh remoteuser@remotehost:/remote/path /local/path

Die Schlüsseloption -Pist die gleiche wie--partial --progress

Andere Optionen, z. B. -a(für den Archivierungsmodus) und -z(zum Aktivieren der Komprimierung), können ebenfalls verwendet werden.

Das Handbuch: https://download.samba.org/pub/rsync/rsync.html

jordi
quelle
43
Ich wollte nur beachten, dass rsync eine mit scp gestartete Stapelkopie wieder aufnimmt.
Craig Anderson
6
Sie erhalten "Verzeichnis überspringen". Fehler, sofern Sie nicht auch angeben -r. Quelle: lucasb.eyer.be/snips/rsync-skipping-directory.html
Artur Czajka
4
Arbeitete für mich, aber ich fügte hinzu --append auch .... rsync -P --append -e ssh remoteuser @ remotehost: / remote / path / local / path
cnd
1
@CraigAnderson das ist der wichtige Punkt, der ausgelassen wurde. Die Antwort scheint darauf hinzudeuten, dass der Download zunächst mit rsync beginnen sollte.
Willa
1
Die in der Antwort angegebenen Optionen funktionierten nicht für mich, aber dies tat:rsync -P -rsh remoteuser@remotehost:/remote/path /local/path
Bunny Rabbit
26

Eine Alternative zu rsync:

Verwendung sftpmit der Option -r(rekursiv kopiert ganze Verzeichnisse) und Option -avon sftp‚s getBefehl Teilübertragungen von vorhandenen Dateien fortzusetzen.

Voraussetzung: Ihre sftpImplementierung hat bereits eine getwith- -aOption.

Beispiel:

Kopieren Sie das Verzeichnis /foo/barvom Remote-Server in Ihr lokales aktuelles Verzeichnis. Das Verzeichnis barwird in Ihrem lokalen aktuellen Verzeichnis erstellt.

echo "get -a /foo/bar" | sftp -r server
Cyrus
quelle
4
Ihre Lösung ist großartig, da mein Server die Anmeldung in ssh nicht zulässt, sodass rsync nicht funktioniert. Ich musste hochladen statt herunterladen, also hier ist mein Befehl:echo "put -a foo/bar" | sftp -r server:/foo
Carlos Rafael Ramirez
1
Dies scheint eine sehr praktikable Option für die Wiederaufnahme teilweise heruntergeladener Dateien zu sein, da rsync nicht sehr ssh-freundlich zu sein scheint (mit nicht standardmäßigen Ports).
Codezombie
11

Seit OpenSSH 6.3 können Sie den regetBefehl in verwenden sftp.

Es hat die gleiche Syntax wie das get, außer dass eine Übertragung vom Ende einer vorhandenen lokalen Datei gestartet wird.

Martin Prikryl
quelle
6

Eine andere Möglichkeit besteht darin, zu versuchen, den SCP zu retten, den Sie bereits gestartet haben, als er blockiert.

Strg + Z zum Hintergrund und stoppen Sie es, dann ssh zum empfangenden Server und melden Sie sich an, dann beenden Sie. Nun fg den scp-Prozess und beobachte, wie er von 'festgefahren' fortgesetzt wird!

Puckfist
quelle
Arbeitete für mich unter Mac OS X. Vielen Dank für die Veröffentlichung, es hat meinen Speck heute gerettet!
Ben Hitchcock
1

Wenn rsync nach ein paar Sekunden ebenfalls blockiert, wenn es anfänglich einwandfrei läuft, habe ich die folgende Brute-Force-Lösung erhalten:

cat run_me.sh
#!/bin/bash
while [ 1 ]
do
  rsync --partial --progress --rsh=ssh user@host:/path/file.tgz file.tgz &
  TASK_PID=$!
  sleep 60
  kill $TASK_PID
  sleep 2
done
remigiusz boguszewicz
quelle
1

Sie können die -rshund -POptionen von nutzen rsync. -Pist für den teilweisen Download und -rshzeigt an, dass die Übertragung über ssh procotol erfolgt.

Der vollständige Befehl wäre: rsync -P -rsh remoteuser@remotehost:/remote/path /local/path

Häschen
quelle
-5

Ich habe gestern das gleiche Problem bekommen, als ich einen riesigen SQL-Dump über scp übertragen habe, mit dem ich Glück hatte wget --continue the_url

Dieser Blog-Beitrag erklärt es ganz gut http://www.cyberciti.biz/tips/wget-resume-broken-download.html

Arnaud Bouchot
quelle
Es wird als bewährte Methode angesehen, die relevanten Teile von einer URL in die Antwort zu kopieren, falls die Website ausfällt.
Ryre
Ich versuche hochzuladen, also kein Wget für mich.
Rolf