계산된 체크섬이 일치하지 않는 경우 잘못된 체크섬을 표시하는 방법

계산된 체크섬이 일치하지 않는 경우 잘못된 체크섬을 표시하는 방법

다음을 사용하여 파일의 체크섬을 확인하려고 한다고 가정해 보겠습니다.

echo '760382d5e8cdc5d0d079e8f754bce1136fbe1473be24bb885669b0e38fc56aa3  emacs-26.1.tar.gz' | \
  sha256sum --check

파일이 손상되어 체크섬이 잘못된 경우 sha256sum다음 메시지가 표시됩니다.

emacs-26.1.tar.gz: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match

파일의 실제 체크섬(예: 이 오류 메시지를 발생시킨 잘못된 체크섬)을 알고 싶습니다. 내 옵션은 무엇입니까? 가능하다면 체크섬을 두 번 계산하고 싶지 않습니다(한 번은 "FAILED" 메시지를 보고 두 번째는 잘못된 체크섬을 확인함).

(운영체제: 우분투 20.04)

답변1

coreutilsGNU 구현의 소스 코드인 perlone( shasum) 또는 ast-open one( ) 을 보면 sum둘 다 확인 모드에서 계산된 합계를 출력하라는 지시가 없습니다.

이를 사용하면 perl수정이 쉽습니다.

--- shasum.orig 2021-03-27 08:01:06.927965948 +0000
+++ shasum  2021-03-27 08:02:33.336241906 +0000
@@ -295,7 +295,7 @@
            $isOK = 1;
            $num_OK++;
        }
-       else { $rsp .= "FAILED\n"; $err = 1; $match_errs++ }
+       else { $rsp .= "FAILED (expected $sum, got $digest)\n"; $err = 1; $match_errs++ }
        print $rsp unless ($status || ($quiet && $isOK));
    }
    close(FH);

그런 다음:

$ echo '760382d5e8cdc5d0d079e8f754bce1136fbe1473be24bb885669b0e38fc56aa3  a' | ./shasum -a 256 -c
a: FAILED (expected 760382d5e8cdc5d0d079e8f754bce1136fbe1473be24bb885669b0e38fc56aa3, got 3a1edb0672af06bc4712da1fcc00a09326e550d3f503ca41bf59d259f46afdc9)

답변2

다음 쉘 스크립트는 계산된 체크섬을 변수에 저장하여 이 문제를 해결합니다. 저장된 체크섬은 예상 체크섬과 비교됩니다. 원하는 경우 저장된 체크섬을 오류 메시지에 표시할 수 있습니다.

#!/bin/sh

file='emacs-26.1.tar.gz'
expected='760382d5e8cdc5d0d079e8f754bce1136fbe1473be24bb885669b0e38fc56aa3'
actual="$(sha256sum "$file" | awk '{print $1}')"

if [ "$actual" = "$expected" ]; then
    echo "${file}: OK"
else
    echo "${file}: FAILED"
    echo "Expected: $expected" >&2
    echo "Observed: $actual" >&2
    exit 1
fi

echo "${file}: OK출력 형식을 모방 sha256sum --check하고 오류 메시지 대신 Expected: ...및를 사용 합니다 .Observed: ...sha256sum --checksha256sum: WARNING: 1 computed checksum did NOT match

답변3

어쩌면 이와 같은 bash 기능이 작동할 수 있을까요?

function check {
  file="$1"
  expected="$2"

  echo "$expected  $file" | sha256sum --check
  result=$?

  if [ $result -ne 0 ]; then
    printf "Expected: %s\n" "$expected"
    printf "Observed: %s\n" $(sha256sum "$file" | awk '{print $1}')
  fi
}

다음은 데모입니다:

#!/bin/bash
function check {
  ...
}

file="emacs-26.1.tar.gz"
expected=760382d5e8cdc5d0d079e8f754bce1136fbe1473be24bb885669b0e38fc56aa3

if [ ! -e "$file" ]; then
  touch "$file"
fi

echo "This is what a mismatched file looks like"
check $file $expected


printf "\n--------------------------------------\n"
echo "This is what a matching file looks like"
expected=$(sha256sum "$file" | awk '{print $1}')
check $file $expected

산출:

This is what a mismatched file looks like
emacs-26.1.tar.gz: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match
Expected: 760382d5e8cdc5d0d079e8f754bce1136fbe1473be24bb885669b0e38fc56aa3
Observed: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

--------------------------------------
This is what a matching file looks like
emacs-26.1.tar.gz: OK

관련 정보