Подтвердить что ты не робот

Как проверить контрольную сумму через командную строку?

Я хочу сделать что-то подобное в командной строке моего варианта UNIX

if (shasum httpd-2.4.7.tar.bz2 == 19asdasdasd56462e44d61a093ea57e964cf0af05c0e) echo 'good to go'

Я не хочу писать отдельную текстовую страницу script, чтобы проверить это.
 Это говорит о синтаксической ошибке.  Но должен быть гладкий способ обойти это?

Как это сделать?

4b9b3361

Ответ 1

shasum httpd-2.4.7.tar.bz2 |
  awk '$1=="19asdasdasd56462e44d61a093ea57e964cf0af05c0e"{print"good to go"}'

Так что обычно вы получаете этот вывод из shasum

19asdasdasd56462e44d61a093ea57e964cf0af05c0e *httpd-2.4.7.tar.bz2

Что моя команда делает, так это берет первое поле $1 и сравнивает его с твоя строка Если строки совпадают, то awk выводит "все готово".

Обратите внимание, что для всего, кроме sha-1, вам нужно указать свой алгоритм. Например, для sha 256 вы можете сделать:

shasum -a256 httpd-2.4.7.tar.bz2

Флаг -a определяет алгоритм.

Ответ 2

echo "19asdasdasd56462e44d61a093ea57e964cf0af05c0e  httpd-2.4.7.tar.bz2" \
  | shasum -c

Ответ 3

Попробуйте что-то вроде:

shasum httpd-2.4.7.tar.bz2 | 
while read -r sum _ ; do 
  [[ $sum == 19asdasdasd56462e44d61a093ea57e964cf0af05c0e ]] && echo "good" || echo "bad"
done

Оператор test заключен в [ .. ], а правильный синтаксис if; then; fi, но вы можете использовать операторы && и || для имитации.

Тест:

<~/temp>$ touch httpd-2.4.7.tar.bz2 
<~/temp>$ shasum httpd-2.4.7.tar.bz2 | while read -r sum _ ; do [[ $sum == 19asdasdasd56462e44d61a093ea57e964cf0af05c0e ]] && echo "good" || echo "bad"; done
bad
<~/temp>$ shasum httpd-2.4.7.tar.bz2 | while read -r sum _ ; do [[ $sum != 19asdasdasd56462e44d61a093ea57e964cf0af05c0e ]] && echo "good" || echo "bad"; done
good
<~/temp>$ bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.

Ответ 4

Я использую код выхода предыдущей/последней команды:

Если контрольная сумма действительна, код выхода последней выполненной команды 0:

> echo "${PROMETHEUS_CHECKSUM} prometheus-${PROMETHEUS_VERSION}.linux-arm64.tar.gz" | sha256sum -c
> echo $?                                                                                         
0

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

> export PROMETHEUS_CHECKSUM='some garbage'
> echo "${PROMETHEUS_CHECKSUM} prometheus-${PROMETHEUS_VERSION}.linux-arm64.tar.gz" | sha256sum -c
prometheus-2.0.0.linux-arm64.tar.gz: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match
> echo $?                                                                                         
1

И вот весь пример с инструкцией if:

#!/bin/bash

...

echo "${PROMETHEUS_CHECKSUM} prometheus-${PROMETHEUS_VERSION}.linux-arm64.tar.gz" | sha256sum -c

if [ $? != 0 ]; then
  echo 'Prometheus checksum is not valid'
  exit 1
fi

Ответ 5

Я сделал bash script, который защищает одного от необходимости думать об этом все время:

https://github.com/dtonhofer/muh_linux_tomfoolery/blob/master/verify_checksum.sh

Проверьте это:

verify_checksum file.tgz [SHA1, SHA256, MD5 checksum]

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

verify_checksum [SHA1, SHA256, MD5 checksum] file.tgz

... или вы можете вычислить различные контрольные суммы файла (перечисляет их все):

verify_checksum file.tgz

... или вы можете сравнить два файла:

verify_checkusm file1.tgz file2.tgz

Ответ 6

Используйте shasum для получения хэша, а затем напишите test <copy-1> = <copy-2> && echo a || echo b, вы увидите a, если хэш один и тот же, else b.

Если вы ленивы, вы можете отбросить часть || echo b, вы увидите a, если хэш один и тот же, иначе ничего. И если вы еще более ленивы, вы даже не можете писать эхо и полагаться на наличие или отсутствие сообщения command not found.

Ответ 7

shasum <file_to_check> | diff <checksum_file> -

Если вы получите контрольную сумму в файле, это может быть немного проще. Слева от канала вычисляется контрольная сумма файла и передается в diff для сравнения ее с контрольной суммой (предоставленной автором файла). - заменяет стандартный stdin когда труба | используется

Ответ 8

Версия POSIX

sha256sum httpd-2.4.7.tar.bz2 | cut -d ' ' -f 1 | grep -xq '^19asdasdasd56462e44d61a093ea57e964cf0af05c0e$'; if test $? -eq 0; then echo "good to go"; fi;

Ответ 9

Используйте что-то вроде

myhash=$(sha256sum httpd-2.4.7.tar.bz2 | cut -d' ' -f1)
if [ $myhash = "19asdasdasd56462e44d61a093ea57e964cf0af05c0e" ] ; then echo "foobar" ; fi

Объяснение: sha256sum дает как контрольную сумму, так и имя файла, разделенные пробелами. Мы можем cut получить только контрольную сумму.

Ответ 10

Мне просто нужно было сделать это, и вот что я сделал:

s='shasum myfile.dat'
a=( $s )
chk=${a[0]}
echo "The checksum is [$chk]"

Как-то мне показалось проще и чище...