如何通过命令行检查校验和?

时间:2014-02-22 16:22:40

标签: bash command-line

我想在我的UNIX变种

上的命令行上执行类似的操作
if (shasum httpd-2.4.7.tar.bz2 == 19asdasdasd56462e44d61a093ea57e964cf0af05c0e) echo 'good to go'

我不想写一个单独的脚本文本页面来检查这个  上面的内容显示语法错误。  但必须有一个光滑的方式来解决这个问题?

怎么做?

11 个答案:

答案 0 :(得分:13)

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

通常你会从shasum

获得这个输出
19asdasdasd56462e44d61a093ea57e964cf0af05c0e *httpd-2.4.7.tar.bz2

我的命令是采用第一个字段$1,并将其与之进行比较 你的字符串。如果字符串匹配,则awk打印出“好去”。

答案 1 :(得分:7)

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

答案 2 :(得分:4)

尝试类似:

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.

答案 3 :(得分:3)

我使用上一个/上一个命令的退出代码:

如果校验和有效,则上次执行的命令的退出代码为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

答案 4 :(得分:3)

我认为仅使用grep将是最好的方法。我想做的是

> shasum httpd-2.4.7.tar.bz2 | grep 19ed9ee56462e44d61a093ea57e964cf0af05c0e

当校验和正确时,校验和将突出显示:

Command execution snapshot

并且当校验和不正确时,什么也不显示。如果为您提供了大写的校验和,请使用grep -i <CHECKSUM>

答案 5 :(得分:2)

我做了一个bash脚本,可以防止人们不断思考它:

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 :(得分:1)

使用shasum获取哈希值,然后写test <copy-1> = <copy-2> && echo a || echo b,如果哈希值相同,你会看到a,否则b

如果你很懒,你可以放弃|| echo b部分,如果哈希值相同,你会看到a,否则什么都没有。如果你更懒惰,你甚至不能写回声并依赖command not found消息的存在与否。

答案 7 :(得分:1)

shasum <file_to_check> | diff <checksum_file> -

如果将校验和保存在文件中,则可能会容易一些 在管道的左侧,将计算文件的校验和,然后将其输送到diff以将其与校验和(由文件作者提供)进行比较。使用管道-时,stdin替换了|

答案 8 :(得分:1)

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 :(得分:0)

使用类似

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

说明:sha256sum产生校验和和文件名,用空格分隔。我们cut只能产生校验和。

答案 10 :(得分:0)

我只需要这样做,这就是我所做的:

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

某种程度上,我觉得更简单,更干净...