Gibt es eine Möglichkeit, einen unterbrochenen scp einer Datei fortzusetzen?

11

Ich lade gelegentlich eine sehr große Datei über scp herunter und es besteht jedes Mal eine geringe Wahrscheinlichkeit, dass die Verbindung unterbrochen und die Übertragung auf halbem Weg unterbrochen wird.

Gibt es eine Möglichkeit, es wieder aufzunehmen?

GJ.
quelle

Antworten:

9

Sie können folgende approch versuchen: statt scp Verwendung dd das heruntergeladene Teil zu überspringen und den Rest an die Datei anhängen.

sofar=`ls -l ./destfile | awk '{print $5}'`
ssh rsys "dd if=./srcfile bs=1 skip=$sofar" >> ./destfile

Mögliche Optimierung: Arbeiten Sie mit großen Blöcken. Lassen wir dies als Hausaufgabe.

Jahr
quelle
Ich habe dies noch nicht getestet, akzeptiere die Antwort jedoch vorläufig, da die Verwendung von dd nach einem großartigen Lösungsansatz klingt.
GJ.
Ich habe es gerade getestet, funktioniert perfekt, danke!
Kossak
@ Kosak, schön zu hören!
23.
ddmit kleinen Blockgrößen kann langsam sein (hier nur 350 kB / s). Glücklicherweise scpscheinen Übertragungen in 1024-Byte-Blöcken zu erfolgen. Wenn dies für Ihre Datei der Fall ist (oder indem Sie sie auf den nächsten 1024-Byte-Block kürzen), können Sie sie folgendermaßen beschleunigen : ssh rsys "dd if=./srcfile bs=1024 skip=$sofar" >> ./destfile. (Beachten Sie, dass $sofardann die Anzahl der 1024-Byte-Blöcke sein muss, um zu überspringen!)
Tanius
2
Es hat einige Zeit gedauert, bis mir klar wurde, dass rsysin der zweiten Zeile nur ein Beispiel für einen Hostnamen steht, für den kein spezielles Argument vorliegt ssh. Ich schlage vor, Sie ersetzen es durch user@host, um Verwirrung zu vermeiden.
Ahmed Essam
6

Mit scp, nein.

Wenn beide Enden es haben, können Sie rsync -LvzP remoteserver:path/to/file localfileeine einzelne Datei übertragen.

user1686
quelle
3

Ja, es gibt Möglichkeiten, ab dem Punkt der Unterbrechung fortzufahren, aber mit scp ist dies nicht möglich. sftp reget filenamemacht was du brauchst. Yarek und Grawity haben gültige Lösungen bereitgestellt, die I +1 für beide sind, aber für die Wiederaufnahme von einem Unterbrechungspunkt mag ich rsync. Bei den angegebenen Beispielbefehlen wird davon ausgegangen, dass Sie eine Datei von einem Remote-Server auf Ihre lokale Workstation abrufen (Herunterladen). Bitte beachten Sie, dass die letzten beiden Parameter in dieser Reihenfolge als Quelldatei und Zieldatei betrachtet werden sollten. Die Syntax des Dateinamens hängt davon ab, ob die Quell- oder Zieldatei lokal oder remote ist. Wenn ich [Text] -Dateien senden (hochladen) würde, würde ich die Beispiele wie folgt umschreiben:

# Von lokal zu remote
sofar = `ssh remote_system ls -l unterbrochene_Datei | awk '{print $ 5}' `;
dd if = source_file bs = 1 skip = $ sofar | ssh remote_system "cat >> ./interrupted_file"

Und zur rsync-Lösung füge ich hinzu -e ssh. Sie sollten überlegen, ob Sie Ausführlichkeit, Komprimierung, Beibehaltung des Eigentums, Berechtigungen, Zeitstempel, Rekursionsverzeichnisse usw. benötigen. Überprüfen Sie die Manpages und Google auf den Parameter -L. Möglicherweise möchten Sie, dass Symlinks als Links verbleiben, anstatt auf sie zu verweisen.

rsync -P -e ssh local_source_file remoteserver:path/to/interrupted_target_file

Daniel Liston
quelle
1

Es gibt eine andere Lösung (außer den hier angegebenen rsyncoder ddLösungen), von der ich überrascht bin, dass niemand sie erwähnt hat: Es ist der reputBefehl von sftp.

knocte
quelle
0
scp -o ConnectTimeout 60

Hier können Sie das Zeitlimit für eine Verbindung angeben. Kann verhindern, dass Ihre Verbindung unterbrochen wird.

user1055604
quelle
0

Ja, wenn beide Enden sftp unterstützen - nach einem scp remoteuser@remotehost:/absolute/filename .Fehler können Sie fortfahren, indem Sie den Download fortsetzen sftp remoteuser@remotehostund dann reget /absolute/filenamefortsetzen.

Jason Drane
quelle