Muss ich nach Abschluss von scp nach Dateibeschädigungen suchen?

17

Ich habe viele Dateien und Ordner mit scpdem folgenden Befehl rekursiv übertragen :

scp -rp /source/folder [email protected]:/destination/folder

Muss ich nach Abschluss der Übertragung überprüfen, ob alle Dateien scpfehlerfrei übertragen wurden, oder muss ich mich darum kümmern (dh es wird eine Fehlermeldung angezeigt, wenn eine der Dateien nicht korrekt übertragen wurde)?

Franck Dernoncourt
quelle
Sofern Sie nicht einen Exit-Status ungleich Null von scpund eine zugehörige Fehlermeldung an stderr erhalten , hat er alles korrekt und vollständig kopiert.
Roaima
ein wenig tl; dr auf meinen post: benutze rsyncwenn du kannst. Nachdem eine Transaktion abgeschlossen wurde, werden für jede Datei Überprüfungen kopiert. Es ist daher eine gute Idee, diese zu verwenden, um ein wenig sicherer zu sein.
Polemon

Antworten:

24

scpüberprüft, ob alle von der anderen Partei gesendeten Daten kopiert wurden. Die Integrität der Übertragung wird durch das kryptografische Kanalprotokoll garantiert. Sie müssen die Integrität also nach der Übertragung nicht überprüfen. Dies wäre redundant und würde wahrscheinlich keinen Hardwarefehler erkennen, da die Daten, mit denen Sie vergleichen, wahrscheinlich aus dem Cache gelesen würden. Eine regelmäßige Überprüfung der Daten kann nützlich sein, eine Überprüfung unmittelbar nach der Übertragung ist jedoch sinnlos.

Sie müssen jedoch sicherstellen, dass scpIhnen nicht gesagt wird, dass etwas schief gelaufen ist. Es sollte eine Fehlermeldung angezeigt werden, aber der zuverlässige Indikator ist, dass scpein Exit-Code ungleich Null zurückgegeben wird, wenn ein Fehler aufgetreten ist .

Genauer gesagt, Sie wissen, dass die Datei korrekt übertragen wurde, wenn scp0 zurückgegeben wird (dh der Erfolgsstatuscode). Überprüfen Sie, ob der Beendigungsstatus 0 ist, wenn Sie einen Befehl ausführen. Wenn scpein Fehlerstatus zurückgegeben wird oder wenn er durch ein Signal getötet wird oder wenn er niemals stirbt, weil das System während des Betriebs abstürzt oder die Stromversorgung verliert, haben Sie keine Garantie. Da scpdie Datei direkt in den endgültigen Namen kopiert wird, können Sie im Falle eines Systemabsturzes eine Teildatei erhalten. Der kopierte Teil ist garantiert korrekt, die Datei wird jedoch möglicherweise abgeschnitten.

Verwenden Sie zur Erhöhung der Zuverlässigkeit rsync anstelle von scp. Sofern nicht anders angegeben, schreibt rsync in eine temporäre Datei und verschiebt sie an ihren Platz, sobald sie fertig ist. Wenn also rsync einen Erfolgscode zurückgibt, wissen Sie, dass die Datei vorhanden ist und eine korrekte, vollständige Kopie vorliegt. Wenn rsync keinen Fehlercode zurückgegeben hat, ist keine Datei vorhanden (es sei denn, es gab eine ältere Version der Datei. In diesem Fall wird diese ältere Version nicht geändert).

Gilles 'SO - hör auf böse zu sein'
quelle
3

Ich hatte noch nie ein Problem mit Korruption, nachdem ich scpetwas unternommen habe. Wenn Sie sich darüber Sorgen gemacht haben, können Sie immer md5sum <filename>auf beiden Systemen ausführen , um sicherzustellen, dass sie gleich sind.

David King
quelle
3

Nach dem Vorschlag von @ david-king handelt es sich hierbei um eine md5Lösung, mit der die Integrität von Dateien nach der Übertragung überprüft werden kann. Führen Sie den folgenden Befehl einmal nach dem cdAufrufen von /source/folderauf dem lokalen Computer und einmal nach dem cdAufrufen von /destination/folderauf dem Remotehost aus:find . -type f -print0 | xargs -0 -I {} md5sum {} | md5sum . Der resultierende Hash sollte nach einer erfolgreichen Übertragung identisch sein.

Aktualisieren: Laut dieser Antwort auf eine ähnliche Frage zu ServerFault kann scpdie Dateiintegrität nicht garantiert werden(Bitte überprüfen Sie diese Antwort von @Gilles für Details). Alternativ zur Überprüfung von Datei-Hashes rsyncnach der Übertragung können Sie Dateien übertragen und deren Rückkehrcode überprüfen.

Update 2: Im Folgenden wird nur geprüft, ob die Dateien und ihre jeweiligen Größen nach der Übertragung übereinstimmen:find . -type f -print0 | xargs -0 -I {} stat --printf="%n %s\n" {} | sort | md5sum

Mani M
quelle
2
Wenn scp 0 zurückgibt, Integrität ist garantiert. Wenn scp nicht 0 zurückgibt, ist das Problem keine generische Beschädigung, sondern ein spezifischer Kürzungsfehler. Die Überprüfung der Dateigröße ist ausreichend (es sei denn, es gab bereits eine ältere Version der Zieldatei: Wenn scp sehr früh unterbrochen wurde, ist die ältere Version möglicherweise noch vorhanden). Das Überprüfen der Prüfsummen ist hier Zeitverschwendung.
Gilles 'SO - hör auf, böse zu sein'
Messe. Ich habe meine Antwort aktualisiert.
Mani M
Sie haben den grundlegenden Fehler nicht behoben. Das Überprüfen scpdes Rückkehrcodes ist ausreichend und das Überprüfen von Hashes ist nutzlos.
Gilles 'SO- hör auf böse zu sein'
1
Auch wenn der scpWert 0 zurück es garantiert nicht , dass das Dateisystem der Dinge nicht durcheinander hat, so die Hashes Überprüfung ist immer noch nützlich , um die Integrität von sensiblen Daten zu überprüfen , ob jemand zu verwenden , wählten Sie scpüber rsync.
Mani M