Как показывать прогресс при проверке контрольных сумм с помощью sha256sum

Вопрос или проблема

Как показать процесс при проверке SHA256 контрольных сумм больших файлов? Когда я выполняю sha256sum -c SHA256SUMS, где файл SHA256SUMS содержит контрольную сумму для большого файла, нет никаких указаний на то, когда команда может завершиться. Есть ли способ показать прогресс при выполнении sha256sum -c ...?

sha256sum входит в состав GNU Coreutils. У большинства из них отсутствует опция --progress или status=progress (недавние версии dd предоставляют такую опцию, но sha256sum — нет, см. git log)

Решения обходного пути:

  1. Есть progress -w (Просмотрщик Прогресса Coreutils). Его можно запустить как фоновый процесс (или во втором терминале, например, progress -w -m):

    $ progress -w & sha256sum -c Fedora-Workstation-36-1.5-x86_64-CHECKSUM.txt
    [2] 58536
    [58537] sha256sum /home/user/Downloads/Fedora-Workstation-Live-x86_64-36-1.5.iso
            20.7% (398.1 MiB / 1.9 GiB) 383.3 MiB/s осталось 0:00:03 
    

    Если вам разрешено установить его, он предоставляет то, что вы ищете. Он должен быть упакован во всех основных дистрибутивах, но обычно не установлен по умолчанию, особенно в минимальных установках.

  2. Последний вариант: pv. К сожалению, он не заменяет функциональность sha256sum -c (поскольку не поддерживает несколько файлов и не сравнивает что-то автоматически), но вы определенно можете использовать pv для передачи файла в sha256sum:

    $ pv Fedora-Workstation-Live-x86_64-35-1.2.iso | sha256sum
    159GiB 0:00:04 [ 411MiB/s] [============================>      ] 85% ETA 0:00:02
    

    По умолчанию, опции -p и -e должны быть активными (т.е. они дают вам индикатор прогресса и предполагаемое время до завершения). pv должен быть упакован для всех основных дистрибутивов и обычно устанавливается по умолчанию, даже в минимальных версиях.

Этот метод использует progress и, возможно, xterm, которые необходимо установить.

sha256sum -c SHA256SUMS & pid=$! ; xterm -e progress -mp $pid 2>/dev/null

Прогресс выводится в отдельное окно (конечно, должен быть графический рабочий стол). В противном случае

sha256sum -c SHA256SUMS & progress -mp $!

также сработает, но он перезаписывает вывод, например, подтверждение OK, которое вы хотели бы видеть (а не только быстро мигало). Таким образом, без использования отдельного окна, вместо того чтобы получать непрерывные обновления прогресса, лучше всего использовать одно единственное оценочное время, остающееся до завершения, как предложено в ответе Андреаса Хертера,

$ progress -w & sha256sum -c SHA256SUMS
[6] 9930
[ 9931] sha256sum /media/multimed-2/CD/ubuntu/22.04/ubuntustudio-22.04-dvd-amd64.iso
    5.1% (217.8 MiB / 4.1 GiB) 212.4 MiB/s осталось 0:00:18

ubuntustudio-22.04-dvd-amd64.iso: OK

Я добавил фикс через временный файл, который улучшает второй метод, чтобы избежать перезаписи вывода OK, что также полезно для файла контрольных сумм с несколькими довольно крупными файлами,

md5sum -c md5sum.txt > /tmp/mytmp & progress -mp $! ; cat /tmp/mytmp

(Этот последний фикс был проверен в моей директории с несколькими сжатыми образами файлов и соответствующими md5sums, отсюда переключение с sha256sum, но синтаксис остается тем же.)

Этот метод является обходным решением, для которого необходимо установить pv и espeak.

Это обходное решение для sha256sum -c. Сначала вам нужно извлечь соответствующую контрольную сумму из файла контрольных сумм и использовать ее в качестве второго параметра.

Вы можете пропустить espeak, если не хотите громкого предупреждения при наличии несоответствия.

Shellscript sha256check-pv:

#! /bin/bash

namesum=$(basename $0)
namesum=${namesum/check/sum}
namesum=${namesum/-pv}
#echo $namesum

if [ "$2" == "" ]
then
 echo "Используйте: $0 <файл> <$namesum>"
 exit
fi

calcsum=$(pv "$1" | "$namesum" | cut -d " " -f1)
chksum="${2,,}"

echo "вычисленная $namesum=$calcsum"
echo "должен быть  $namesum=$chksum"

if [ "$calcsum" == "$chksum" ]
then
 echo "$0 указывает на УСПЕШНУЮ загрузку :-)"
else
 echo ":-( $0 указывает на НЕУСПЕШНУЮ загрузку :-("
 espeak -p 65 -s 120 -k10 -a 150 "Загрузка не удалась" >/dev/null 2>/dev/null
fi

Примеры:

Используя корректно загруженный файл и правильную контрольную сумму:

$ sha256check-pv ubuntustudio-22.04-dvd-amd64.iso 66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a2
4,14GiB 0:00:19 [ 212MiB/s] [========================================================================>] 100%            
вычисленная sha256sum=66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a2
должен быть  sha256sum=66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a2
/home/sudodus/bin/sha256check-pv указывает на УСПЕШНУЮ загрузку :-)

и когда я изменяю последнюю цифру в контрольной сумме

$ sha256check-pv ubuntustudio-22.04-dvd-amd64.iso 66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a1
4,14GiB 0:00:19 [ 212MiB/s] [========================================================================>] 100%            
вычисленная sha256sum=66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a2
должен быть  sha256sum=66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a1
:-( /home/sudodus/bin/sha256check-pv указывает на НЕУСПЕШНУЮ загрузку :-(

Это было протестировано на MacOS 10.15.7 с использованием оболочки bash. Другие оболочки и другие версии MacOS также должны работать, но могут не сработать.

sha256sum принимает стандартный ввод, поэтому вы можете передать файл через pv или какой-либо другой фильтр для проверки прогресса:

cat some_long_file_you_want_progress_on | pv | sha256sum

Согласно странице руководства, “pv принимает множество опций, которые делятся на переключатели отображения, модификаторы вывода и общие опции.”

Поскольку переданные данные не имеют представления о том, насколько они длинные, если вы хотите получить процент завершения (вместо простой бессмысленной анимации), вам придется найти размер файла. Если вы знаете размер вашего файла, вы можете использовать переключатель “-s” для pv:

cat some_long_file_you_want_progress_on | pv -s 12345 | sha256sum

Если вы собираетесь делать это часто, вы можете сделать это функцией оболочки, чтобы она могла определить размер файла:

function sha_prog {
    cat $1 | pv -s $(du -sb $1 | awk '{print $1}') | sha256sum
}

Теперь, если вы вводите sha_prog some_long_file_you_want_progress_on, вы получите анимацию процента завершения по мере выполнения.

Это запускает конвейер с содержимым первого аргумента функции (“some_long_file_you_want_progress_on”), передает его в pv -s с размером файла (du), а затем передает его в sha256sum.

Обратите внимание, что '{print $1}' защищено одинарными кавычками, так что $1 не заменяется именем файла; фактически символы “$1” передаются в awk, который интерпретирует их как первый токен во входе, поскольку du выводит как размер файла, так и его имя в стандартный вывод.

Я протестировал это и нашел это достаточно полезным, чтобы добавить в мой ~/.bashrc, чтобы я мог легко использовать это в будущем. Существует и другие индикаторы прогресса для конвейера, которые вы также можете использовать!

Этот метод использует curl

curl может читать файлы с диска с использованием схемы URI file:///:

Shellscript check.sh:

#!/bin/sh
curl --progress-bar --output - "file://$(realpath $1)" | sha256sum | sed "s|-|$1|g"

Пример:

$ ./check.sh debian-12.7.0-mipsel-netinst.iso
################################################################################# 100.0%
9853e5ec01575da125c34ad02659378f2508b5797be718f51e9dc0d9e738c863  debian-12.7.0-mipsel-netinst.iso

$ cat SHA256SUMS
9853e5ec01575da125c34ad02659378f2508b5797be718f51e9dc0d9e738c863  debian-12.7.0-mipsel-netinst.iso

$ ./check.sh debian-12.7.0-mipsel-netinst.iso | diff SHA256SUMS - 
################################################################################# 100.0%
$ echo $?
0

Ответ или решение

Чтобы показать прогресс при проверке контрольных сумм с использованием sha256sum, вы можете воспользоваться несколькими альтернативными методами, поскольку сам sha256sum не имеет встроенной функции отображения прогресса. Вот несколько решений:

1. Использование утилиты progress

Утилита progress может помочь отслеживать процесс выполнения команды sha256sum. Вы можете запустить sha256sum в фоновом режиме и в другой консоли запустить progress, чтобы видеть прогресс:

progress -w & sha256sum -c SHA256SUMS

Если у вас установлен графический интерфейс, вы можете открывать progress в новом терминале. Этот способ особенно полезен, если вы проверяете контрольные суммы для больших файлов.

2. Использование pv (Pipe Viewer)

pv можно использовать для отображения прогресса при вычислении контрольных сумм, но для этого потребуется немного изменить ваш подход:

pv < ваш_файл.iso | sha256sum

Также можно использовать опцию -s, чтобы указать размер файла:

pv -s 4.1G < ваш_файл.iso | sha256sum

Если вы хотите создать функцию для удобства, можно добавить следующее в ваш .bashrc:

function sha_prog {
    cat $1 | pv -s $(du -sb $1 | awk '{print $1}') | sha256sum
}

Теперь вы можете использовать эту функцию для вычисления контрольной суммы с отображением прогресса:

sha_prog ваш_файл.iso

3. Использование curl

Если вы хотите также получать прогресс, можете воспользоваться curl, который поддерживает отображение прогресса:

#!/bin/sh
curl --progress-bar --output - "file://$(realpath $1)" | sha256sum | sed "s|-|$1|g"

Сохраните этот скрипт как check.sh и дайте ему права на выполнение. Затем вызовите его с файлом, для которого нужно проверить контрольную сумму:

./check.sh ваш_файл.iso

4. Исполнение в отдельном окне терминала с xterm

Если у вас есть доступ к графической среде, вы можете использовать xterm для отображения прогресса. Пример команды:

sha256sum -c SHA256SUMS & pid=$! ; xterm -e progress -mp $pid 2>/dev/null

Эта команда запустит sha256sum в фоновом режиме и будет отображать прогресс в новом окне xterm.

Заключение

Из-за того, что sha256sum не предоставляет собственного индикатора прогресса, вышеописанные методы позволяют обойти это ограничение. Убедитесь, что у вас установлены необходимые утилиты (progress, pv, curl) и используйте тот метод, который больше всего подходит вашей рабочей среде и задачам.

Оцените материал
Добавить комментарий

Капча загружается...