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

Bash 如何通过命令行检查校验和?,bash,command-line,Bash,Command Line,我想在UNIX变体的命令行上执行类似的操作 if (shasum httpd-2.4.7.tar.bz2 == 19asdasdasd56462e44d61a093ea57e964cf0af05c0e) echo 'good to go' 我不想写一个单独的脚本文本页来检查这一点。 上面这件事显示了语法错误。 但一定有个巧妙的方法来解决这个问题 如何做到这一点?使用类似 myhash=$(sha256sum httpd-2.4.7.tar.bz2 | cut -d' ' -f1) if [ $

我想在UNIX变体的命令行上执行类似的操作

if (shasum httpd-2.4.7.tar.bz2 == 19asdasdasd56462e44d61a093ea57e964cf0af05c0e) echo 'good to go'
我不想写一个单独的脚本文本页来检查这一点。
上面这件事显示了语法错误。 但一定有个巧妙的方法来解决这个问题

如何做到这一点?

使用类似

myhash=$(sha256sum httpd-2.4.7.tar.bz2 | cut -d' ' -f1)
if [ $myhash = "19asdasdasd56462e44d61a093ea57e964cf0af05c0e" ] ; then echo "foobar" ; fi
说明:
sha256sum
生成校验和和文件名,以空格分隔。我们可以
cut
it只产生校验和

shasum httpd-2.4.7.tar.bz2 |
  awk '$1=="19asdasdasd56462e44d61a093ea57e964cf0af05c0e"{print"good to go"}'
所以通常你从shasum得到这个输出

19asdasdasd56462e44d61a093ea57e964cf0af05c0e *httpd-2.4.7.tar.bz2
-a
标志指定了算法。

尝试以下操作:

shasum httpd-2.4.7.tar.bz2 | 
while read -r sum _ ; do 
  [[ $sum == 19asdasdasd56462e44d61a093ea57e964cf0af05c0e ]] && echo "good" || echo "bad"
done
test
操作符包含在
[…]
中,正确的语法是
if;然后,;fi
但是您可以使用
&
|
操作符来模拟它

测试:
$touch httpd-2.4.7.tar.bz2
$shasum httpd-2.4.7.tar.bz2 |而read-r sum |;执行[$sum==19ASDASD56462E44D61A093EA57E964CF0AF05C0E]]并回显“好”| |回显“坏”;完成
坏的
$shasum httpd-2.4.7.tar.bz2 |而read-r sum |;执行[$sum!=19ASDASD56462E44D61A093EA57E964CF0AF05C0E]]并回显“好”|回显“坏”;完成
好的
$bash—版本
GNUBash,版本3.2.51(1)-发布版(x86_64-apple-darwin13)
版权所有(C)2007免费软件基金会。

使用shasum获取散列,然后写入
test=&echoa | | echob
,如果散列相同,您将看到
a
,否则
b


如果您很懒,可以删除
| | echo b
部分,如果散列相同,您将看到
a
,否则什么都没有。如果您更懒惰,您甚至无法编写echo,并且依赖于是否存在
命令未找到
消息。

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

echo "19asdasdasd56462e44d61a093ea57e964cf0af05c0e  httpd-2.4.7.tar.bz2" \
  | shasum -c
如果校验和有效,则最后执行的命令的退出代码为
0

> echo "${PROMETHEUS_CHECKSUM} prometheus-${PROMETHEUS_VERSION}.linux-arm64.tar.gz" | sha256sum -c
> echo $?                                                                                         
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
如果校验和不正确,则退出代码与
0
不同:

> echo "${PROMETHEUS_CHECKSUM} prometheus-${PROMETHEUS_VERSION}.linux-arm64.tar.gz" | sha256sum -c
> echo $?                                                                                         
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

我编写了一个bash脚本,可以让人不必一直思考它:

检查它:

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

…或者您可以交换参数,因为您再次忘记了文件是第一个还是最后一个:

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

…或者您可以计算文件的各种校验和(列出所有校验和):

验证校验和文件.tgz

…或者您可以比较两个文件:

验证\u checkusm file1.tgz file2.tgz
shasum | diff-

如果您在文件中获得校验和,这可能会简单一些 在管道的左侧,计算文件的校验和,并将其输送到
diff
,以将其与校验和(由文件作者提供)进行比较<代码>-在使用管道
时替换
stdin

POSIX版本

sha256sum httpd-2.4.7.tar.bz2 | cut-d'-f1 | grep-xq'^19asdasdasd56462e44d61a093ea57e964cf0af05c0e$;如果测试$-等式0;然后呼应“好去”;fi;

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

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

不知何故,对我来说似乎更简单、更干净……

简单地使用
grep
将是最好的方法:

>shasum httpd-2.4.7.tar.bz2 | grep 19ed9ee56462e44d61a093ea57e964cf0af05c0e
当校验和正确时,校验和将突出显示:


当校验和不正确时,什么也不显示。如果给您一个大写校验和,请使用
grep-i

Dude,我在意外标记附近遇到语法错误
,然后
@user1590011您确定在
bash
中执行此操作吗?对我来说,它使用的是
bash4.2.45(1)
是的,在一行中粘贴了整个内容,即使得到了错误
-bash:意外标记附近的语法错误
然后``你使用的是什么版本的bash?GNU bash,3.2版。48@user1590011我为你添加了一个测试输出。嘿,现在它对我来说非常有效。请解释您是如何做到这一点的。@user1590011没有做任何事情<代码>:)
。可能您复制的多行代码不正确。是的,很有可能,但是请帮助我在上面的脚本中这个
-r sum\uu
正在做什么。没有什么特别的。我们正在将输出读入变量和。下划线也是一个收集我们不需要的文件名的变量。对于大多数人来说可能很明显,但是对于sha256,请使用
sha256sum
。还有,对于那些想知道的人,比如我:还有。对于SHA-512算法也是
sha512sum