如果输出匹配,我想通过执行以下命令来编写一个条件。
diff -is <(echo 'curl https://get.gravitational.com/teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256') \
<(shasum -a 256 teleport-v9.3.4-linux-amd64-bin.tar.gz)
上述命令的输出如下
< 15c7fabe609513fdba95ff68ccc59f29502f32f4d20c163bd9ff47770b554d15 teleport-v9.3.4-linux-amd64-bin.tar.gz
> 15c7fabe609513fdba95ff68ccc59f29502f32f4d20c163bd9ff47770b554d15 teleport-v9.3.4-linux-amd64-bin.tar.gz
在这种情况下,由于校验和匹配,如何声明每个输出以添加到条件中。例如:如果输出 a==输出 b,则校验和匹配。如果有人能帮忙就太好了。
谢谢您的回答。我已尝试使用以下答案并能够按照我的要求执行。
答案1
我会让 shasum 使用它自己的内置“检查”选项 ( ),而不是diff
-ing*.sha256
和 的输出。shasum
shasum -c
行动中:
$ echo "This is a file" > file1
$ echo "This is another file" > file2
$ shasum -a 256 file* | tee files.sha256
0b7d91193b9c0f5cc01d40332a10cf1ed338a41640bd7f045f1087628c1d7a9b file1
0290013ed1662eda102bee144a282ffe03d226b4dd9134c251c6b3be6d69d6ec file2
$ shasum -c files.sha256
file1: OK
file2: OK
$ echo $?
0
$ echo "damaged file" > file1
$ shasum -c files.sha256
file1: FAILED
file2: OK
shasum: WARNING: 1 computed checksum did NOT match
$ echo $?
1
如果您编写此脚本,那么 shasum -c 的退出代码可以告诉您验证是否成功。
所以对于你的情况,我会:
wget https://get.gravitational.com/teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256
shasum -c teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256
rm teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256
或者
shasum -c <(curl https://get.gravitational.com/teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256)
答案2
替换 URL 和文件名后,您实际运行的命令如下:
diff -is <(echo `curl "$url"`) <(shasum -a 256 "$file")
^ ^
请注意,这是反引号echo `curl...`
,而不是您的帖子(*)中的单引号。通过不带引号的命令替换传递 的输出curl
会应用分词,为 提供两个不同的参数echo
,然后用一个空格将它们连接起来。实际上,将文件中的双倍空格更改为单倍空格。
(* 带单引号,它会输出curl https://...
,而不是作为命令运行)
看:
这也是给出任何输出的原因diff
:这些行仅在一个空格上有所不同。
如果你删除无用的命令替换并运行
diff -is <(curl "$url") <(shasum -a 256 "$file")
相反,它应该将文件识别为相同的,并用-s
, 告诉您这一点。然后,您可以直接使用退出状态,diff
而不关心打印输出:
if diff -iq <(curl "$url") <(shasum -a 256 "$file") > /dev/null; then
echo "hashes are the same"
else
echo "hashes differ"
fi
diff
虽然除了忽略大小写的功能之外你不需要那里,但我认为这是没有必要的。您可以将输出存储在 shell 变量中并比较它们:
their=$(curl "$url")
mine=$(shasum -a 256 "$file")
if [[ "$their" == "$mine" ]]; then
echo "hashes match"
else
echo "hashes do not match"
fi
或者,如果您只想将初始部分与哈希值进行比较:
their=$(curl "$url")
their=${their%% *}
mine=$(shasum -a 256 "$file")
mine=${mine%% *}
if [[ "$their" == "$mine" ]]; then
...
或者甚至是类似的东西
read -r hash1 filename1 < <(curl "$url")
etc.
将输出中的两个字段读取到单独的变量中。