Чи існує метод командного рядка, за допомогою якого я можу перевірити, чи завантажений файл повний чи зламаний?


13

Я пишу сценарій, який передбачає завантаження та маніпулювання файлом, і я хочу переконатися, що файл не є неповним (через, наприклад, перерване з'єднання), перш ніж працювати над ним.

Відповіді:


10

Найпоширеніший спосіб перевірити цілісність завантажених файлів - це використання контрольних сум MD5. Це передбачає, що сайт, який ви завантажуєте, з фактично опублікованих контрольних сум MD5 своїх файлів. Ви можете перевірити контрольну суму MD5, створивши власну контрольну суму завантаженого файлу та порівнявши його з опублікованою контрольною сумою. Якщо вони ідентичні, завантажений файл є повним і не підроблений.

Якщо ви не очікуєте, що файл, який ви завантажуєте, зміниться, ви можете попередньо обчислити контрольну суму та жорсткий код у сценарій, але якщо файл коли-небудь оновлюється, перевірка не вдасться.

Для створення контрольної суми MD5 файлу запустіть md5sum myFile. У випадку wget ця команда може бути корисною, особливо якщо файл, який ви завантажуєте, великий:

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

Це створить контрольну суму "myFile" під час завантаження та збереже її у файл MD5SUM, можливо, заощадивши якийсь час.

У випадку перерваного з'єднання, я думаю, що найкращим способом було б перевірити вихідні коди wget. У разі успішного завантаження без помилок wget повернеться 0. Все інше вказує на те, що щось пішло не так. Погляньте на розділ "Стан виходу" man wget.



7

Код повернення команди, використовуваної для завантаження файлу, підкаже, успішно виконана команда чи ні. Зазвичай зворотний код 0 позначає успіх, а будь-яке ненульове число позначає помилку. Ви можете отримати доступ до коду повернення через $?змінну.

Основний приклад використання wget:

#!/bin/bash

wget foo.tgz &> /dev/null

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

&> /dev/nullперенаправляє весь вихід wget, щоб /dev/nullвін був ідеальним для сценаріїв, АЛЕ це ускладнює wgetпомилки налагодження .


4
ви можете зробити замість цього:wget -q ... || { handle ; error ; }
mikeserv

@mikeserv Навіть не знав, що там було, приємний дотик
Creek

1
я знайшов це лише під manчас прочитання відповіді, і дві речі, про які я збирався сказати, були вже у двох відповідях - тому я зробив два коментарі. Приємного дотику і до вас.
mikeserv

Я думаю, що це не спрацює при використанні проксі-серверів SOCKS, таких як tor.
CodesInChaos

1
@Creek Що я мав на увазі, це wgetмогло б подумати, що завантаження було завершеним, навіть якщо воно зламалось. Інформація про проксі про розірвані з'єднання TCP проти закритих TCP-з'єднань, що проблематично для HTTP, оскільки він використовує закритий TCP як кінцевий знак за замовчуванням. Ось чому я додав перевірку, чи відповідає розмір файлу із заголовка розмірам завантаженого файлу, коли я запустив масове завантаження. Не впевнений, чи wgetперевіряється така узгодженість чи те, що говорить http spec у цьому питанні.
CodesInChaos
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.