Esiste un metodo da riga di comando con cui posso verificare se un file scaricato è completo o danneggiato?


13

Sto scrivendo uno script che prevede il download e la manipolazione di un file e voglio assicurarmi che il file non sia incompleto (a causa, ad esempio, di una connessione interrotta) prima di lavorarci.

Risposte:


10

Il modo più comune per verificare l'integrità dei file scaricati è utilizzare i checksum MD5. Ciò presuppone che il sito che si sta scaricando dai checksum MD5 effettivamente pubblicati dei loro file. È possibile verificare un checksum MD5 creando il proprio checksum del file scaricato e confrontandolo con il checksum pubblicato. Se sono identici, il file scaricato è completo e non manomesso.

Se non ti aspetti che il file che stai scaricando cambi, puoi precompilare un checksum e codificarlo nello script, ma se il file viene mai aggiornato la verifica fallirà.

Per creare un checksum MD5 di un'esecuzione di file md5sum myFile. Nel caso di wget potresti trovare utile questo comando, specialmente se il file che stai scaricando è grande:

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

Questo creerà un checksum di "myFile" durante il download e lo salverà nel file MD5SUM, risparmiando eventualmente un po 'di tempo.

Nel caso di una connessione interrotta, penso che il modo migliore sarebbe quello di controllare i codici di uscita di wget. Se il download ha esito positivo senza errori, verrà restituito wget 0. Qualcos'altro indica che qualcosa è andato storto. Dai un'occhiata alla sezione "Stato di uscita" di man wget.



7

Il codice di ritorno del comando utilizzato per scaricare il file ti dirà se il comando è stato eseguito correttamente o meno. In genere, un codice di ritorno pari a 0 indica successo e qualsiasi numero diverso da zero indica un errore. È possibile accedere al codice di ritorno tramite la $?variabile.

Un esempio di base usando wgetsarebbe:

#!/bin/bash

wget foo.tgz &> /dev/null

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

&> /dev/nullreindirizza tutto l'output di wget, /dev/nullquindi è l'ideale per lo scripting MA rende wgetpiù difficili gli errori di debug .


4
potresti invece fare:wget -q ... || { handle ; error ; }
mikeserv

@mikeserv Non sapevo nemmeno che fosse lì, bel tocco
Creek

1
l'ho trovato solo mandurante la lettura per rispondere e le due cose che stavo per dire erano già qui in due risposte - quindi ho fatto due commenti. Bel tocco anche a te.
Mikeserv,

Mi aspetto che questo non funzioni se usato con proxy SOCKS come tor.
CodesInChaos

1
@Creek Quello che volevo dire è che wgetpotrebbe pensare che il download sia stato completato, anche se si è rotto. Inoltra informazioni su connessioni TCP interrotte e connessioni TCP chiuse, il che è problematico con HTTP poiché utilizza TCP chiuso come segno finale per impostazione predefinita. Ecco perché ho aggiunto un controllo se la dimensione del file dall'intestazione corrisponde alla dimensione del file scaricato quando ho eseguito un download di massa. Non sono sicuro se wgettali controlli di coerenza o cosa dicono le specifiche http su questo problema.
CodesInCos
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.