You know how whenever you download a file you should really compare the hash of the download to the one provided on the website? This makes absolute sense, but it's a pain to do it letter for letter, digit for digit. So, I wrote this little script to take care of the job. Any comments are welcome.
#!/bin/bash
# hash_checker - program to verify a downloaded file
error_exit()
{
echo "1ドル" 1>&2
exit 1
}
usage="usage: hash_checker downloaded_file hash_provided -a algorithm"
downloaded_file=
hash_given=
hash_calc=
algo="sha256"
# check if file and hash were provided
if [ $# -lt 2 ]; then
error_exit "$usage"
fi
# parsing the provided hash and file
downloaded_file="1ドル"
hash_given="2ドル"
# parsing the algorithm, if provided
if [ "3ドル" != "" ]; then
if [ "3ドル" = "-a" ]; then
algo="4ドル"
else
error_exit "$usage"
fi
fi
# check if input is a valid file
if [ ! -f "$downloaded_file" ]; then
error_exit "Invalid file! Aborting."
fi
# calculate the hash for the file
hash_calc="$($algo'sum' $downloaded_file)"
hash_array=($hash_calc)
hash_calc=${hash_array[0]}
# compare the calculated hash to the provided one
if [ "$hash_calc" = "$hash_given" ]; then
echo "The hashes match. File seems to be valid."
else
echo "The hashes do not match. File does not seem to be valid."
fi
1 Answer 1
Notes:
- I'd use
getopts
for arg parsing -- lots of examples on stackoverflow about how to use it. - always quote your variables
you should validate the algorithm:
sum_exe="${algo}sum" if ! type -P "$sum_exe" >/dev/null; then error_exit "'$algo' is an unknown checksum algorithm" fi
have the checksum program read from stdin, then you don't have to do your
(削除) incorrect (削除ここまで)unsafe word parsing since the program will not print a filenamehash_calc=$( "$sum_exe" < "$downloaded_file" )
As the above doesn't work, let's use
read
from a process substitutionread -r hash_calc _ < <("$sum_exe" < "$downloaded_file")
-
\$\begingroup\$ Thanks for your notes. Reading from stdin the filename is not printed, but ` -` is appended to the hash, and thus the test fails. Is there a way around that other than more word parsing? \$\endgroup\$iuvbio– iuvbio2018年09月12日 20:21:17 +00:00Commented Sep 12, 2018 at 20:21
-
\$\begingroup\$ I've updated my answer \$\endgroup\$glenn jackman– glenn jackman2018年09月12日 20:42:40 +00:00Commented Sep 12, 2018 at 20:42
-c
option tosha1sum
ormd5sum
to do the comparison? \$\endgroup\$