Bash 如何通过命令行检查校验和?
我想在UNIX变体的命令行上执行类似的操作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 [ $
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