Gibt es eine Befehlszeilenmethode, mit der ich überprüfen kann, ob eine heruntergeladene Datei vollständig oder fehlerhaft ist?

13

Ich schreibe ein Skript zum Herunterladen und Bearbeiten einer Datei und möchte sicherstellen, dass die Datei nicht unvollständig ist (z. B. aufgrund einer unterbrochenen Verbindung), bevor ich daran arbeite.

Clare
quelle

Antworten:

10

Die am häufigsten verwendete Methode zum Überprüfen der Integrität heruntergeladener Dateien ist die Verwendung von MD5-Prüfsummen. Dies setzt voraus, dass die Site, die Sie herunterladen, über tatsächlich veröffentlichte MD5-Prüfsummen ihrer Dateien verfügt. Sie können eine MD5-Prüfsumme überprüfen, indem Sie eine eigene Prüfsumme der heruntergeladenen Datei erstellen und diese mit der veröffentlichten Prüfsumme vergleichen. Wenn sie identisch sind, ist die heruntergeladene Datei vollständig und nicht manipuliert.

Wenn Sie nicht erwarten, dass sich die heruntergeladene Datei ändert, können Sie eine Prüfsumme vorberechnen und im Skript fest codieren. Wenn die Datei jedoch jemals aktualisiert wird, schlägt die Überprüfung fehl.

Um eine MD5-Prüfsumme einer Datei zu erstellen, führen Sie diese aus md5sum myFile. Im Fall von wget ist dieser Befehl möglicherweise hilfreich, insbesondere wenn die heruntergeladene Datei groß ist:

wget -O - http://example.com/myFile | tee myFile | md5sum > MD5SUM.

Dadurch wird beim Herunterladen eine Prüfsumme von "myFile" erstellt und in der Datei MD5SUM gespeichert, wodurch möglicherweise Zeit gespart wird.

Im Falle eines Verbindungsabbruchs ist es meiner Meinung nach am besten, die Exit-Codes von wget zu überprüfen. Wenn der Download ohne Fehler erfolgreich war, kehrt wget zurück 0. Alles andere deutet darauf hin, dass etwas schief gelaufen ist. Werfen Sie einen Blick in den Abschnitt "Status beenden" von man wget.

Arnefm
quelle
7

Der Rückkehrcode des zum Herunterladen der Datei verwendeten Befehls gibt an, ob der Befehl erfolgreich ausgeführt wurde oder nicht. In der Regel bedeutet ein Rückkehrcode von 0 Erfolg und eine Zahl ungleich Null einen Fehler. Sie können über die $?Variable auf den Rückkehrcode zugreifen .

Ein einfaches Beispiel mit wgetwürde gehen:

#!/bin/bash

wget foo.tgz &> /dev/null

if [[ "$?" != 0 ]]; then
    echo "Error downloading file"
else
    echo "Success"
fi

&> /dev/nullLeitet die gesamte Ausgabe von wget auf um, /dev/nullsodass es sich ideal für die Skripterstellung eignet, aber das Debuggen von wgetFehlern erschwert.

Bach
quelle
4
Sie könnten stattdessen tun:wget -q ... || { handle ; error ; }
mikeserv
@ mikeserv Wusste gar nicht, dass das da war, nette Geste
Creek
1
manIch habe es nur gefunden, während ich durchgelesen habe, um zu antworten, und die beiden Dinge, die ich sagen wollte, waren bereits in zwei Antworten enthalten - also habe ich zwei Kommentare abgegeben. Auch für dich eine nette Geste.
mikeserv
Ich erwarte, dass dies nicht funktioniert, wenn es mit SOCKS-Proxys wie tor verwendet wird.
CodesInChaos
1
@ Creek Was ich damit gemeint habe ist, dass wgetich denken könnte, dass der Download abgeschlossen ist, auch wenn er kaputt gegangen ist . Proxy-Informationen über unterbrochene TCP-Verbindungen im Vergleich zu geschlossenen TCP-Verbindungen, die bei HTTP problematisch sind, da standardmäßig geschlossenes TCP als Endemarkierung verwendet wird. Aus diesem Grund habe ich beim Ausführen eines Massendownloads eine Überprüfung hinzugefügt, ob die Dateigröße aus dem Header mit der heruntergeladenen Dateigröße übereinstimmt. Ich bin nicht sicher, ob wgetsolche Konsistenzprüfungen durchgeführt werden oder was in der http-Spezifikation zu diesem Problem steht.
CodesInChaos